C语言 输出时多显示了一个数据

图片说明
图片说明
第一步输入完数据后 然后退出进行第五步输出数据时 学号输出的时候还附带了姓名(就是本来应该只输出学号却还多输出了名字) 不知道为什么?

源代码如下
#include
#include
#include
#include

int bExit = 0;
int total = 0;
#define Create(the_one) the_one=(Stu *)malloc(sizeof(Stu))
typedef
struct Student
{

char num[12];      // 数字学号
char name[20]; // 姓名
char sex[5];     // 性别
char telnum[11];    // 电话号码
struct Student *next;

}Stu;
Stu *the_one, *h, *pr,*last, *end;

//1.添加学生函数
void ADD()
{
int Four = 0;
printf("================================\n");

Create(the_one);
the_one->next = NULL;
 end = last;          //end指向倒数第二个结点

last->next = the_one;//将the_one放在链表的 最后
last = the_one;      //last指向倒数第一个结点 



//输入学号
printf("输入学生信息:\n12位学号:");

while (!Four)
{
    gets(the_one->num);
    if (strlen(the_one->num) != 12)
        printf("输入非法:学号必须是12位,请重新输入!\n学号:");
    else
        Four = 1;
}


//输入姓名
printf("学生姓名:");
gets(the_one->name);
//输入电话号码
printf("学生电话号码(11位):");
 gets(the_one->telnum);
 //请输入性别
 printf("请输入性别(填写男或女): ");
 gets(the_one->sex);

//总数+1
total++;
 printf("================================\n");

}

//2.查询学生函数
void CHECK()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要查找学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
free(target);
fond = 1;
}
}
if (!fond)
printf("Wrong Student NO.!\n");
printf("================================\n");
}
//3.编辑学生
void EDIT()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要编辑学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
printf("请选择修改项目:\n1:姓名\n2:电话号码\n");
char c;
c = getch();
switch (c)
{
case '1':
printf("输入正确的姓名:");
gets(p->name);
break;
case '2':
printf("输入最新电话号码:");
gets(p->telnum);
break;
}
printf("学号为%s的学生最新信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);

        free(target);               // ??
        fond = 1;
    }
}
if (!fond)
    printf("Not Exit This NO.!\n");
printf("================================\n");

}
//4.删除学生
void DELETE1()
{
void PRINALL();
PRINALL();
Stu *target, *p, *pr;
int fond = 0;
printf("================================\n");
printf("输入要删除学生的学号:(如果删除所有学生信息,请输入0000)\n学号:");
Create(target);
gets(target->num);

//  char *zero=&"0000";

if (!strcmp(target->num, "0000"))
{
    h->next = NULL;
    total = 0;
}
else
{

    for (pr = h, p = h->next; p; pr = pr->next, p = p->next)
    {
        if (!strcmp(p->num, target->num))
        {
            printf("学号为%s的学生信息已删除\n", p->num);
            free(target);
            pr->next = p->next;
            p->next = NULL;
            //               free(p);此句报错
            fond = 1;
            total--;
        }
    }
    if (!fond)
        printf("没有找到学号为%s的学生,请确认学号输入是否正确\n");
}
printf("================================\n");

}
//5.打印全部
void PRINALL()
{
int amounts = 1;
Stu *ap;
printf("================================\n");
printf("所有学生信息:\n");
for (ap = h->next; ap; ap = ap->next)

printf("%d,%s,%s,%s,%s\n",amounts++,ap->name,ap->num,ap->sex,ap->telnum);
printf("================================\n");
}
//6.总人数
void TOTAL()
{
printf("================================\n");
printf("学生总人数:%d\n", total);
printf("================================\n");
}

//菜单函数
void Menu()
{
char order;
printf("================================\n");
printf("| 1.添加学生. |\n");
printf("| 2.查询学生. |\n");
printf("| 3.编辑学生. |\n");
printf("| 4.删除学生. |\n");
printf("| 5.打印全部. |\n");
printf("| 6.总人数. |\n");
printf("| 7.退出. |\n");
printf("================================\n");

order = getch();
system("cls");


switch (order)
{
case '1':
    ADD();
    break;
case '2':
    CHECK();
    break;
case '3':
    EDIT();
    break;
case '4':
    DELETE1();
    break;
case '5':
    PRINALL();
    break;
case '6':
    TOTAL();
    break;
case '7':
    bExit = 1;
    break;
}
while (!bExit)
{
    getch();
    system("cls");
    Menu();
}

}
void main()
{
//创建链表头
Create(h);
pr = last = end = the_one = h;
the_one->next = NULL;

Menu();

}

1个回答

字符串长度需要比你实际用到的长度+1
比如你char num[12],学号只能11位,否则会把结尾的\0冲掉,导致和后面的姓名连成一个字符串。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言:单链表输出显示问题
各位大佬麻烦帮忙看一下,从txt文件中获取数据为链表后,想要输出显示,运行结果是-842150451 1 3 5 7 9(1 3 5 7 9为正确链表数据) 代码如下: ``` // 实验2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct LinkList { int data; struct LinkList *next; }LinkList; LinkList *createlink() { LinkList *head=(LinkList*)malloc(sizeof(LinkList)); int t; LinkList *p; LinkList *q; p=q=head; FILE *r=fopen("list1.txt","r"); if(r==NULL) { printf("could not open file"); return NULL; } while(fscanf(r,"%d",&t)!=EOF) { q=(LinkList*)malloc(sizeof(LinkList)); q->data=t; p->next=q; p=q; } p->next=NULL; return head; } int _tmain(int argc, _TCHAR* argv[]) { LinkList *p; p=createlink(); while(p) { printf("%d ",p->data); p=p->next; } //system("pause"); return 0; } ```
这是一个关于C语言指针输出的简单问题
``` #include<stdio.h> #include<stdlib.h> int main() { int *a,*b,*c; scanf("%d%d%d",a,b,c); printf("%d %d %d",*a,*b,*c); system("pause"); return 0;} ``` 我就是想用指针输入输出三个数,代码并没有报错,但是 我输入三个数后,产生错误,不能显示输出结果。我感觉好奇怪,我的理解是 a,b,c都是地址+数据,所以输入数据是没有问题的。然后*a,*b,*c表示整形数据,输出也应该是没问题的
c语言新手,scanf函数输入数据总是显示0.0000000
#include<stdio.h> int main() { int a,b; float x,y; char c1,c2; scanf("%d,%d",&a,&b); scanf("%f,%f",&x,&y); scanf("%c,%c",c1,c2); printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c",a,b,x,y,c1,c2); return 0; } 就是如图的程序,我在输入数据后(3,7,70,80,A,B)后,除了a,b正常,x和y一直输出0.000000,而c1和c2一直是c1=,,c2=e 请问各位这是哪里出了问题啊?
C语言结构输出输出有关的问题
按照下面要求定义一个时钟结构体类型: ``` struct clock { int hour; int minute; int second; }; ``` 然后,编程实现将时钟模拟显示在屏幕上。注意:时钟是24小时的。需要判断输入的数据是否合法。 输入样例1: 10,20,3 输出样例1: 10:20:03 **我写的代码是** ``` #include<stdio.h> struct clock { int hour; int minute; int second; }; int main() { struct clock c; scanf("%d/:%d/:%d",&c.hour,&c.minute,&c.second); printf("%02d:%02d:%02d",c.hour,c.minute,c.second); return 0; } ``` 但只能正确输出小时,请问为什么?![图片说明](https://img-ask.csdn.net/upload/201907/21/1563674945_846304.jpg)
C语言结构输出有关的问题
题目:按照下面要求定义一个时钟结构体类型: ``` struct clock { int hour; int minute; int second; }; 然后,编程实现将时钟模拟显示在屏幕上。注意:时钟是24小时的。需要判断输入的数据是否合法。 输入样例1: 10,20,3 输出样例1: 10:20:03 我写的程序是: ``` ``` #include<stdio.h> ``` ``` ``` ``` struct clock { int hour; int minute; int second; }; int main() { struct clock c; scanf("%d/:%d/:%d",&c.hour,&c.minute,&c.second); printf("%02d:%02d:%02d",c.hour,c.minute,c.second); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201907/20/1563633009_536936.jpg) 但输出出来只有小时是正确的,请问为什么?
帮我改C语言代码(51单片机LCD1602显示时间从k1这些按键控制变成矩阵按键控制)
帮我改C语言代码,51单片机LCD1602显示时间从k1这些按键控制变成矩阵按键控制(现在是可以用k1这些按键来修改了) 原理图: ![图片说明](https://img-ask.csdn.net/upload/201912/22/1577010044_884857.png) ![图片说明](https://img-ask.csdn.net/upload/201912/22/1577010062_997331.png) 下面是代码: ``` //下面是main.c代码 /******************************************************************************* * 实验名 : 万年历实验 * 使用的IO : * 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择 *选择设置加1。 * 注意 : *******************************************************************************/ #include<reg51.h> #include"lcd.h" #include"ds1302.h" sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3; //管脚接线 void Int0Configuration(); void LcdDisplay(); unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void main() { unsigned char i; Int0Configuration(); LcdInit(); Ds1302Init(); while(1) { if(SetState==0) { Ds1302ReadTime(); } else { if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) { SetPlace++; if(SetPlace>=7) SetPlace=0; } while((i<50)&&(K1==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } if(K2==0) //检测按键K2是否按下 { Delay10ms(); //消除抖动 if(K2==0) { TIME[SetPlace]++; if((TIME[SetPlace]&0x0f)>9) //换成BCD码。 { TIME[SetPlace]=TIME[SetPlace]+6; } if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7 { TIME[SetPlace]=1; } // if(SetPlace==5) //月只能到12 // { // TIME[SetPlace]=; // } } while((i<50)&&(K2==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } } LcdDisplay(); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : 显示函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void LcdDisplay() { LcdWriteCom(0x80+0X40); LcdWriteData('0'+TIME[2]/16); //时 LcdWriteData('0'+(TIME[2]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[1]/16); //分 LcdWriteData('0'+(TIME[1]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[0]/16); //秒 LcdWriteData('0'+(TIME[0]&0x0f)); LcdWriteCom(0x80); LcdWriteData('2'); LcdWriteData('0'); LcdWriteData('0'+TIME[6]/16); //年 LcdWriteData('0'+(TIME[6]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[4]/16); //月 LcdWriteData('0'+(TIME[4]&0x0f)); LcdWriteData('-'); LcdWriteData('0'+TIME[3]/16); //日 LcdWriteData('0'+(TIME[3]&0x0f)); LcdWriteCom(0x8D); LcdWriteData('0'+(TIME[5]&0x07)); //星期 } /******************************************************************************* * 函数名 : Int0Configuration() * 函数功能 : 配置外部中断0 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /******************************************************************************* * 函数名 : Int0() * 函数功能 : 外部中断0 中断函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Int0() interrupt 0 { Delay10ms(); if(K3==0) { SetState=~SetState; SetPlace=0; Ds1302Init(); } } /******************************************************************************* * 函数名 : Delay10ms * 函数功能 : 延时函数,延时10ms * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } //下面为ds1302.c代码 #include"ds1302.h" //---DS1302写入和读取时分秒的地址命令---// //---秒分时日月周年 最低位读写位;-------// uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---// //---存储顺序是秒分时日月周年,存储格式是用BCD码---// uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13}; /******************************************************************************* * 函 数 名 : Ds1302Write * 函数功能 : 向DS1302命令(地址+数据) * 输 入 : addr,dat * 输 出 : 无 *******************************************************************************/ void Ds1302Write(uchar addr, uchar dat) { uchar n; RST = 0; _nop_(); SCLK = 0;//先将SCLK置低电平。 _nop_(); RST = 1; //然后将RST(CE)置高电平。 _nop_(); for (n=0; n<8; n++)//开始传送八位地址命令 { DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0; _nop_(); } for (n=0; n<8; n++)//写入8位数据 { DSIO = dat & 0x01; dat >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0; _nop_(); } RST = 0;//传送数据结束 _nop_(); } /******************************************************************************* * 函 数 名 : Ds1302Read * 函数功能 : 读取一个地址的数据 * 输 入 : addr * 输 出 : dat *******************************************************************************/ uchar Ds1302Read(uchar addr) { uchar n,dat,dat1; RST = 0; _nop_(); SCLK = 0;//先将SCLK置低电平。 _nop_(); RST = 1;//然后将RST(CE)置高电平。 _nop_(); for(n=0; n<8; n++)//开始传送八位地址命令 { DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); } _nop_(); for(n=0; n<8; n++)//读取8位数据 { dat1 = DSIO;//从最低位开始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); } RST = 0; _nop_(); //以下为DS1302复位的稳定时间,必须的。 SCLK = 1; _nop_(); DSIO = 0; _nop_(); DSIO = 1; _nop_(); return dat; } /******************************************************************************* * 函 数 名 : Ds1302Init * 函数功能 : 初始化DS1302. * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds1302Init() { uchar n; Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年 { Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); } Ds1302Write(0x8E,0x80); //打开写保护功能 } /******************************************************************************* * 函 数 名 : Ds1302ReadTime * 函数功能 : 读取时钟信息 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds1302ReadTime() { uchar n; for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年 { TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); } } //下面是lcd.c代码 #include"lcd.h" /******************************************************************************* * 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 : 无 * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //误差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待数据稳定 LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能清零 LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; // Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com << 4; //发送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 数 名 : LcdWriteData * 函数功能 : 向LCD写入一个字节的数据 * 输 入 : dat * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) //写入数据 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择输入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //写入数据 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else void LcdWriteData(uchar dat) //写入数据 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = dat << 4; //写入低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 数 名 : LcdInit() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //开显示 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } #else void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } #endif ```
c语言输入数据,输出结果不换行问题
scanf输入,回车后结果显示在下一行中了。用什么可以将输入和输出结果显示在同一行呢?
用C语言编写简单学生学籍管理系统。有一段已经定义好的函数,求大佬帮忙编写完整。在线急等。求各位大佬帮帮忙,重谢!!
``` #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> typedef struct { int Id; //学号 char name[10]; //姓名 char sex[2]; //性别 int room; //宿舍号 int tel; //电话号码 } StudentInfo; //定义学生信息的结构体类型 typedef struct { int Id; char courseNo[10]; //课程编号 char courseName[20];//课程名 double a; // 课程学分 double b; // 平时成绩 double c; // 实验成绩 double d; // 卷面成绩 double e; // 综合成绩 double f; // 实际学分 } MarkInfo; //定义课程信息的结构体类型 void ReadFile(); //读取文件 void DisplayMainMenu(); //显示主菜单 void DataInput(); //数据录入 void DataQuery(); //数据查询 void DataDelete(); //数据删除 void DataSort(); //数据排序 void QueryById(int ); //按学号查询 void QueryByRoom(int ); //按宿舍查询 void QueryMark(int ); //按成绩查询 void sort1(); //按综合成绩排序 void sort2(); //按实得学分排序 void markput(); //成绩输出 StudentInfo si[30]; // 学生信息结构数组 MarkInfo mi[150]; // 学生成绩结构数组 int sp=0; // 学生信息结构数组中学生数 int mp=0; // 学生成绩结构数组中成绩数 void ReadFile( )//读取文件 { FILE *fp; if((fp = fopen("A.txt","r"))==NULL) printf("cant open the file\n"); while (!feof(fp)) { fscanf(fp,"%d%s%s%d%d",&si[sp].Id,si[sp].name,&si[sp].sex,&si[sp].room,&si[sp].tel); sp++; } fclose (fp); fp = fopen("B.txt","r"); while (!feof(fp)) { fscanf(fp,"%d%s%s%d%d%d%d",&mi[mp].Id,mi[mp].courseNo,mi[mp].courseName,&mi[mp].a,&mi[mp].b,&mi[mp].c, &mi[mp].d); if (mi[mp].c == -1) mi[mp].e = 0.3*(mi[mp].b/1.0)+0.7*(mi[mp].d/1.0); else mi[mp].e = 0.15*(mi[mp].b/1.0)+0.15*(mi[mp].c/1.0)+0.7*(mi[mp].d/1.0); if(mi[mp].e >= 90. ) mi[mp].f = mi[mp].a; else if ( mi [mp].e >= 80. ) mi[mp].f = mi[mp].a *0.8; else if ( mi[mp].e >= 70. ) mi[mp].f = mi[mp].a *0.75; else if ( mi[mp].e >= 60. ) mi[mp].f = mi[mp].a *0.6; else mi[mp].f = 0; mp++; } fclose(fp); } void DisplayMainMenu() //显示主菜单 { printf ("\n 1) 数据录入 \n 2) 数据查询 \n 3) 数据删除 \n 4) 数据排序 \n 5) 程序结束\n "); } void DataInput()//数据查询 { FILE *fp; int i; printf ("学生的学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩\n"); while(1) { scanf("%d%s%s%d%d%d%d",&mi[mp].Id,mi[mp].courseNo,mi[mp].courseName,&mi[mp].a,&mi[mp].b,&mi[mp].c, &mi[mp].d); if(mi[mp].Id==-1) break; if (mi[mp].c == -1) mi[mp].e = 0.3*mi[mp].b+0.7*mi[mp].d; else mi[mp].e = 0.15*mi[mp].b+0.15*mi[mp].c+0.7*mi[mp].d; if ( mi[mp].e >= 90. ) mi[mp].f = mi[mp].a; else if ( mi [mp].e >= 80. ) mi[mp].f = mi[mp].a *0.8; else if ( mi[mp].e >= 70. ) mi[mp].f = mi[mp].a *0.75; else if ( mi[mp].e >= 60. ) mi[mp].f = mi[mp].a *0.6; else mi[mp].f = 0; mp++; } fp = fopen("B.txt","r+"); for(i=0;i<mp;i++) { fprintf(fp,"%d%s%s%d%d%d%d",&mi[i].Id,mi[i].courseNo,mi[i].courseName,&mi[i].a,&mi[mp].b,&mi[i].c, &mi[i].d); fclose(fp); } } void DataQuery()//数据查询 { int x,y,z; printf("\n 1) 学生基本情况查询\n 2) 成绩查询\n");//--------------------------选择查询内容 scanf("%d",&x); if (x == 1) // 查询学生信息 { printf ("1) 按学号查询 2) 按宿舍查询\n");//-------------------------------选择查询方式 scanf("%d",&y); if (y == 1 ) { printf ("输入学号\n");//-----------------------------------------------按学生学号查询 scanf ("%d",&z); QueryById(z); } if (y == 2) { } if ( x ==2) // 查询成绩信息---------------------------------------查询学生成绩(输入学号) { printf ("输入学号\n"); scanf ("%d",&y); QueryMark(y); } } } void DataDelete()//数据删除 { FILE *fp; int x; int i=0; int k,d; printf( "输入学号\n"); scanf( "%d",&x); while( si[i].Id != x) i++; if (i<sp-1) { for ( k=i; k<sp-1; k++) { si[k] = si[k+1]; } } if ( i<sp) sp--; d = 0; for (k=0;k<mp;k++) { if ( mi[k].Id == x ) d++; else mi[k-d] = mi[k]; } mp = mp - d; fp = fopen("D:B.txt","r+"); for(i=0;i<mp;i++) fprintf(fp,"%d%s%s%d%d%d%d",&mi[i].Id,mi[i].courseNo,mi[i].courseName,&mi[i].a,&mi[i].b,&mi[i].c, &mi[i].d); } void sort1() { int i,j; MarkInfo t; for (i=mp-1;i>=1;i--) { for (j=0;j<i;j++) { if (mi[j].e>mi[j+1].e) { t=mi[j]; mi[j] = mi[j+1]; mi[j+1] = t; } } } markput(); } ``` 这段函数是定义好的,求大佬帮帮忙编写完! 要求:使用下面的数据,用C语言设计一个简单的学籍管理系统,实现出最基本的功能。 学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成: 学号 姓名 性别 宿舍号码 电话号码 01 张成成 男 501 87732111 02 李成华 女 101 87723112 03 王成凤 女 101 87723112 04 张明明 男 502 87734333 05 陈东 男 501 87732111 06 李果 男 502 87734333 07 张园园 女 102 87756122 … …. .. … ……….. 学生成绩基本信息文件(B.TXT)及其内容: 学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分 01 A01 大学物理 3 66 78 82 02 B03 高等数学 4 78 -1 90 01 B03 高等数学 4 45 -1 88 02 C01 VF 3 65 76 66 … …. ………. .. .. … (一) 功能要求及说明: (1) 数据录入功能: 对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。 综合成绩的计算:如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩*30%+卷面成绩*70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*.15%+卷面成绩*70% . 实得学分的计算: 采用等级学分制. 综合成绩在90-100之间 ,应得学分=学分*100% 综合成绩在80-90之间 ,应得学分=学分*80% 综合成绩在70-80之间 ,应得学分=学分*75% 综合成绩在60-70之间 ,应得学分=学分*60% 综合成绩在60以下 ,应得学分=学分*0% (2)查询功能:分为学生基本情况查询和成绩查询两种 A:学生基本情况查询: A1----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。 A2---输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。 B:成绩查询: B1:输入一个学号时,查询出此生的所有课程情况,格式如下: 学 号:xx 姓 名:xxxxx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx … … … … ……… … … 共修:xx科,实得总学分为: xxx (3)删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。 (4 ) 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
C语言对用堆导入并显示的数据进行进一步的处理
原题目:求转录RNA组的平均值与标准差(英文翻译过来的) 附加条件:给了一个200多M的文件(数据,可以以txt,csv等形式打开 ) 拿到题目以后解读数据就费了好长时间,数据中的名称全是英文,看了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc可是完全不知道引入文件后怎么将其导入数组内,试着将网上的程序拼接结果不行。////这时得到了堆空间这个名词,紧接着直接搜出了导入csv文件的相关代码(这里解释一下,这是大学老师布置的一道题,老师只教了我们谭浩强的红皮书就出这样的题目。。。老师也跟我们说了考验我们获取信息的能力。。。只是交作业不算抄袭吧?),就直接粘上了,然后逐行的读懂了这个程序,能够很顺利的用运行显示出所有数据,但是我想进一步做的时候发现自己需要将没一行数据单独进行运算,而这个程序是检测后直接一个个的将一整行显示了,所以我不知道该怎么进行下一步的数据处理。(其实这个程序的核心部分我也只是知道单独行的意思,整体的功能实现并不是太确定)求哪位好心人帮忙给讲一下怎么对导入的数据进行处理。自己的水平实在是不够了。 谢谢了。 #include <stdio.h> #include <stdlib.h> #include <string.h> int getFilelen(FILE * file)//2.2.0----getfile...函数---- 主要是做逐行读取功能并记录行数 { int len = 0;//2.2.1---定义了一个len=0其意义暂时不知---- if (file == NULL) { return -1;//2.2.2如果文件为空(或不存在??????????)直接结束 } char buf[1024];//2.2.3定义一个大小为1024的一维数组(1024有无特殊含义???????) //读取每一行 while (fgets(buf, 1024, file) != NULL)//2.2.4---- 将fp中的内容按1024字节大小读入text中,然后输出。直到读到fp的末尾,为空了。停止读取,然后关闭文件。 -----解释了1024的问题 { len++; //printf("%d ",len); } //设置光标 fseek(file, 0, SEEK_SET);//2.2.5---函数。。。跳到 ---错了。。。 意思是把文件指针指向文件的开头 return len;//2.2.6----返回len----此时回到77行继续运行程序 } void readFileData(FILE * file, int len, char ** pArray) //2.3.1文件指针 长度 堆区数组----read为函数名的函数,其意义因该为读取吧 ---读取到数组??? { if (file == NULL || len <= 0 || pArray == NULL)//2.3.2--如果存在什么不合理的情况,直接结束 { return; } char buf[1024]; //读取每一行 int index = 0; while (fgets(buf, 1024, file) != NULL)//同14行 { int currentlen = strlen(buf) + 1;//strlen() 这个函数是返回一个字符串中的字符个数,不包括结束符 '\0'; char * currenP = (char *)malloc(sizeof(char) * currentlen); strcpy(currenP, buf);//复制BUF ,buf包含整个数据库?? pArray[index++] = currenP;//将buf放进数组??? // printf("%d ",pArray[index++] ); memset(buf, 0, 1024);// 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值----转换为ascii之后方便计算?---- }//回79行 } void showFileData(char ** pArray, int len)//以show为开头的函数,其意义因该为展示,显示吧----- { for (int i = 0; i < len; i++) { int qwe=i; printf("第%d行内容:%s\n", i+1, pArray[i]);//证实parray实际上包含了数据库 // printf("第%d行数据:%s\n",i+1,pArray[qwe+1]); } }//回80行 void freeSpace(char ** pArray, int len)//不用想了,释放空间,翻译一下就出来了 { if (pArray == NULL || len == NULL) { return; } for (int i = 0; i < len; i++) { if (pArray[i] != NULL) { free(pArray[i]); pArray[i] = NULL; } } }//回81行 int test01()//2.1.0----test01函数,整个程序的主体部分(之后的\n和system只是辅助,显示的好看一些,没有什么意义) -----此函数意义仍为一个目录,具体操作在其他函数中 { FILE * file = fopen("transcript_rna_tissue.csv", "r");//2.1.1打开文件,如果不存在或者打不开的话输出72内容,结束程序。 if (file == NULL) { printf("打开文件失败!\n"); return 0; } int len= getFilelen(file);//2.1.2----定义(调用)函数get...-----程序跳转至第5行 char ** pArray = (char **)malloc(sizeof(char *) * len);//2.2.0---定义一个符合文件大小要求的堆空间????? readFileData(file, len, pArray);//2.3.0---函数,跳到25行 -----------去掉这一行数据显示为 第i行数据:(null) showFileData(pArray, len);//到45行 ----------去掉程序不再运行 freeSpace(pArray, len);//到52行 -----可以去掉,不影响显示 pArray = NULL;//将PARRAY定回空----回87行 } int main()//1.0.0--定义主函数,程序的真正开端 { test01();//2.0.0--调用函数 test01-----程序跳转到第67行 putchar('\n'); system("pause"); }//结束
用vs2010编辑c语言,怎么显示
输入一个小写字母,输出一个大写字母?求解?为什么有时候会丢失数据?
输入10个数,存入变量BUF中,如何将每个单元的数据以ASCII码形式显示出来?
从键盘输入10个数,存入变量BUF中,将每个单元的数据以ASCII码形式显示出来:例如,某单元数据为18(12H),则显示31H(数字1的ASCII码)、32H(数字2的ASCII码)。要求: (1)输入10个数用子程序实现 (2)转换功能(二位16进制数转换为ASCII码)用子程序实现 (3)显示功能(显示各个ASCII码)用子程序实现 (4)主程序循环调用子程序实现转换和显示 ``` DATA SEGMENT BUF DB 10 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,BUF CALL INPUT MOV CX,10 SSS:CALL TRANS CALL OUTPUT INC SI LOOP SSS MOV AH,4CH INT 21H INPUT PROC MOV CX,10 L0: MOV AH,01H INT 21H CMP AL,'0' JB L0 CMP AL,'9' JA L1 SUB AL,30H MOV [SI],AL JMP L2 L1: CMP AL,'A' JB L0 CMP AL,'F' JA L0 SUB AL,37H MOV [SI],AL L2: INC SI LOOP L0 RET INPUT ENDP TRANS PROC PUSH CX LEA SI,BUF MOV AL,[SI] MOV BL,AL MOV CL,4 SHR BL,CL CMP BL,9 JBE L3 ADD BL,7H L3: ADD BL,30H AND AL,0FH CMP AL,9 JBE L4 ADD AL,7H L4: ADD AL,30H POP CX RET TRANS ENDP OUTPUT PROC PUSH CX MOV CL,4 MOV DL,BL MOV BH,BL SHR DL,CL CMP DL,9 JBE L5 ADD DL,7H L5: ADD DL,30H MOV AH,02H INT 21H AND BH,0FH CMP BH,9 JBE L6 ADD BH,7H L6: ADD BH,30H MOV DL,BH MOV AH,02H INT 21H MOV CH,AL MOV DH,AL SHR CH,CL CMP CH,9 JBE L7 ADD CH,7H L7: ADD CH,30H MOV DL,CH MOV AH,02H INT 21H AND DH,0FH CMP DH,9 JBE L8 ADD DH,7H L8: ADD DH,30H MOV DL,DH MOV AH,02H INT 21H POP CX RET OUTPUT ENDP CODE ENDS END START ``` 为什么无论输入哪十个数,都输出3030303030303030303030303030303030303030? 如何修改? ![图片说明](https://img-ask.csdn.net/upload/201911/27/1574784307_821127.png)
fprintf输出到文本之后会有一串代码结束。
**论坛也发了贴,根据他的回答我改了我的程序,然而运行完一遍之后还是一样有一串不明代码,codeblocks也不报警告了。我把我完整的程序放上来,大概有500行,每个功能用完之后都会出现这个问题,我必须吧乱码删了才能继续下一个功能。网友告诉我函数后面要加return ;但是我试了下发现程序直接结束了,不会再跳到主函数,所以我只能用main()来进行返回主菜单的功能** ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576131963_428559.png) ``` #include<stdio.h> #include<stdlib.h> #include<string.h> struct course { int num; /*课程编号*/ char name[30]; /*课程名称*/ char kind[20]; /*课程性质*/ int time; /*课时*/ int mark; /*学分*/ int term; /*1为考试2为考察*/ int opterm; /*开课学期*/ }; typedef struct Node /*创建头结点*/ { struct course d; struct Node *next; }Node; /*课程插入*/ void insert() { FILE *fp1; int g=1,key=0,key1=0,f=0; int a=0,b=0; if((fp1=fopen("course.txt","r"))==NULL) { printf("can't open file\n"); exit(0); } Node *first=(Node *)malloc(sizeof(Node)); /*头指针初始化*/ first->next=0; for(;!feof(fp1);) { Node *s=(Node*)malloc(sizeof(Node)); fscanf(fp1,"%d%s%s%d%d%d%d",&s->d.num,s->d.name,s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm); s->next=first->next; first->next=s; } for(;g==1;) { printf("请输入需要插入的课程信息:\n课程编号,课程名称,课程性质,课时,学分,1为考试2为考察,开课学期\n"); Node *e=(Node*)malloc(sizeof(Node)); scanf("%d%s%s%d%d%d%d",&e->d.num,e->d.name,e->d.kind,&e->d.time,&e->d.mark,&e->d.term,&e->d.opterm); e->next=first->next; first->next=e; printf("是否继续输入?1为是,2为否\n"); key=0; while(key==0){ scanf("%d",&g); if(g==1||g==2) key=1; else {printf("\n输入错误,请重新输入!!!\n"); printf("是否继续输入?1为是,2为否\n");} } } fclose(fp1); printf("是否存盘??1为是2为否\n"); while(key1==0){ scanf("%d",&f); if(f==1||f==2) key1=1; else printf("\n输入错误,请重新输入!!!\n"); } if(f==1) { if((fp1=fopen("course.txt","w"))==NULL) { printf("can't open file\n"); exit(0); } Node *p=first->next; while(p!=0){ fprintf(fp1,"%5d%12s%9s%9d%9d%11d%11d\n",p->d.num,p->d.name,p->d.kind,p->d.time,p->d.mark,p->d.term,p->d.opterm); p=p->next; } } printf("录入完毕\n"); Node *k=first; while(first!=0){ first=first->next; free(k); k=first; } fclose(fp1); while(b==0){ printf("\n1-返回主菜单;2-退出系统\n"); scanf("%d",&a); if(a==1||a==2) b=1; else printf("\n输入错误,请重新输入!!!\n"); } if(a==1) return main(); else exit(0); } /*课程浏览ok的,从文本文件中输入数据浏览*/ void browser() { FILE *fp2; struct course c; int a=0,b=0; if((fp2=fopen("course.txt","r"))==NULL) { printf("\ncan't open course!\n"); exit(0); } printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); while(!feof(fp2)) { fscanf(fp2,"%d%s%s%d%d%d%d",&c.num,c.name,c.kind,&c.time,&c.mark,&c.term,&c.opterm); printf("%5d%12s%9s%9d%9d%11d%11d\n",c.num,c.name,c.kind,c.time,c.mark,c.term,c.opterm); } fclose(fp2); printf("\n结果已全部显示!!!!\n"); while(b==0){ printf("\n1-返回主菜单;2-退出系统\n"); scanf("%d",&a); if(a==1||a==2) b=1; else printf("\n输入错误,请重新输入!!!\n"); } if(a==1) return main(); else exit(0); } /*课程查询ok的,从文本文件中输入数据判断查询*/ void search() { FILE *fp3; struct course c; int score; char kind[10]; int b=0,e=0,a=0,d=0; while(e==0){ printf("1.按课程编号查询,2.按课程名称查询.\n"); printf("请选择查询方式并输入选项数字:"); scanf("%d",&b); if(b==1||b==2) e=1; else printf("\n输入错误,请重新输入!!!\n"); } if(b==1) { printf("\n请输入您要查询的课程编号:\n"); scanf("%d",&score); if((fp3=fopen("course.txt","r"))==NULL) { printf("\nCannot open course!\n"); exit(0); } printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); for(;!feof(fp3);) { fscanf(fp3,"%d%s%s%d%d%d%d\n",&c.num,c.name,c.kind,&c.time,&c.mark,&c.term,&c.opterm); if(c.mark==score) printf("%5d%12s%9s%9d%9d%11d%11d\n",c.num,c.name,c.kind,c.time,c.mark,c.term,c.opterm); } } else {printf("\n请输入您要查询的课程名称:\n"); scanf("%s",kind); if((fp3=fopen("course.txt","r"))==NULL) { printf("\nCannot open course!\n"); exit(0); } printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); for(;!feof(fp3);) { fscanf(fp3,"%d%s%s%d%d%d%d\n",&c.num,c.name,c.kind,&c.time,&c.mark,&c.term,&c.opterm); if(strcmp(c.kind,kind)==0) printf("%5d%12s%9s%9d%9d%11d%11d\n",c.num,c.name,c.kind,c.time,c.mark,c.term,c.opterm); } } fclose(fp3); printf("\n结果已全部显示!!!!\n"); while(d==0){ printf("\n1-返回主菜单;2-退出系统\n"); scanf("%d",&a); if(a==1||a==2) d=1; else printf("\n输入错误,请重新输入!!!\n"); } if(a==1) return main(); else exit(0); } /*课程修改*/ void revise()/*修改函数的名字*/ { int a=0,b=0; int h,f; int key1=0; FILE *fp4; if((fp4=fopen("course.txt","r"))==NULL) { printf("\nCannot open course!\n"); exit(0); } Node *first=(Node *)malloc(sizeof(Node)); /*头指针初始化*/ first->next=0; /*工作指针*/ for(;!feof(fp4);) { Node *s=(Node*)malloc(sizeof(Node)); fscanf(fp4,"%d%s%s%d%d%d%d",&s->d.num,s->d.name,s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm); s->next=first->next; first->next=s; } printf("请输入需要修改的课程编号\n"); scanf("%d",&h); Node *p=first->next; while(p!=0){ if(h==p->d.num) { printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); printf("%5d%12s%9s%9d%9d%11d%11d\n",p->d.num,p->d.name,p->d.kind,p->d.time,p->d.mark,p->d.term,p->d.opterm); printf("请输入替换的正确的课程信息\n"); scanf("%d%s%s%d%d%d%d",&p->d.num,p->d.name,p->d.kind,&p->d.time,&p->d.mark,&p->d.term,&p->d.opterm); } else ; p=p->next; } printf("是否存盘??1为是2为否\n"); while(key1==0){ scanf("%d",&f); if(f==1||f==2) key1=1; else printf("\n输入错误,请重新输入!!!\n"); } if(f==1) { fclose(fp4); if((fp4=fopen("course.txt","w"))==NULL) { printf("can't open file\n"); exit(0); } Node *p1=first->next; while(p1!=0){ fprintf(fp4,"%5d%12s%9s%9d%9d%11d%11d\n",p1->d.num,p1->d.name,p1->d.kind,p1->d.time,p1->d.mark,p1->d.term,p1->d.opterm); p1=p1->next; } } printf("修改完毕\n"); Node *k=first; while(first!=0){ first=first->next; free(k); k=first; } fclose(fp4); while(b==0){ printf("\n1-返回主菜单;2-退出系统\n"); scanf("%d",&a); if(a==1||a==2) b=1; else printf("\n输入错误,请重新输入!!!\n"); } if(a==1) return main(); else exit(0); } /*课程删除*/ void delet() { int a=0,b=0; int h; FILE *fp; printf("请输入需要删除的课程编号\n"); scanf("%d",&h); if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannot open course!\n"); exit(0); } Node *first=(Node *)malloc(sizeof(Node)); /*头指针初始化*/ first->next=0; /*工作指针指向头结点*/ for(;!feof(fp);) { Node *s=(Node*)malloc(sizeof(Node)); fscanf(fp,"%d%s%s%d%d%d%d",&s->d.num,s->d.name,s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm); s->next=first->next; first->next=s; } Node *p1=first;Node *p2=first;Node *p3=first; int count=0,dele=0,obey=0; printf("请输入需要删除的课程编号\n"); scanf("%d",&dele); for(;p1->next==0;) { if(p1->d.num==dele) { count++; printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); printf("%5d%12s%9s%9d%9d%11d%11d\n",p1->d.num,p1->d.name,p1->d.kind,p1->d.time,p1->d.mark,p1->d.term,p1->d.opterm); printf("请确认是否删除???1-是,2-否\n"); scanf("%d",&obey); if(obey==1) { p2->next=p1->next; free(p1); printf("删除成功!!!!\n"); } else; } else; p2=p1; p1=p1->next; } while(p1!=0){ fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d\n",p3->d.num,p3->d.name,p3->d.kind,p3->d.time,p3->d.mark,p3->d.term,p3->d.opterm); p3=p3->next; } while(b==0){ printf("\n1-返回主菜单;2-退出系统\n"); scanf("%d",&a); if(a==1||a==2) b=1; else printf("\n输入错误,请重新输入!!!\n"); } if(a==1) return main(); else exit(0); } /*统计选课情况*/ void statistics() { int a; FILE *fp; if((fp=fopen("course.txt","r"))==NULL) { printf("\nCannot open course!\n"); exit(0); } Node *first=(Node *)malloc(sizeof(Node)); /*头指针初始化*/ first->next=0; for(;!feof(fp);) { Node *s=(Node*)malloc(sizeof(Node)); fscanf(fp,"%d%s%s%d%d%d%d",&s->d.num,s->d.name,s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm); s->next=first->next; first->next=s; } Node *e=first->next; int count1,count2,count3,count4; for(;e==0;) { if(e->d.opterm==1) count1++; else if(e->d.opterm==2) count2++; else if(e->d.opterm==3) count3++; else if(e->d.opterm==4) count4++; else printf("课程编号 课程名称 课程性质 总学时 学分 考试课1或考察课2 开课学期:\n"); printf("%5d%12s%9s%9d%9d%11d%11d\n",e->d.num,e->d.name,e->d.kind,e->d.time,e->d.mark,e->d.term,e->d.opterm); e=e->next; } printf("开课学期为1的有%d门,开课学期为2的有%d门,开课学期为3的有%d门,开课学期为4的有%d门\n",count1,count2,count3,count4); Node *k=first; while(first!=0){ first=first->next; free(k); k=first; } fclose(fp); printf("\n1-返回主菜单;2-退出选课系统\n"); scanf("%d",&a); if(a==1) return main(); else exit(0); } /*主菜单*/ void main() { int n,w; printf("*********************************************************************************\n"); printf(" 学生选课系统菜单\n"); printf("*********************************************************************************\n"); printf(" 1-录入\n"); printf(" 2-浏览\n"); printf(" 3-查询\n"); printf(" 4-修改\n"); printf(" 5-删除\n"); printf(" 6-统计\n"); printf(" 0-退出\n"); printf("*********************************************************************************\n"); printf(" 请输入选项前的数字\n"); scanf("%d",&n); do { if(n>5||n<0) { printf("\n输入错误\n"); scanf("%d",&n); } else w=1; }while(w==0); switch(n) { case 1:insert();break; case 2:browser();break; case 3:search();break; case 4:revise();break; case 5:statistics();break; case 6:delet();break; case 0:exit(0); } } ```
tracert程序编译成功运行后,无法正常发送接收包,输出结果只有123456789101112131415161718192021222324252627282930,不显示详细情况,单步运行后发现接收发送包的部分没执行
![图片说明](https://img-ask.csdn.net/upload/201911/30/1575117089_191288.jpg) #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> using namespace std; #pragma comment(lib, "Ws2_32.lib") //IP报头 typedef struct IP_HEADER { unsigned char hdr_len:4; //4位头部长度 unsigned char version:4; //4位版本号 unsigned char tos; //8位服务类型 unsigned short total_len; //16位总长度 unsigned short identifier; //16位标识符 unsigned short frag_and_flags; //3位标志加13位片偏移 unsigned char ttl; //8位生存时间 unsigned char protocol; //8位上层协议号 unsigned short checksum; //16位校验和 unsigned long sourceIP; //32位源IP地址 unsigned long destIP; //32位目的IP地址 } IP_HEADER; //ICMP报头 typedef struct ICMP_HEADER { BYTE type; //8位类型字段 BYTE code; //8位代码字段 USHORT cksum; //16位校验和 USHORT id; //16位标识符 USHORT seq; //16位序列号 } ICMP_HEADER; //报文解码结构 typedef struct DECODE_RESULT { USHORT usSeqNo; //序列号 DWORD dwRoundTripTime; //往返时间 in_addr dwIPaddr; //返回报文的IP地址 }DECODE_RESULT; //计算网际校验和函数 USHORT checksum( USHORT *pBuf, int iSize ) { unsigned long cksum = 0; while( iSize > 1 ) { cksum += *pBuf++; iSize -= sizeof(USHORT); } if( iSize )//如果 iSize 为正,即为奇数个字节 { cksum += *(UCHAR *)pBuf; //则在末尾补上一个字节,使之有偶数个字节 } cksum = ( cksum >> 16 ) + ( cksum&0xffff ); cksum += ( cksum >> 16 ); return (USHORT)( ~cksum ); } //对数据包进行解码 BOOL DecodeIcmpResponse(char * pBuf, int iPacketSize, DECODE_RESULT &DecodeResult, BYTE ICMP_ECHO_REPLY, BYTE ICMP_TIMEOUT) { //检查数据报大小的合法性 IP_HEADER* pIpHdr = ( IP_HEADER* )pBuf; int iIpHdrLen = pIpHdr->hdr_len * 4; //ip报头的长度是以4字节为单位的 //若数据包大小 小于 IP报头 + ICMP报头,则数据报大小不合法 if ( iPacketSize < ( int )( iIpHdrLen + sizeof( ICMP_HEADER ) ) ) return FALSE; //根据ICMP报文类型提取ID字段和序列号字段 ICMP_HEADER *pIcmpHdr = ( ICMP_HEADER * )( pBuf + iIpHdrLen );//ICMP报头 = 接收到的缓冲数据 + IP报头 USHORT usID, usSquNo; if( pIcmpHdr->type == ICMP_ECHO_REPLY ) //ICMP回显应答报文 { usID = pIcmpHdr->id; //报文ID usSquNo = pIcmpHdr->seq; //报文序列号 } else if( pIcmpHdr->type == ICMP_TIMEOUT )//ICMP超时差错报文 { char * pInnerIpHdr = pBuf + iIpHdrLen + sizeof( ICMP_HEADER ); //载荷中的IP头 int iInnerIPHdrLen = ( ( IP_HEADER * )pInnerIpHdr )->hdr_len * 4; //载荷中的IP头长 ICMP_HEADER * pInnerIcmpHdr = ( ICMP_HEADER * )( pInnerIpHdr + iInnerIPHdrLen );//载荷中的ICMP头 usID = pInnerIcmpHdr->id; //报文ID usSquNo = pInnerIcmpHdr->seq; //序列号 } else { return false; } //检查ID和序列号以确定收到期待数据报 if( usID != ( USHORT )GetCurrentProcessId() || usSquNo != DecodeResult.usSeqNo ) { return false; } //记录IP地址并计算往返时间 DecodeResult.dwIPaddr.s_addr = pIpHdr->sourceIP; DecodeResult.dwRoundTripTime = GetTickCount() - DecodeResult.dwRoundTripTime; //处理正确收到的ICMP数据报 if ( pIcmpHdr->type == ICMP_ECHO_REPLY || pIcmpHdr->type == ICMP_TIMEOUT ) { //输出往返时间信息 if(DecodeResult.dwRoundTripTime) cout<<" "<<DecodeResult.dwRoundTripTime<<"ms"<<flush; else cout<<" "<<"<1ms"<<flush; } return true; } void main() { //初始化Windows sockets网络环境 WSADATA wsa; WSAStartup( MAKEWORD(2,2), &wsa ); char IpAddress[255]; cout<<"请输入一个IP地址或域名:"; cin>>IpAddress; //得到IP地址 u_long ulDestIP = inet_addr( IpAddress ); //转换不成功时按域名解析 if( ulDestIP == INADDR_NONE ) { hostent * pHostent = gethostbyname( IpAddress ); if( pHostent ) { ulDestIP = ( *( in_addr* )pHostent->h_addr).s_addr; } else { cout<<"输入的IP地址或域名无效!"<<endl; WSACleanup(); return; } } cout<<"Tracing roote to "<<IpAddress<<" with a maximum of 30 hops.\n"<<endl; //填充目的端socket地址 sockaddr_in destSockAddr; ZeroMemory( &destSockAddr, sizeof( sockaddr_in ) ); destSockAddr.sin_family = AF_INET; destSockAddr.sin_addr.s_addr = ulDestIP; //创建原始套接字 SOCKET sockRaw = WSASocket( AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED ); //超时时间 int iTimeout = 3000; //设置接收超时时间 setsockopt( sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *)&iTimeout, sizeof( iTimeout ) ); //设置发送超时时间 setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeout,sizeof(iTimeout)); //构造ICMP回显请求消息,并以TTL递增的顺序发送报文 //ICMP类型字段 const BYTE ICMP_ECHO_REQUEST = 8; //请求回显 const BYTE ICMP_ECHO_REPLY = 0; //回显应答 const BYTE ICMP_TIMEOUT = 11; //传输超时 //其他常量定义 const int DEF_ICMP_DATA_SIZE = 32; //ICMP报文默认数据字段长度 const int MAX_ICMP_PACKET_SIZE = 1024; //ICMP报文最大长度(包括报头) const DWORD DEF_ICMP_TIMEOUT = 3000; //回显应答超时时间 const int DEF_MAX_HOP = 30; //最大跳站数 //填充ICMP报文中每次发送时不变的字段 char IcmpSendBuf[ sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ];//发送缓冲区 memset( IcmpSendBuf, 0, sizeof( IcmpSendBuf ) ); //初始化发送缓冲区 char IcmpRecvBuf[ MAX_ICMP_PACKET_SIZE ]; //接收缓冲区 memset( IcmpRecvBuf, 0, sizeof( IcmpRecvBuf ) ); //初始化接收缓冲区 ICMP_HEADER * pIcmpHeader = ( ICMP_HEADER* )IcmpSendBuf; pIcmpHeader->type = ICMP_ECHO_REQUEST; //类型为请求回显 pIcmpHeader->code = 0; //代码字段为0 pIcmpHeader->id = (USHORT)GetCurrentProcessId(); //ID字段为当前进程号 memset( IcmpSendBuf + sizeof( ICMP_HEADER ), 'E', DEF_ICMP_DATA_SIZE );//数据字段 USHORT usSeqNo = 0; //ICMP报文序列号 int iTTL = 1; //TTL初始值为1 BOOL bReachDestHost = FALSE; //循环退出标志 int iMaxHot = DEF_MAX_HOP; //循环的最大次数 DECODE_RESULT DecodeResult; //传递给报文解码函数的结构化参数 while( !bReachDestHost && iMaxHot-- ) { //设置IP报头的TTL字段 setsockopt( sockRaw, IPPROTO_IP, IP_TTL, (char *)&iTTL, sizeof(iTTL) ); cout<<iTTL<<flush; //输出当前序号,flush表示将缓冲区的内容马上送进cout,把输出缓冲区刷新 //填充ICMP报文中每次发送变化的字段 ((ICMP_HEADER *)IcmpSendBuf)->cksum = 0; //校验和先置为0 ((ICMP_HEADER *)IcmpSendBuf)->seq = htons(usSeqNo++); //填充序列号 ((ICMP_HEADER *)IcmpSendBuf)->cksum = checksum( ( USHORT * )IcmpSendBuf, sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ); //计算校验和 //记录序列号和当前时间 DecodeResult.usSeqNo = ( ( ICMP_HEADER* )IcmpSendBuf )->seq; //当前序号 DecodeResult.dwRoundTripTime = GetTickCount(); //当前时间 //发送TCP回显请求信息 sendto( sockRaw, IcmpSendBuf, sizeof(IcmpSendBuf), 0, (sockaddr*)&destSockAddr, sizeof(destSockAddr) ); //接收ICMP差错报文并进行解析处理 sockaddr_in from; //对端socket地址 int iFromLen = sizeof(from);//地址结构大小 int iReadDataLen; //接收数据长度 while(1) { //接收数据 iReadDataLen = recvfrom( sockRaw, IcmpRecvBuf, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*)&from, &iFromLen ); if( iReadDataLen != SOCKET_ERROR )//有数据到达 { //对数据包进行解码 if(DecodeIcmpResponse( IcmpRecvBuf, iReadDataLen, DecodeResult, ICMP_ECHO_REPLY, ICMP_TIMEOUT ) ) { //到达目的地,退出循环 if( DecodeResult.dwIPaddr.s_addr == destSockAddr.sin_addr.s_addr ) bReachDestHost = true; //输出IP地址 cout<<'\t'<<inet_ntoa( DecodeResult.dwIPaddr )<<endl; break; } } else if( WSAGetLastError() == WSAETIMEDOUT ) //接收超时,输出*号 { cout<<" *"<<'\t'<<"Request timed out."<<endl; break; } else { break; } } iTTL++; //递增TTL值 } }
C++哈夫曼编码译码器设计与实现并对哈夫曼树进行先序遍历。
现在就是差一个先序遍历的要求没有做到 ``` #include<stdio.h> #include<string.h> #include<stdlib.h> //树结点定义 typedef struct { int weight; int parent; int lchild; int rchild; }HTNode,*HuffmanTree; static char N[100];//用于保存正文 //哈弗曼编码,char型二级指针 typedef char **HuffmanCode; //封装最小权结点和次小权结点 typedef struct { int s1; int s2; }MinCode; //函数声明 void Error(char *message); HuffmanCode HuffmanCoding(HuffmanTree &HT,HuffmanCode HC,int *w,int n); MinCode Select(HuffmanTree HT,int n); //当输入1个结点时的错误提示 void Error(char *message) { fprintf(stderr,"Error:%s\n",message); //根据指定的格式,向输出流写入数据 exit(1); } //构造哈夫曼树HT,编码存放在HC中,w为权值,n为结点个数 HuffmanCode HuffmanCoding(HuffmanTree &HT,HuffmanCode HC,int *w,int n) { int i,s1=0,s2=0; HuffmanTree p; char *cd; int f,c,start,m; MinCode min; if(n<=1) { Error("Code too small!");//只有一个结点不进行编码,直接exit(1)退出。 } m=2*n-1;//哈弗曼编码需要开辟的结点大小为2n-1 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//开辟哈夫曼树结点空间 m+1 ,动态内存分配。 //初始化n个叶子结点,w[0] = 0,main函数已赋值 for(p=HT,i=0;i<=n;i++,p++,w++) { p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; } //将n-1个非叶子结点的初始化 for(;i<=m;i++,p++) { p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } //构造哈夫曼树 for(i=n+1;i<=m;i++) { min=Select(HT,i-1);//找出最小和次小的两个结点 s1=min.s1 ; //最小结点下标 s2=min.s2;//次小结点下标 HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } //打印哈弗曼树 printf("HT List:\n"); printf("Number\t\tweight\t\tparent\t\tlchild\t\trchild\n"); for(i=1;i<=m;i++) { printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); } //从叶子结点到根节点求每个字符的哈弗曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char *));//为哈弗曼编码动态分配空间 cd[n-1]='\0';//如:3个结点编码最长为2。cd[3-1] = '\0'; //求叶子结点的哈弗曼编码 for(i=1;i<=n;i++) { start=n-1; //定义左子树为0,右子树为1 /* 从最下面的1号节点开始往顶部编码(逆序存放),然后编码2号节点,3号...... */ for(c=i,f=HT[i].parent; f!=0; c=f,f=HT[f].parent) { if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; } //为第i个字符分配编码空间 HC[i]=(char *)malloc((n-start)*sizeof(char *)); //将当前求出结点的哈弗曼编码复制到HC strcpy(HC[i],&cd[start]); } free(cd); return HC; } MinCode Select(HuffmanTree HT,int n) { int min,secmin; int temp = 0; int i,s1,s2,tempi = 0; MinCode code ; s1=1; s2=1; min = 9999; //找出权值最小的结点,下标保存在s1中 for(i=1;i<=n;i++) { if(HT[i].weight<min && HT[i].parent==0) { min=HT[i].weight; s1=i; } } secmin = 9999; //找出权值次小的结点,下标保存在s2中 for(i=1;i<=n;i++) { if((HT[i].weight<secmin) && (i!=s1) && HT[i].parent==0) { secmin=HT[i].weight; s2=i; } } //放进封装中 code.s1=s1; code.s2=s2; return code; } void HuffmanTranslateCoding(HuffmanTree HT, int n,char* ch) {//译码过程 int m=2*n-1; int i,j=0; printf("After Translation:"); while(ch[j]!='\0')//ch[]:你输入的要译码的0101010串 { i=m; while(0 != HT[i].lchild && 0 != HT[i].rchild)//从顶部找到最下面 { if('0' == ch[j])//0 往左子树走 { i=HT[i].lchild; } else//1 往右子树走 { i=HT[i].rchild; } ++j;//下一个路径 } printf("%c",N[i-1]);//打印出来 } printf("\n"); } void main() { HuffmanTree HT=NULL; HuffmanCode HC=NULL; int *w=NULL; int i,n; char tran[100]; printf("Input N(char):"); gets(N); fflush(stdin); n = strlen(N); w=(int *)malloc((n+1)*sizeof(int *));//开辟n+1个长度的int指针空间 w[0]=0; printf("Enter weight:\n"); //输入结点权值 for(i=1;i<=n;i++) { printf("w[%d]=",i); scanf("%d",&w[i]); } fflush(stdin); //清空输入缓冲区 //构造哈夫曼树HT,编码存放在HC中,w为权值,n为结点个数 HC=HuffmanCoding(HT,HC,w,n); //输出哈弗曼编码 printf("HuffmanCode:\n"); printf("Number\t\tWeight\t\tCode\n"); for(i=1;i<=n;i++) { printf("%c\t\t%d\t\t%s\n",N[i-1],w[i],HC[i]); } fflush(stdin); //译码过程 printf("Input HuffmanTranslateCoding:"); gets(tran); HuffmanTranslateCoding(HT, n, tran); return; } ```题目要求:九、哈夫曼编码译码器设计与实现 编写程序设计哈夫曼编码译码器。 (1)根据输入的权值建立哈夫曼树。 (2)对建立好的哈夫曼树进行先序遍历。 (3)利用建好的哈夫曼树生成哈夫曼编码,并显示生成的各字符的哈夫曼编码。 (4)根据输入的字符进行译码。 (5)显示功能:以先序遍历的顺序显示建立好的哈夫曼树。显示哈夫曼编码和译码的结果。
C语言程序 学生成绩排序系统
1. 学生成绩排序系统简介 学生成绩排序系统可实现学生信息输入、学生信息输出、学生信息查询、学生成绩排序等功能。程序要求提供简单友好易于操作的界面。程序以C语言开发。 2.学生成绩管理系统基本要求: 假设有5名学生的成绩放在1个数组中。系统要求从键盘上输入的方法生成学生的成绩几有关数据。系统能按照要求根据不同条件对学生成绩进行管理。 3. 系统模块及操作要求: (1) 编写一个成绩生成函数。使用从键盘上输入的方法生成学生的各门课程的成绩(每门课程的成绩都是0-100之间的整数)并存入文件中,通过调用该函数生成全部学生的成绩再从文件中读出数据。 (2)先采用冒泡排序法,将学生成绩从高到低进行排序,再输入一个学生的成绩,将此成绩按照排 序规律插入已排好序的学生成绩数组。 (3)在函数中进行 全班学生成绩从高到低的顺序进行排名, 排名方式根据上方一排好的顺序。 (4)对学生的成绩进行优化。 若遇到成绩相同的同学,按照学号的大小进行重新排序。 (5)定义一个结构体数组,存放学生的学号,姓名,三 门课的成绩,输出单门课成绩最高的学生的学号、姓名,输出三门课程的平均分数以及最高的学生的学号、姓名及其平均分,再将学生按照平均分数从高到低进行排序并输出最后的结果。 (6)学生成绩文件管理。将学生的相关数据,存入文件中,再从文件中读出 按照平均分数从高到低进行排序,将结果输出到屏幕上,再从文件中读取学生的数据进行显示。 设计一个菜单,至少具有上述操作要求的基本功能,菜单设计请见图1。![图片说明](https://img-ask.csdn.net/upload/201605/31/1464710124_909761.png)
新手求指教!用c语言 简单学生成绩统计软件 。万分感谢,编好发到邮箱425572938@.
实现的任务: (1)每个学生记录中包含学号、姓名和C 语言课设成绩等信息; (2)创建学生记录链表; (3)更新学生记录(插入、排序、删除); (4)能统计各分数段的人数,并以分布图显示; (5)输出学生记录到屏幕。 设计内容: 1. 学生记录应该包括学号、姓名、C 语言课设成绩等信息,是本程序的核心数据结构,定 义如下: typedef struct { char num[11]; /*学号*/ char name[10]; /*姓名*/ int cgrade; /*c 语言课设成绩*/ }elemtype ; 使用链表实现学生记录的存储,链表中的结点结构如下: typedef struct node { elemtype data; struct node * next; } NODE,*Nodeptr; int n=0; 2.程序应具有以下基本功能: (1)以菜单形式显示主界面,提示用户进行选择,完成相应任务,如图1-1 所示。 (2)创建学生记录链表:从键盘输入一定数量的学生记录。 (3)插入学生记录:从键盘输入待插入的学生记录,插入到指定位置。 (4)对学生记录中的C 语言课设成绩按指定顺序(升序、降序)进行排序; (5)删除学生记录:在指定位置上删除学生记录。 (6)能统计各分数段的人数,并以分布图显示,如图1-2 所示。 (7)输出学生记录到屏幕。 设计要求: 1.核心数据结构用到的结构体要采用动态内存分配和链表结构。 2.使用文件进行存储和管理。程序启动时可从文件中读取学生成绩信息, 或从键盘输入学生成绩信息;运行过程中如添加或删除记录时也可对文件进 行存取;退出前可根据需要提醒是否保存学生成绩信息到文件中。 3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用 接口要注释清楚。对程序其它部分也进行必要的注释。
C语言中数组开辟空间及使用的问题
本人刚刚入门C语言,在学习数组的时候发现一个问题,代码如下,实际功能是将字符串中的大写字母转换成小写,并输出大写字母个数 #include "stdio.h" int main() { int i=0,j=0; char str[i]; scanf("%s",&str[i]); for(i=0;str[i]!='\0';i++) if(str[i]>65&&str[i]<97) { str[i]+=32; j++; } printf("%s\n",str); printf("原字符串中大写字母有%d个\n",j); return 0; } 编译环境是Linux zephyrus 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:13 UTC 2017 i686 i686 i686 GNU/Linux 问题在char str[i]上,我并没有开辟数组的空间大小,而且sizeof(str[i])显示大小为0,但是打印地址时却可以成功打印出str [i]的地址。 我很迷的一点是,我并没有开辟出这个空间,但是这个空间却有地址,既然有地址,就可以按照地址顺序读入数据,那不就相当于我开辟了一个大小可以随意变化的空间?
C语言超市信息管理系统,按照销售额排序的时候输出全是烫?
![图片说明](https://img-ask.csdn.net/upload/201906/19/1560956202_209394.png) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<assert.h> #define FILENAME "goodsfile" //定义商品信息文件名 /*-------定义商品信息结构体--------*/ typedef struct good_tag { int good_id; //商品编号 char name[50]; //商品名称 float good_inprice; //商品进价 float good_outprice; //商品售价 int good_innumber; //商品进货量 int good_outnumber; //商品销售量 float good_grossprofit; //商品毛利 int good_reserve; //商品库存 struct good_tag *next; //定义商品结构体指针 }GOODS; GOODS *G_head; //定义一个商品信息的结构体指针 /*------------函数声明-----------*/ int menu(); //定义主菜单函数 int menu_check();//定义查看菜单函数 GOODS *alloc_a_goods_node(); //为load分配一个GOODS结构体大小的堆空间 GOODS *Add_Goods_Reserve(GOODS *G_head,GOODS *pload); //添加商品入库函数 int free_goods_node(GOODS *G_head); //释放商品链表堆空间 int Show_Goods_of_Reserve(GOODS *G_head); //显示所有商品信息 GOODS *Find_a_goods(GOODS *G_head, int num);//查找商品 GOODS *Delete_a_node(GOODS *G_head); //删除商品 GOODS *modify_a_goods(GOODS *G_head); //修改库存商品 void Show_Goods_of_Reserve_bysales(GOODS *G_head,int n); //显示商品按销售额排序 void Show_Goods_of_Reserve_bygrossprofit(GOODS *G_head);//显示商品按毛利排序 void Write_Goods_list_to_file(GOODS *G_head); //将导入的库存商品信息保存至文件中 GOODS *Read_file_Goods_to_list(GOODS *G_head); //将文件中商品的信息导出到链表 int count(); /*--------------主菜单-------------*/ void menu_of_fun() { int num; GOODS *load = NULL; GOODS *pload = NULL; printf("----------------------------------/n"); printf("---欢迎进入超市商品信息管理系统---/n"); printf("----------------------------------/n"); switch (menu()) { case 1: Show_Goods_of_Reserve(G_head); //查看所有商品 break; case 2: printf("请输入要查找的商品的编号:\n"); //查找单个商品 scanf("%d", &num); load = Find_a_goods(G_head,num); if (load==NULL) printf("没有找到商品!\n"); else { printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", load->good_id, load->name, load->good_inprice, load->good_outprice, load->good_innumber, load->good_outnumber, load->good_grossprofit, load->good_reserve); } break; case 3: pload = alloc_a_goods_node(); G_head = Add_Goods_Reserve(G_head,pload); //添加商品 break; case 4: G_head = Delete_a_node(G_head); //删除商品 break; case 5: G_head = modify_a_goods(G_head); //修改商品 break; case 6: Write_Goods_list_to_file(G_head); free_goods_node(G_head); //在系统退出时释放库存商品链表堆空间 exit(0); //退出系统 } } int menu() //定义主菜单函数 { int choice; printf("-------------------------------\n"); printf(" 1:查看库存商品 \n"); printf(" 2:查找商品 \n"); printf(" 3:添加库存商品 \n"); printf(" 4:删除库存商品 \n"); printf(" 5:修改库存商品 \n"); printf(" 6:退出系统 \n"); printf("-------------------------------\n"); printf("请输入你的选择:\n"); while (1) //选择步骤 { scanf("%d", &choice); if (choice >= 1 && choice <= 6) break; else printf("请重新输入!\n"); } return choice; } int menu_check() //定义排序菜单函数 { int choice; printf("-------------------------------\n"); printf(" 1:按商品原顺序排序 \n"); printf(" 2:按销售额高到低排序 \n"); printf(" 3:按毛利高到低排序 \n"); printf("-------------------------------\n"); printf("请输入你的选择:\n"); while (1) //选择步骤 { scanf("%d", &choice); if (choice >= 1 && choice <= 3) break; else printf("请重新输入!\n"); } return choice; } /*--------------主函数-------------*/ int main() { G_head=Read_file_Goods_to_list(G_head); while (1) { menu_of_fun(); } system("pause"); //使程序在此处暂停 } /*-------商品库存增删查改函数------*/ /*-----------商品库存增加----------*/ GOODS *alloc_a_goods_node() { GOODS *load = (GOODS *)malloc(sizeof(GOODS)); //为load分配一个GOODS结构体大小的堆空间 printf("请输入商品信息:\n"); printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); scanf("%d %s %f %f %d %d %f %d", &(load->good_id), load->name, &(load->good_inprice), &(load->good_outprice), &(load->good_innumber), &(load->good_outnumber), &(load->good_grossprofit), &(load->good_reserve)); return load; } GOODS *Add_Goods_Reserve(GOODS *G_head,GOODS *pload) //头插法 { GOODS *buff = G_head; if (G_head == NULL) { G_head = pload; pload->next = NULL; } else { pload->next = G_head; G_head = pload; } return G_head; } /*----------释放堆空间--------*/ int free_goods_node(GOODS *G_head) { GOODS *pload = G_head; GOODS *buff = NULL; if (G_head == NULL) return 0; while (pload ->next != NULL) { buff = pload->next; free(pload); pload = buff; } free(pload); return 1; } /*---------显示库存中所有商品信息----------*/ void Show_A_Goods(GOODS *pload) { printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", pload->good_id, pload->name, pload->good_inprice, pload->good_outprice, pload->good_innumber, pload->good_outnumber, pload->good_grossprofit, pload->good_reserve); } void Show_Goods_of_Reserve_bysales(GOODS *G_head,int n) //显示商品按销售额排序 { int i,j; GOODS temp, good_tag[200], *pload; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if((good_tag[j].good_outnumber*good_tag[j].good_outprice)>(good_tag[j+1].good_outnumber*good_tag[j+1].good_outprice)) { temp = good_tag[j+1]; good_tag[j+1] = good_tag[j]; good_tag[j] = temp; } } } printf("\n"); printf("依据商品销售额排序:\n\n"); pload = good_tag; printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", pload->good_id, pload->name, pload->good_inprice, pload->good_outprice, pload->good_innumber, pload->good_outnumber, pload->good_grossprofit, pload->good_reserve); } int Show_Goods_of_Reserve(GOODS *G_head) { GOODS *buff = G_head; if (G_head == NULL) //链表为空直接退出函数 { printf("库存中没有商品!\n"); return 0; } else { switch(menu_check()) { case 1: printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); while (buff != NULL) { Show_A_Goods(buff); buff = buff->next; } break; case 2: Show_Goods_of_Reserve_bysales(G_head,count()); break; case 3: //Show_Goods_of_Reserve_bygrossprofit(G_head); break; } } return 0; } /*----------查找商品---------*/ GOODS *Find_a_goods(GOODS *G_head,int num) { GOODS *buff = G_head; if (G_head == NULL) { return NULL; } else { while (buff != NULL) { if (buff->good_id == num) { return buff; } else { buff = buff->next; } } return NULL; } } /*-------删除库存中商品---------*/ GOODS *Delete_a_node(GOODS *G_head) { GOODS *buff = G_head; GOODS *prebuff = G_head; int num = 0; printf("请输入要删除的商品编号:\n"); scanf("%d", &num); while (buff != NULL) { if (buff->good_id != num) { prebuff = buff ; buff = buff->next; } else { if (G_head->good_id == num) { G_head = G_head->next; } else { prebuff->next = buff->next; } free(buff); break; } } return G_head; } /*-------------修改库存商品--------------*/ GOODS *modify_a_goods(GOODS *G_head) { int num = 0; GOODS *buff = G_head; printf("请输入要修改的商品的编号:\n"); scanf("%d", &num); while (buff != NULL) { if (buff->good_id == num) { printf("请重新输入这个商品的信息:\n"); scanf("%d %s %f %f %d %d %f %d", &buff->good_id, buff->name, &buff->good_inprice, &buff->good_outprice, &buff->good_innumber, &buff->good_outnumber, &buff->good_grossprofit, &buff->good_reserve); break; } else { buff = buff->next; } } return G_head; } /*----------文件操作---将导入的库存商品信息保存至文件中----------------*/ void Write_Goods_list_to_file(GOODS *G_head) { GOODS *pload = G_head; FILE *fp = fopen(FILENAME,"wb+"); assert(fp != NULL&&pload != NULL); while (pload != NULL) { fwrite(pload, sizeof(GOODS), 1, fp); pload = pload->next; } fclose(fp); } /*---------文件操作---将文件中商品的信息导入链表--------------------*/ GOODS *Read_file_Goods_to_list(GOODS *G_head) { GOODS *pload = malloc(sizeof(GOODS)); FILE *fp = fopen(FILENAME, "rb+"); if (fp == NULL) //如果文件中为空直接返回空 return NULL; assert(fp != NULL&&pload != NULL);//保护 while (fread(pload, sizeof(GOODS), 1, fp)==1)//fread函数读成功后返回size个数 { G_head = Add_Goods_Reserve(G_head, pload);//将读出的数据依次插入链表 pload = malloc(sizeof(GOODS)); } free(pload);//释放最后多分配的空间 fclose(fp);//关闭文件 return G_head; } int count() { int i=0; GOODS *nood=G_head; while(nood) { i++; nood=nood->next; } return i; }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的Tencent Kona JDK,分布式HTAP数据库 TBase,企业级容器平台TKEStack,以及高性能图计算框架Plato。短短一周之内,腾讯开源了五大重点项目。其中,TubeMQ是腾讯大数据平台部门应用的核心组件,...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问