C语言中结构体数组用 for循环和 scanf 输入 比应输入行数多一行

C语言中 结构体数组用 for循环和scanf输入 比应输入行数多一行,这是为什么?

3组学生信息的输入,成绩汇总,排序,打印

我只想输3组数据(aa,bb,cc),但必须输4行(多了dd,这行是随便输的)才行,,不懂,求解。
结果和代码如下:
图片说明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
typedef struct {
    char name[9];
    float score[2];
    float total;
} stu;

void shuru(stu*ss){
    int i=0;
    for(;i<N;i++){
        scanf("%s%f%f\n",(ss+i)->name,&((ss+i)->score[0]),&((ss+i)->score[1]));
    }
}

void shuchu(stu* ss){
    int i=0;
for(;i<N;i++)
        printf("%s %f %f %f\n",(ss+i)->name,(ss+i)->score[0],(ss+i)->score[1],(ss+i)->total); 
}


void paixv(stu *ss){
    int i,j=0;
       for(i=0;i<N-1;i++){
    for(j=0;j<N-i-1;j++){
        if(ss[j].total<=ss[j+1].total){
            stu temp=ss[j];
            ss[j]=ss[j+1];
            ss[j+1]=temp;
        }
    }
   }
}

void huizong(stu* ss){
    int i=0;
    for(;i<N;i++){
            (ss+i)->total=(ss+i)->score[0]+(ss+i)->score[1];
            ss[i].total=ss[i].score[0]+ss[i].score[1];
    }}

int main()
{
     stu  ss[N];
     int i,j=0;

     shuru(ss);
   huizong(ss);
   paixv(ss);
   shuchu(ss);

     return 0;
}

2个回答

您好,输入的方法里去掉【\n】就好了

图片说明

如果我的回答对您有所帮助,请您采纳,谢谢~~

直接按回车键,输入完cc后直接按回车键。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
动态构造存放学生的结构体数组函数版怎么写?

``` /*动态构造存放学生的结构体数组 动态构造一个数组,存放学生的信息 然后按分数排序 */ #include<stdio.h> #include<malloc.h> struct Student{ int age; char name[100]; float score; }; int main(){ struct Student*pArr; int len,i,j; struct Student t; printf("请输入学生的人数:"); scanf("%d",&len); printf("len=%d\n",len); pArr=(struct Student*)malloc(len*sizeof(struct Student)); //动态分配数组 for(i=0;i<len;i++){ printf("请输入第%d个学生的信息:\n",i+1); printf("age="); scanf("%d",&pArr[i].age); printf("name="); scanf("%s",pArr[i].name); printf("score="); scanf("%f",&pArr[i].score); } //排序 for(i=0;i<len-1;i++){ for(j=0;j<len-1-i;j++){ if(pArr[j].score>pArr[j+1].score){ t=pArr[j]; pArr[j]=pArr[j+1]; pArr[j+1]=t; } } } //输出 printf("\n\n学生的信息:\n"); for(i=0;i<len;i++){ printf("输出第%d个学生的信息:\n",i+1); printf("age=%d\n",pArr[i].age); printf("name=%s\n",pArr[i].name); printf("score=%f\n",pArr[i].score); } printf("\n"); } //代码如上,请问把代码里的输入,输出,冒泡排序的for循环写成函数调用的话怎么写呢?麻烦告诉我简单具体的写法,不太掌握这方面的,谢谢! ```

结构体内指针字符数组的释放

问题:结构体成员char* name和结构体struct student* studentIOS同时释放的话回报错,错误见代码中注释。请问这里要怎么释放呢?还是结构体里面不能这样使用指针字符数组? #include <stdio.h> #include <stdlib.h> struct student{ int id; //长度:4 char* name; //8 int score[2]; //8 float avgScore; //4 }; void input(struct student*); void output(struct student*); void input(struct student* stu){ printf("(1)程序最多接受50名学生的信息,多余的无法录入\n"); printf("(2)不足50人,请输入-1结束输入\n"); for (int i=0; i<50; ++i) { (stu+i)->name = (char*)malloc(15 * sizeof(char)); //给结构体中学生的name分配空间 printf("请在下面输入第%d名学生的信息\n",i+1); printf("序号:"); scanf("%d",&(stu+i)->id); if (-1 == (stu+i)->id) { //输入-1的时候,停止输入;退出输入函数 printf("输入结束\n"); return ; } printf("姓名:"); //gets((stu+i)->name); scanf("%s",(stu+i)->name); printf("C语言成绩:"); scanf("%d",&(stu+i)->score[0]); printf("数序成绩:"); scanf("%d",&(stu+i)->score[1]); (stu + i)->avgScore =( (stu + i)->score[0] + (stu + i)->score[1])/2.0; } return; } void output(struct student* stu){ printf("学生信息如下\n"); printf("学号\t\t姓名\t\tC语言\t数学\t\t平均\n"); for (int i=0; i<50; ++i,++stu) { if (stu->id == -1) { break; } printf("%d\t\t%s\t\t%d\t\t%d\t\t%.2f",stu->id,stu->name,stu->score[0],stu->score[1],stu->avgScore); printf("\n"); } return; } int main(int argc, const char * argv[]) { struct student* studentIOS = (struct student*)malloc(50 * sizeof(struct student)); input(studentIOS); //output(studentIOS); // printf("%p\n%p",studentIOS->name,&studentIOS->name); //输出不同 /* 释放每个学生的name空间,或者释放学生结构体的空间, 测试发现二者只能释放一个 */ //释放每个学生中的name空间 #if 0 //加上此循环,程序出问题,提示studentIOS未malloc for (int i=0; i<50; ++i,++studentIOS) { if (NULL != studentIOS->name) { free(studentIOS->name); studentIOS->name = NULL; } } #endif #if 0 //加上下面的两句不会出问题 free((studentIOS+10)->name); (studentIOS+10)->name = NULL; #endif free(studentIOS); studentIOS = NULL; return 0; }

C/C++ 二维数组赋值问题

我今天碰到一道出乎我以前理解的问题: 二维数组元素a[2][3]在内存中的存放顺序是a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2] 并且是连着存放的。可为什么我辅助的时候采用以下这样的形式没法给二维数组赋值呢?还请大佬指点,不甚感激。 ``` int a[2][3]; for(int i=0;i<6;i++) scanf("%d",&a[i]); ```

c++,萌新问下怎么在一个数组特定位置赋值?

列如一个数组a[5],我想在 ( )()(3)()(),第三个位置赋值3,然后用for循环scanf输入4个值时,自动只赋予空缺的项,3的值和位置都不变。

单_循环链表_最后连接部分不理解

int InitCLinkList(CLinkList *list) { int data = 0; CLinkNode* target = NULL; CLinkNode* head_node = NULL; printf("请输入结点数据,0代表结束初始化:\n"); while (1) { scanf("%d", &data); if (data == 0) break; //退出循环标志,用户输入0 表示结束输入数据 if (*list == NULL) { CLinkNode* head= (CLinkNode*)malloc(sizeof(CLinkNode)); *list = head;//链表指向头结点 CLinkNode* node = (CLinkNode*)malloc(sizeof(CLinkNode)); node->data = data; node->next = head; head->next = node; }else{ //如果循环链表不为空 链尾部插入数据 //通过循环 找到尾结点,怎样判断是否是尾结点?当结点的指针域指向头结点时为尾结点,这样才能形成环嘛 //循环结束后target 指向尾结点 //for 循环下好好理解下!target初始化为第一个结点指针 for (target = (*list)->next; target->next != *list; target = target->next); head_node = target->next; CLinkNode* node = (CLinkNode*)malloc(sizeof(CLinkNode)); node->data = data; node->next = head_node; //这个已经指向头了。 target->next = node;//将新结点插入尾部 //在用头指向它。那中间的不都没有了吗。 不理解。 } } return OK; } ``` ```

一个4×5的整型二维数组,从键盘输入数据,并对该数组的每一行按从小到大的顺序排列后输出。

输入格式: 输入4行5列的矩阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。 输出格式: 输出4行5列的矩阵,每行第一个数前没有空格,每个数输出占4列列宽。 输入样例: 1 5 4 2 6 3 2 5 8 4 8 5 4 1 5 9 5 1 2 6 输出样例: 1 2 4 5 6 2 3 4 5 8 1 4 5 5 8 1 2 5 6 9

c语言链表指针的指针问题

想问一下那个插入函数的类型是结构体指针的指针,输入参数是一个空指针的地址,有没有大神解释一下这个函数如何使用的呢? 还有就是如果直接用结构体指针函数,应该如何改能实现一样的功能 //学生结构体,包含数据:学号、姓名、性别、毕业学校、初试分数、复试分数 //按照学号递增插入信息 //按照学生姓名查询学号和成绩 #include <stdio.h> #include <stdlib.h> #include <string.h> // 数组结构体 typedef struct Node { int num; char name[20]; char sex[10]; char graduate_scholl[20]; int initial_score; int re_score; struct Node *next; }NODE , *PNODE; //NODE为结构体变量名,指向结构的指针 /* 相当于 typedef struct Node { ...... }NODE; //使用typedef关键字用一个单词NODE代替struct TreeNode,并定于指向该结构体类型的指针PNODE: NODE *PNODE; */ /** * 插入数字 * @param ** head 头指针地址 * @param int value 插入的数值 * @return void */ PNODE * insertValue(PNODE*head); /** * 打印数组 * @param * head 头指针 * @return void */ void printfValue(PNODE head); void check(PNODE head);//查询函数 int main(void) { PNODE head = NULL; int index; do { printf("是否录入学生数据?(0否/1是):"); scanf("%d", &index); if (index == 1) { insertValue(&head);//这里为何要这样取空指针 printf("\n\n"); printfValue(head); } } while (index == 1); check(head); return 0; } PNODE *insertValue(PNODE *head) //就是这个函数 看了好几天都没太懂 { PNODE previous = NULL; // 前一个指向地址 PNODE current = *head; // 当前指向地址 PNODE pNew = (PNODE )malloc(sizeof( NODE)); if (pNew == NULL) { printf("申请内存失败"); exit(1); } else { printf("请输入学生学号:"); scanf("%d",&pNew->num); printf("请输入学生姓名:"); scanf("%s",pNew->name); printf("请输入学生性别:"); scanf("%s",pNew->sex); printf("请输入学生毕业学校:"); scanf("%s",pNew->graduate_scholl); printf("请输入学生初试分数:"); scanf("%d",&pNew->initial_score); printf("请输入学生复试分数:"); scanf("%d",&pNew->re_score); } // currnt 不为 NULL => 数组有值 // current的值 < 待插入的值 => 转到下一个指向地址,并把当前地址存入previous。 while (current != NULL && current -> num < pNew -> num) { previous = current; //往后遍历,直到插入的值不大于当前的数 current = current -> next; } // 下一个地址内的值 > 待插入的值 => 待插入的值插入previous和current之间 pNew -> next = current; if (previous == NULL) { // previous == NULL 说明没有执行遍历循环 // 头插法 *head = pNew; } else { // previous(next) -> pNew(next) -> current previous -> next = pNew;//待插入的值插入previous之后 } return head; } void check(PNODE head) { char temp[10]; PNODE p=head; if(NULL == p) { printf("未录入信息,信息查询失败!"); } else { printf("请输入需要查询考生姓名:"); scanf("%s",temp) ; } while(p != NULL) { if(!strcmp(p->name,temp)) { printf("\n考生姓名为:%s的信息如下:\n",p->name); printf("该学生的学号为:%d\n",p->num); printf("该考生的初试成绩为:%d\n",p->initial_score); printf("该考生的复试成绩为:%d\n",p->re_score); break; } p = p->next; } } void printfValue(PNODE head) { PNODE current = head; while (current != NULL) { printf("学号:%d\n",current->num); printf("姓名:%s\n",current->name); printf("性别:%s\n",current->sex); printf("毕业学校:%s\n",current->graduate_scholl); printf("初试分数:%d\n",current->initial_score); printf("复试分数:%d\n",current->re_score); printf("\n"); current = current -> next; } printf("\n"); }

c语言运行错误 求大佬帮助

![图片说明](https://img-ask.csdn.net/upload/201805/17/1526522450_114383.png) 以下是我写的代码 #include<stdio.h> #include<malloc.h> typedef struct BirthDate { int year; int month; int day; }birthdate; typedef struct Student{ unsigned int num; char name[20]; unsigned char sex; birthdate date; int scores[4]; }student; void ShowStuInfo( student*pstudent); double Average(student*students,int N,int i); int main() { int N; printf("请输入学生数量\n"); scanf("%d",&N); student* students; int i;//学科代码 int count;//学生信息输入循环变量 double ave=0; //分配学生结构体数组需要的内存 students=(student*)malloc(N*sizeof(student)); //通过函数显示每个学生的信息 for(count=0;count<N;count++) { ShowStuInfo(students); } //求某一学科的平均成绩 ave=Average(students,N,i); printf("%lf",ave); free(students); return 0; } void ShowStuInfo(student*pstudent) { printf("请输入学号 姓名 性别 出生年-月-日\n"); scanf("%d %s %c %d-%d-%d", &pstudent->num, pstudent->name, &pstudent->sex, &pstudent->date.year, &pstudent->date.month, &pstudent->date.day); printf("请输入各科成绩\n"); scanf("%d %d %d %d", &pstudent->scores[0], &pstudent->scores[1], &pstudent->scores[2], &pstudent->scores[3] ); } double Average(student*students,int N,int i) { int j; double Ave; for(j=0;j<N;j++) { Ave+=students->scores[i]; } Ave/=N; return Ave; } 以下是运行结果 ![图片说明](https://img-ask.csdn.net/upload/201805/17/1526522530_834162.png) 求问哪错了

只有C语言实现,急求用C#实现机票预订管理系统源代码及界面

#include<stdio.h> //标准输入、输出头文件 #include<string.h> //包含字符串函数处理头文件 #include<stdlib.h> //包含动态存储与释放函数头文件 #define N 10000 struct air //定义结构体数组 { int num; char start[20]; char over[20]; char time[10]; int count; }s[N]; int i; int m=0; #define PRINT "%-d%12s%12s%10s%12d\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count //定义输出格式 void input(); //输入航班信息 void print(); //输出航班信息 void save(); //保存航班信息 void read(); //读取航班信息 void search(); //查找航班信息 void shanchu(); //删除航班信息 void dingpiao(); //订票信息 void tuipiao(); //退票信息 void xiugai(); //修改信息 void main() { int j; printf(" ★---您好,欢迎进入中国民航管理系统!---★\n"); printf("================================================================================\n"); do { printf(" -------- ☆ 1.输入航班信息 ☆-------- \n\n" " -------- ☆ 2.浏览航班信息 ☆-------- \n\n" " -------- ☆ 3.修改航班信息 ☆-------- \n\n" " -------- ☆ 4.查找航班信息 ☆-------- \n\n" " -------- ☆ 5.删除航班信息 ☆-------- \n\n" " -------- ☆ 6.订票信息 ☆-------- \n\n" " -------- ☆ 7.退票信息 ☆-------- \n\n" " -------- ☆ 0.退出 ☆-------- \n\n"); printf("================================================================================\n"); printf("请在0-7中选择以回车键结束:\n\n"); scanf("%d",&j); switch(j) { case 1: input();//调用输入模块 break; case 2:print();//调用打印模块 break; case 3:xiugai();//调用修改模块 break; case 4:search();//调用查找模块 break; case 5:shanchu(); //调用删除模块 break; case 6:dingpiao();//调用订票模块 break; case 7:tuipiao();//调用退票模块 break; case 0:; break; } }while(j!=0); //判断结束 printf("谢谢使用,再见!\n"); }//主函数结束 void input()//打印模块程序 { char f[]="zhangbin0027"; //设置密码 int y; printf("请输入密码并以回车键结束:\n\n"); scanf("%s",f); //读取密码 if(strcmp(f,"zhangbin0027")==0) { printf("请依次输入航班信息(机票数位0结束输入):\n\n" "完成输入信息请键入w以回车键结束\n\n"); //打印提示信息 printf("-----------------------------------------------------------------\n"); for(i=0;i<N;i++) { printf("请输入航班号:\n"); scanf("%d",&s[i].num); //读取航班号 printf("请输入起始站:\n"); scanf("%s",s[i].start);//读取起始站 printf("请输入终点站:\n"); scanf("%s",s[i].over);//读取终点站 printf("请输入时间:\n"); scanf("%s",s[i].time);//读取时间 printf("请输入机票数(机票数为0结束输入):\n",m); scanf("%d",&s[i].count);//读取机票数 m++; printf("第%d个信息已经输完是否继续?按任意键继续,按 0结束",m); scanf("%d",&y); if(y==0) { save();//将结构体信息存盘 print();//输出输入的航班信息 break; } } } else printf("输入密码错误!请检查您的密码是否正确!谢谢!再见!\n\n"); } void save()//保存模块程序 { FILE *fp,*fp1;//定义文件指针 if((fp=fopen("chen.dat","wb"))==NULL)//打开文件并判断是否出错 { printf("创建文件失败!\n\n");//打印出错提示 getchar(); return; } if((fp1=fopen("hao.dat","wb"))==NULL)//打开文件并判断是否出错 { printf("创建文件失败!\n\n");//打印出错提示 getchar(); return; } for(i=0;i<m;i++) if(fwrite(&s[i],sizeof(struct air),1,fp)==0)//向文件写入数据,并判断是否出错 printf("向文件输入数据失败!\n\n"); fprintf(fp1,"%d",m); fclose(fp);//关闭文件 fclose(fp1);//关闭文件 } void read()//从文件读取信息模块 { FILE *fp,*fp1;//定义文件指针 if((fp=fopen("chen.dat","rb"))==NULL)//打开文件,并判断是否出错 { printf("出错,请检查文件是否存在,按任意键返回住菜单");//打印出错提示 getchar(); } if((fp1=fopen("hao.dat","rb"))==NULL)//打开文件并判断是否出错 { printf("创建文件失败!\n\n");//打印出错提示 getchar(); return; } fscanf(fp1,"%d",&m); fclose(fp1);//关闭文件 for(i=0;i<m;i++) { fread(&s[i],sizeof(air),1,fp);//从文件中读取信息 } fclose(fp);//关闭文件 } void print()//打印模块 { char w[10]; read();//调用读取文件函数 printf("航班号 起始站 终点站 时间 机票数\n"); for(i=0;i<m;i++) { printf(PRINT);//打印信息 } printf("请按任意键回车键结束返回上层菜单以:\n"); scanf("%s",w); } void search()//查询模块 { char name1[20]; char name2[20]; char ii[10]; int n,no; do { printf("请选择查找方式:\n\n");//打印查询方式菜单 printf("1.按航班号查找\n\n" "2.按终点站查找\n\n" "3.按航线查找\n\n" "0.返回\n\n"); printf("请在0-3中选择:\n\n" "按其他键以回车键结束返回主菜单:\n\n"); scanf("%d",&n);//读取查找方式 if(n==0) break; switch(n) { case 1: printf("请输入航班号:\n"); scanf("%d",&no);//航班号 break; case 2: printf("请输入终点站名称:\n"); scanf("%s",name2);//读取终点站 break; case 3: printf("请输入起始站名称:\n"); scanf("%s",name1);//读取起始站 printf("请输入终点站名称:\n"); scanf("%s",name2);//终点站 break; } read();//调用读取函数 for(i=0;i<m;i++) { if(strcmp(s[i].over,name1)==0||strcmp(s[i].over,name2)==0)//按终点站起始站判断输出条件 { printf("\n查找航班信息成功!\n"); printf("航班号 起始站 终点站 时间 机票数\n"); printf(PRINT);//打印信息 break; } if(s[i].num==no)//按航班号判断输出条件 { printf("\n查找航班信息成功!\n"); printf("航班号 起始站 终点站 时间 机票数\n"); printf(PRINT);//打印信息 break; } } no=0;//将航班号赋值为0 printf("没有您需要的信息或查找完毕:\n\n" "是否继续查找?请键入yes或no以回车键结束\n"); scanf("%s",ii); }while(strcmp(ii,"yes")==0);//判断结束 } void shanchu()//删除模块 { char name1[20]; char name2[ 20]; char ii[10]; char f[]="zhangbin0027";//设置密码 int no,n; printf("请输入密码并以回车键结束:\n\n"); scanf("%s",f);//读取密码 if(strcmp(f,"zhangbin0027")==0) //判断密码是否正确 { do { printf("请选择删除以方式回车键结束:\n\n");//打印删除方式菜单 printf("*1.按航班号删除\n\n" "*2.按航线删除\n\n" "*0.返回\n\n"); printf("请在0-2中选择以回车键结束:\n"); scanf("%d",&n);//读取删除方式 if(n==0) break; //跳出循环 switch(n) { case 1: printf("请输入航班号:\n"); scanf("%d",&no);//读取航班号 read();//调用读取函数 break;//跳出循环 case 2: printf("请输入起始站 名称:\n"); scanf("%s",name1);//读取起始站 printf("请输入终点站名称:\n"); scanf("%s",name2);//读取终点站 read();//调用读取函数 break;//跳出循环 } for(i=0;i<m;i++) { if(s[i].num==no||strcmp(s[i].start,name1)==0&&strcmp(s[i].over,name2)==0)//判断输入信息是否存在 { s[i]=s[m-1]; m--; } } printf("查找完毕或没有这个信息\n\n"); printf("是否继续删除\n"); printf("请键入yes或no以回车键结束\n"); scanf("%s",ii); //读取是否继续信息 save(); //调用读取函数 if(!strcmp(ii,"yes")) //判断是否继续删除 printf("请按任意键以回车键结束返回上层菜单:\n"); break; }while(n!=1&&n!=2&&n!=3&&n!=4&&n!=0); //判断结束 } else printf("对不起密码错误!您不是管理员,不能使用此项功能!谢谢!再见!\n\n"); } void dingpiao()//订票模块 { int n; char a[10]; do { search();//调用查询模块 printf("请输入您要订的机票数以回车键结束:\n"); scanf("%d",&n);//读取所订机票数 if(n<0) { printf("请输入有效的机票数!\n");//判断机票数是否出错 break; } if(s[i].count!=0&&s[i].count>=n)//判断是否出错 { s[i].count=s[i].count-n; save();//调用保存函数 printf("订票成功!\n\n"); break; } if(s[i].count<n)//判断是否出错 { printf("请输入有效的机票数:\n"); break; } printf("是否继续? 请输入yes或no以回车键结束:\n");//判断是否继续订票 scanf("%s",a); }while(!strcmp(a,"yes"));//判断结束 } void tuipiao()//退票模块 { int n; char a[10]; do { search();//调用查询模块 printf("请输入您要退的机票数目:\n"); scanf("%d",&n);//输入所退票数 if(n<0) //判断票数是否有效 printf("请输入有效的机票数!\n"); s[i].count=s[i].count+n; save(); //调用保存模块 printf("退票成功!\n\n"); printf("是否继续? 请键入yes或no以回车键结束:\n\n");//判断是否继续退票 scanf("%s",a); }while(!strcmp(a,"yes"));//判断并跳出循环 getchar(); } void xiugai() //修改模块 { struct xiu //定义结构体 { int no; char name1[20]; char name2[20]; char time[20]; int count; }x[1]; char j[10]; char f[]="zhangbin0027";//设置密码 int n; printf("请输入密码并以回车键结束:\n\n"); scanf("%s",f);//读取密码 if(strcmp(f,"zhangbin0027")==0)//判断是否出错 { read();//调用读取模块 do { printf( "请选择修改方式:\n\n" "*1,按航班号修改:\n\n" "*2,按航线修改: \n\n"); printf("请在1---2中修改以回车键结束:\n\n"); scanf("%d",&n);//读取修改方式 switch(n) { case 1:printf("请输入航班号:\n"); scanf("%d",&x[0].no);//读取航班号 break; case 2:printf("请输入起始站:\n"); scanf("%s",x[0].name1);//读取起始站 printf("请输入终点站:\n"); scanf("%s",x[0].name2);//读取终点站 break; } for(i=0;i<m;i++) { if(strcmp(s[i].over,x[0].name1)==0&&strcmp(s[i].over,x[0].name2)==0)//判断输出条件 { printf("航班号 起始站 终点站 时间 机票数\n"); printf(PRINT); break; } if(s[i].num==x[0].no)//判断输出条件 { printf("航班号 起始站 终点站 时间 机票数\n"); printf(PRINT); break; } } x[0].no=0; //将结构体中的号为零 printf("请输入新航班号、起始站、终点站、时间(星期几)、机票数:\n"); scanf("%d%s%s%s%d",&x[0].no,x[0].name1,x[0].name2,x[0].time,&x[0].count);//定义输入格式 s[i].num=x[0].no;//替换航班号 strcpy(s[i].start,x[0].name1);//替换其始站 strcpy(s[i].over,x[0].name2);//替换终点站 strcpy(s[i].time,x[0].time);//替换时间 s[i].count=x[0].count;//替换机票数 save();//调用保存模块 printf("是否继续?请键入yes或no以回车键结束:\n\n"); scanf("%s",j); }while(strcmp(j,"yes")==0); //判断结束 } else printf("对不起密码错误!您不是管理员,不能使用此项功能!谢谢!再见!\n\n"); }

下面这段代码的执行流程有一处疑问,请各位看看

``` #include <stdio.h> #include<process.h> struct address_list /*定义结构体存储学生成绩信息*/ { char name[10]; char adr[20]; char tel[15]; } info[100]; void save(char *name, int n) /*自定义函数save*/ { FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/ int i; if ((fp = fopen(name, "wb")) == NULL) /*以只写方式打开指定文件*/ { printf("cannot open file\n"); exit(0); } for (i = 0; i < n; i++) //将一组数据输出到fp所指的文件中 if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1) printf("file write error\n"); /*如果写入文件不成功,则输出错误*/ fclose(fp); /*关闭文件*/ } void show(char *name, int n) /*自定义函数show*/ { int i; FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/ if ((fp = fopen(name, "rb")) == NULL) /*以只读方式打开指定文件*/ { printf("cannot open file\n"); exit(0); } for (i = 0; i < n; i++) { fread(&info[i], sizeof(struct address_list), 1, fp); /*从fp所指向的文件读入数据存到数组score中*/ printf("%15s%20s%20s\n", info[i].name, info[i].adr,info[i].tel); } fclose(fp); /*以只写方式打开指定文件*/ } main() { int i, n; /*变量类型为基本整型*/ char filename[50]; /*数组为字符型*/ printf("有多少个学生?\n"); scanf("%d", &n); /*输入学生数*/ printf("请输入文件路径及名称:\n"); scanf("%s", filename); /*输入文件所在路径及名称*/ printf("请输入学生的姓名、地址、电话:\n"); for (i = 0; i < n; i++) /*输入学生成绩信息*/ { printf("NO%d\n", i + 1); scanf("%s%s%s", info[i].name, info[i].adr, info[i].tel); save(filename, n); /*调用函数save*/ } show(filename, n); /*调用函数show*/ return 0; } ``` 从main函数处开始执行,输入n=4(即4个学生),在输出“请输入学生的姓名、地址、电话”这句后,第一次进入for循环,此时从键盘上输入一个学生的全部信息后按Enter键,开始调用save函数,此时在save函数中进入for循环后n是4,执行 if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)这句后把info[0]的信息写入到文件中了对吧?接着save函数中for语句进入第二次循环,这个时候info[1]的值还没输入呢,再判断 if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)这句的判定不会出错吗?即使不出错,此时程序把谁写入了文件呢?如果打开文件看的话,其实文件中只有info[0]的信息,没有另外三个结构变量的信息啊?求解释

这是职工管理系统的源代码,问题主要是无法以正确格式输出文件内容和修改函数不起作用,希望得到指导。

#include<stdio.h> //标准输入输出函数库 #include<string.h> //strcmp函数使用的头文件 #include<stdlib.h> //标准库头文件system(cls)函数需用到 #include<windows.h> //Sleep函数使用的头文件 #include<conio.h> //getch函数使用的头文件 //宏定义 #define LEN_EMPLOYEE sizeof(struct employee)//employee结构体的长度 #define LEN_ADM sizeof(struct adm)//adm结构体的长度 #define EMPLOYEE_NUM 500//职工的数组大小 #define ADM_NUM 10//管理员的数组大小 #define EMPLOYEE_DATA employeer[i].num,employeer[i].name,employeer[i].sex,employeer[i].age,employeer[i].xueli,employeer[i].wage,employeer[i].addr,employeer[i].tel #define ADM_DATA admer[i].account,admer[i].password //结构体的定义 struct employee { int num; //职工号 char name[20]; //姓名 char sex[10]; //性别 int age; //年龄 char xueli[30]; //学历 int wage; //工资 char addr[30]; //家庭住址 char tel[20]; //联系电话 }; struct adm { int num; //管理员的编号 char account[20]; //管理员的账户 char password[20]; //管理员的密码 }; //全局变量 struct employee employeer[EMPLOYEE_NUM]; struct adm admer[ADM_NUM]; //函数声明部分 void showmainmenu();//显示主菜单 void manager_in();//主管登录 void adm_in();//管理员登录 void employee_in();//职工登录 void managermenu();//主管菜单 void employee_display();//浏览职工信息 int employee_search();//查找职工信息 void employee_del();//删除职工信息 void employee_add();//添加职工信息 void employee_xiugai();//修改职工信息 void adm_add();//添加管理员信息 void adm_display();//浏览管理员信息 void adm_del();//删去管理员信息 void adm_xiugai();//修改管理员信息 int employeefile(char * pcMode);//职工文件函数 void saveemployeefile(int employeeid);//保存职工信息文件函数 void showemployee_xiugaimenu();//显示职工修改菜单 int admfile(char * pcMode);//管理员文件 int adm_search();//管理员查找 void showadm_xiugaimenu();//显示管理员修改菜单 void saveadmfile(int admid);//管理员保存文件函数 void admmenu();//管理员菜单 //主函数 int main() { int n; showmainmenu();/*调用showmainmenu函数绘制界面*/ scanf("%d",&n);/*提示用户输入数字*/ getchar(); while(n)/*当n为0时直接退出程序*/ { switch(n) { case 1: manager_in(); break; case 2: adm_in(); break; case 3: employee_in(); break; default: printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单"); Sleep(3000); } showmainmenu(); scanf("%d",&n); getchar(); } return 0; } void showmainmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 主菜单 |\n"); printf("\t| 身份选择 |\n"); printf("\t| 1.manager |\n"); printf("\t| 2.administrator |\n"); printf("\t| 3.employee |\n"); printf("\t| 0.退出系统 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-3):"); } void manager_in() { int n,i,j=0; char managername[10]; char managerpassword[20]; printf("将于3秒后转至manager登录界面"); Sleep(3000); system("cls"); for(i=0;i<3;i++) { printf("\n\t\t\t请输入你的用户名:"); scanf("%s",managername); printf("\n\t\t\t请输入你的密码:"); scanf("%s",managerpassword); if(strcmp(managername,"limengqi")==0&&strcmp(managerpassword,"123456")==0) { printf("\n\t\t\t登录成功!"); Sleep(1000); j=1; managermenu(); break; } else printf("\t\t\t输入用户名或者密码错误!"); continue; } scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; case 6: adm_add(); break; case 7: adm_display(); break; case 8: adm_del(); break; case 9: adm_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); managermenu(); scanf("%d",&n); getchar(); } } void managermenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 6.添加管理员信息 |\n"); printf("\t| 7.浏览管理员信息 |\n"); printf("\t| 8.删除管理员信息 |\n"); printf("\t| 9.修改管理员信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-9):"); } void employee_display() { int i,employee_record; system("cls"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,请先添加职工信息!\n"); else if(employee_record==0) printf("文件中没有职工信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); for(i=0;i<employee_record;i++) printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); } } void employee_add() { FILE *pfemployee;//文件指针 int employee_record,iflagexist,i; char cFlag; system("cls"); employee_record=employeefile("ab+");//ab+追加方式打开或重建二进制文件 if(employee_record==-1) { printf("文件打开失败!\n"); return; } else if(employee_record==0) printf("文件中没有职工信息!\n"); else employee_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfemployee=fopen("employee.txt","ab+"); if( pfemployee==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(employee_record>=EMPLOYEE_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfemployee); return; } printf("请输入职工编号:"); do{ iflagexist=0; scanf("%d",&employeer[employee_record].num); getchar(); for(i=0;i<employee_record;i++) { if(employeer[i].num==employeer[employee_record].num) { iflagexist=1; printf("该职工编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的职工基本信息 printf("请输入职工号:"); scanf("%-6d",&employeer[employee_record].num); getchar(); printf("请输入姓名:"); gets(employeer[employee_record].name); printf("请输入性别:"); scanf("%-10s",&employeer[employee_record].sex); getchar(); printf("请输入年龄:"); scanf("%-6d",&employeer[employee_record].age); getchar(); printf("请输入学历:"); gets(employeer[employee_record].xueli); printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); printf("请输入住址:"); gets(employeer[employee_record].addr); printf("请输入电话:"); gets(employeer[employee_record].tel); /*将新增的职工信息写入文件中*/ if(fwrite(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",employeer[employee_record].num); employee_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfemployee); printf("添加职工信息执行完毕\n"); } int employee_search() { int employeenum,employee_record,employeeid,i; system("cls"); employee_record=employeefile("rb");//以"rb"形式打开文件,如果失败则返回 if(employee_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(employee_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&employeenum); getchar(); for(i=0;i<employee_record;i++) { if(employeenum==employeer[i].num ) { employeeid=i;//找到职工记录,返回记录号 printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==employee_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",employeenum); employeeid=-1; } return employeeid; } void employee_del() { FILE *pfemployee; int employeeid,employee_record,i; char cFlag;//字符型变量用于选择 system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1) return; employee_record=employeefile("rb"); printf("已找到该职工,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=employeeid;i<employee_record-1;i++) employeer[i]=employeer[i+1];//数组依次前移 employee_record--; } pfemployee=fopen("employee.txt","wb"); if(pfemployee!=NULL) { for(i=0;i<employee_record;i++) { if(fwrite(&employeer[i],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfemployee); printf("该职工信息已删除!\n"); } } void employee_xiugai() { int employeeid,employee_record,iflagexist,n,num,i; system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1)//未找到该序号的职工,直接返回 return; //找到该序号的职工,可以进行修改操作 employee_record=employeefile("rb"); showemployee_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入职工编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<employee_record;i++) { if(num==employeer[i].num&&i!=employeeid) { iflagexist=1; printf("错误,该职工编号已存在,请重新输入:"); break; } } }while(iflagexist==1); employeer[employeeid].num=num; break; case 2: printf("请输入职工姓名:"); gets(employeer[employee_record].name); break; case 3: printf("请输入性别:"); scanf("%-10s",employeer[employee_record].sex); getchar(); break; case 4: printf("请输入年龄:"); scanf("%-10d",&employeer[employee_record].age); getchar(); break; case 5: printf("请输入学历:"); gets(employeer[employee_record].xueli); break; case 6: printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); break; case 7: printf("请输入住址:"); gets(employeer[employee_record].addr); break; case 8: printf("请输入电话:"); gets(employeer[employee_record].tel); break; } //调用saveemployeefile函数将修改记录存入文件 saveemployeefile(employeeid); printf("职工信息修改成功!\n"); } void showemployee_xiugaimenu() { printf("\n"); printf("\t| 1.职工号 |\n"); printf("\t| 2.姓名 |\n"); printf("\t| 3.性别 |\n"); printf("\t| 4.年龄 |\n"); printf("\t| 5.学历 |\n"); printf("\t| 6.工资 |\n"); printf("\t| 7.住址 |\n"); printf("\t| 8.电话 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-5):"); } int employeefile(char * pcMode)//该函数负责从文件中读取所有的职工信息,并记录employee_record的值 { int employee_record=0; FILE *pfemployee; pfemployee=fopen("employee.txt",pcMode); if(pfemployee==NULL) return -1; while(!feof(pfemployee)) { if(fread(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)) employee_record++; } fclose(pfemployee); return employee_record; } void saveemployeefile(int employeeid)//该函数专门负责将职工记录号为employeeid的职工信息写入到文件中 { FILE *pfemployee; pfemployee=fopen("employee.txt","a+"); if(pfemployee!=NULL) { fseek(pfemployee,LEN_EMPLOYEE * employeeid,SEEK_SET); if(fwrite(&employeer[employeeid],LEN_EMPLOYEE,1,pfemployee)!=1) printf("无法保存该信息!\n"); } fclose(pfemployee); } void adm_add() { FILE *pfadm;//文件指针 int adm_record,iflagexist,i; char cFlag; system("cls"); adm_record=admfile("ab+");//ab+追加方式打开或重建二进制文件 if(adm_record==-1) { printf("文件打开失败!\n"); return; } else if(adm_record==0) printf("文件中没有职工信息!\n"); else adm_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfadm=fopen("adm.txt","ab+"); if( pfadm==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(adm_record>=ADM_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfadm); return; } printf("请输入管理员编号:"); do{ iflagexist=0; scanf("%d",&admer[adm_record].num); getchar(); for(i=0;i<adm_record;i++) { if(admer[i].num==admer[adm_record].num) { iflagexist=1; printf("该管理员编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的管理员的账户和密码 printf("请输入管理员号:"); scanf("%-6d",&admer[adm_record].num); getchar(); printf("请输入账户:"); gets(admer[adm_record].account); printf("请输入密码:"); gets(admer[adm_record].password); /*将新增的管理员的账户和密码写入文件中*/ if(fwrite(&admer[adm_record],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",admer[adm_record].num); adm_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfadm); printf("添加管理员账户和密码执行完毕\n"); } void adm_display() { int i,adm_record; system("cls"); adm_record=admfile("rb"); if(adm_record==-1) printf("文件打开失败,请先添加管理员信息!\n"); else if(adm_record==0) printf("文件中没有管理员信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-20s %-20s\n","管理员编号","账户","密码"); for(i=0;i<adm_record;i++) printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); } } void adm_del() { FILE *pfadm; int admid,adm_record,i; char cFlag;//字符型变量用于选择 system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1) return; adm_record=admfile("rb"); printf("已找到该管理员,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=admid;i<adm_record-1;i++) admer[i]=admer[i+1];//数组依次前移 adm_record--; } pfadm=fopen("adm.txt","wb"); if(pfadm!=NULL) { for(i=0;i<adm_record;i++) { if(fwrite(&admer[i],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfadm); printf("%d号管理员信息已删除!\n",admer[i].num); } } void adm_xiugai() { int admid,adm_record,iflagexist,n,num,i; system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1)//未找到该序号的管理员,直接返回 return; //找到该序号的管理员,可以进行修改操作 adm_record=admfile("rb"); showadm_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入管理员编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<adm_record;i++) { if(num==admer[i].num&&i!=admid) { iflagexist=1; printf("错误,该管理员编号已存在,请重新输入:"); break; } } }while(iflagexist==1); admer[admid].num=num; break; case 2: printf("请输入管理员账户:"); gets(admer[adm_record].account); break; case 3: printf("请输入管理员密码:"); gets(admer[adm_record].password); break; } //调用saveadmfile函数将修改记录存入文件 saveadmfile(admid); printf("管理员信息修改成功!\n"); } void showadm_xiugaimenu() { printf("\n"); printf("\t| 1.管理员编号 |\n"); printf("\t| 2.账户 |\n"); printf("\t| 3.密码 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-3):"); } int admfile(char * pcMode)//该函数负责从文件中读取所有的管理员信息,并记录adm_record的值 { int adm_record=0; FILE * pfadm; pfadm=fopen("adm.txt",pcMode); if(pfadm==NULL) return -1; while(!feof(pfadm)) { if(fread(&admer[adm_record],LEN_ADM,1,pfadm)) adm_record++; } fclose(pfadm); return adm_record; } void saveadmfile(int admid)//该函数专门负责将管理员记录号为admid的管理员信息写入到文件中 { FILE *pfadm; pfadm=fopen("adm.txt","r+"); if(pfadm!=NULL) { fseek(pfadm,LEN_ADM * admid,SEEK_SET); if(fwrite(&admer[admid],LEN_ADM,1,pfadm)!=1) printf("无法保存该信息!\n"); } fclose(pfadm); } int adm_search() { int admnum,adm_record,admid,i; system("cls"); adm_record=admfile("rb");//以"rb"形式打开文件,如果失败则返回 if(adm_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(adm_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&admnum); getchar(); for(i=0;i<adm_record;i++) { if(admnum==admer[i].num ) { admid=i;//找到职工记录,返回记录号 printf("\t %-6d %-20s %-20s\n","管理员编号","账户","密码"); printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==adm_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",admnum); admid=-1; } return admid; } void adm_in() { int i,n,k,j=-1,adm_record; char admaccount[20]; char admpassword[20]; FILE *fpadm; adm_record=admfile("rb"); printf("将于3秒后转至administrator登录界面"); Sleep(3000); system("cls"); for(k=0;k<3;k++) { printf("\n\t\t\t请输入你的账户名:"); scanf("%s",admaccount); printf("\n\t\t\t请输入你的登入密码:"); scanf("%s",admpassword); for(i=0;i<adm_record;i++) { if(strcmp(admer[i].account,admaccount)==0&&strcmp(admer[i].password,admpassword)==0) { printf("\n\t\t\t登入成功!"); j=1; admmenu(); goto loop; } else printf("\t\t\t用户名或者密码错误,请重新输入:"); break; } } if(j==-1) { printf("\t连续输入错误3次,即将退出程序\n"); Sleep(1000); exit(0); } loop: scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); admmenu(); scanf("%d",&n); getchar(); } } void admmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-5):"); } void employee_in() { int n,employee_record; system("cls"); printf("\n\n\n\n\n"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,你的信息还没有被添加!\n"); else if(employee_record==0) printf("文件中没有你的信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("请输入你的职工号:\n"); scanf("%d",&n); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",employeer[n-1].num,employeer[n-1].name,employeer[n-1].sex,employeer[n-1].age,employeer[n-1].xueli,employeer[n-1].wage,employeer[n-1].addr,employeer[n-1].tel); printf("\t|----------------------------------------------------------|\n"); } }

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

立即提问
相关内容推荐