学生成绩管理系统(易错点的解析,文件的加载和保存)

学生成绩管理系统(易错点的解析,文件的加载和保存)1.录入学生信息2.打印学生信息3.保存学生信息4.读取学生信息5.统计学生信息6查找学生信息7修改某个学生的信息难点的处理1.文件的操作数据写

大家好,欢迎来到IT知识分享网。
学生成绩管理系统(易错点的解析,文件的加载和保存)"

1.录入学生信息2.打印学生信息3.保存学生信息4.读取学生信息5.统计学生信息6查找学生信息7修改某个学生的信息

难点的处理

1.文件的操作

数据写入文件

fp:fopen的时候关键字 w,r a 都需要小写.

p = head;

while(p != NULL)

{

fprintf(fp,”%s,%d,%d,%d”,p->stu.name,p->stu.number,p->st.age,p->stu.score);

p = p->next;

}

//写入文件的时候,尽可能添加/n,以防止 头尾相接….成一个运算符或者数字

读出文件

while(!feof(fp))

{

Node *node = malloc…

fscaf(fp,”%s,%d,%d,%d\n”,node->stu.name,&node->stu.number,…..);

//写入的格式和写出的格式相同才行.

if(head == null)

{

head = node;

p =head

}

else

p->next = node;

if(p->next != NULL)

p = node;

}

2.节点的删除

当我们移除某个节点并重新连接之后,一定要free(the Node),放置空间的占用.

while(p -> next != null)

if(p->next->stu.number == num)

{

node *p2;

p2 = p->next;

if(p2->next != null)

p->next = p2->next;

else

p->next = null;

p = p->next;

free(p2);

}

在实现的时候出现了几个难点.再次阐述下自己的想法.

1.我们需要把头指针 NodeLinkList定义在什么位置?

一般来说,我们在定义 head 的时候,定义在 main函数中.这也是我以前的作法.今天我把这个head 定义在 全局变量上,而不是在mian函数中.这样子的话,我再定义函数的时候 直接就调用了这个head ,省去了在函数参数中传值那样的麻烦操作.

NodeLinkList head = NULL; //1.录入学生信息

仔细看看我的函数实现代码,就会发现,我基本没有使用参数,就是因为我把head 定义在了外边.真的很不错的感觉~

2.文件的载入

//3.保存学生信息 void saveStudent() { printf("\n存储学生信息到文件:\n"); NodeLinkList p = head; FILE *fp; char lastfilename[20]; char prefileName[50] = "/Users/len/Desktop/"; printf("请输入文件夹名称:"); scanf("%s",lastfilename); char *filename = strcat(prefileName, lastfilename); printf("文件夹路径为: %s\n",filename); if (!(fp = fopen(filename, "a"))) { printf("文件打开失败.\n"); } else { while (p) { fprintf(fp, "%d\t%s\t%d\t%f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score); p = p->next; } printf("文件保存成功!\n"); } fclose(fp); }

当我在文件载入的时候,考虑到了 结构体之间的间距用什么来表示呢 ?起初用的时 ” “,发现能够成功执行.

后来就改为了 /t /n.fscaf 里面是可以使用 /t /n的.这和 scanf 函数可是一个很大的区别哦

我感觉文件的输入输出和 控制台的输入输出恰恰相反有木有?

3.文件的加载

说文件的加载,有点宽泛,恰当的说应该是结构体文件的加载.说实话这可真的难倒我了. 刚开始的时候想使用 !feof(fp)来实现加载,但是没有成功.

后来就是用了

while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF) { }

来实现加载.我们应该理解到 fscanf文件的加载是读取完之后 fp指针下移.

而且,我们在实现文件的加载的时候, 一定要记住 p指针的响应移动,这样子可以减小时间复杂度.

代码如下:

else { newNode = malloc(sizeof(Node)); while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF) { p->next = newNode; newNode->next = NULL; p = newNode; newNode = malloc(sizeof(Node)); } 

好了,完整的代码有啦~~如下:

但是有一个提醒,这个文件加载之后会多出来一行 0 0 0 0.0的问题,暂时还没有解决.有想法的朋友给小弟支支招吧~~~

打印学生信息:

0 0 0.0

1 2 3 4.0

3 4 5 0.0

 // // main.c // 学生成绩管理系统 // // Created by lichan on 13-11-22. // Copyright (c) 2013年 com.lichan. All rights reserved. // #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAMELENGTH 10 typedef struct _student{ int id; char name[NAMELENGTH]; int age; float score; }student; typedef struct _Node { student stu; struct _Node *next; }Node,*NodeLinkList; NodeLinkList head = NULL; //1.录入学生信息 void inputStudent() { printf("\n录入学生信息\n:"); Node *newNode = malloc(sizeof(Node)); newNode->next = NULL; printf("请输入学生信息(格式:班级 姓名 年龄 分数):"); scanf("%d %s %d %f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score); NodeLinkList p = head; if (head == NULL) { head = malloc(sizeof(Node)); head = newNode; } else { while (p->next) p = p->next; p->next = newNode; } printf("%s 同学信息成绩录入成功.\n",newNode->stu.name); } //2.打印学生信息 void printStudent() { printf("\n打印学生信息:\n"); NodeLinkList p =head; while (p!= NULL) { printf("%d %s %d %3.1f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score); p = p->next; } } //3.保存学生信息 void saveStudent() { printf("\n存储学生信息到文件:\n"); NodeLinkList p = head; FILE *fp; char lastfilename[20]; char prefileName[50] = "/Users/len/Desktop/"; printf("请输入文件夹名称:"); scanf("%s",lastfilename); char *filename = strcat(prefileName, lastfilename); printf("文件夹路径为: %s\n",filename); if (!(fp = fopen(filename, "a"))) { printf("文件打开失败.\n"); } else { while (p) { fprintf(fp, "%d\t%s\t%d\t%f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score); p = p->next; } printf("文件保存成功!\n"); } fclose(fp); } //4.读取学生信息 void loadStudent() { printf("\n从文件读取学生信息:\n"); FILE *fp; char lastfilename[20]; printf("请输入所要读取的文件名称:"); scanf("%s",lastfilename); char prefileName[50] = "/Users/len/Desktop/"; char *fimename = strcat(prefileName, lastfilename); head = malloc(sizeof(Node)); NodeLinkList newNode,p =head; if (!(fp =fopen(fimename, "r") ) ) { printf("文件打开失败.\n"); } else { newNode = malloc(sizeof(Node)); while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF) { p->next = newNode; newNode->next = NULL; p = newNode; newNode = malloc(sizeof(Node)); } printf("文件加载成功!\n"); // head = p->next; } fclose(fp); } //5.统计学生信息 void countStudent() { printf("\n统计学生信息:\n"); NodeLinkList p =head; int count = 0; while (p) { p = p->next; count++; } printf("一共有%d 位同学.\n",count); } //6查找学生信息 void findStudent() { printf("\n查找学生信息:\n"); printf("请输入索要查询同学的学号:"); int sid ; scanf("%d",&sid); NodeLinkList p = head; while (p) { if (p->stu.id == sid) { break; } p = p->next; } printf("索要查询的学号为%d 的同学信息为:\n",sid); printf("%d %s %d %3.1f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score); } //7修改某个学生的信息 void modifyStudent() { printf("\n修改学生信息:\n"); printf("请输入索要修改的同学的学号:"); int sid ; scanf("%d",&sid); NodeLinkList p = head; while (p) { if (p->stu.id == sid) { break; } p = p->next; } printf("请输入学号为%d 的学生信息(格式:班级 姓名 年龄 分数):",sid); scanf("%d %s %d %f",&p->stu.id,p->stu.name, &p->stu.age,&p->stu.score); } int main(int argc, const char * argv[]) { printf("欢迎使用学生成绩管理系统(version1.0):\n\n"); while (1) { printf("请进行功能选择:\n"); printf("1 录入 2打印\n"); printf("3 保存 4读取\n"); printf("5 统计 6查找\n"); printf("7 修改 8~退出\n"); int ch ; scanf("%d",&ch); getchar(); switch (ch) { case 1: inputStudent(); break; case 2: printStudent(); break; case 3: saveStudent(); break; case 4: loadStudent(); break; case 5: countStudent(); break; case 6: findStudent(); break; case 7: modifyStudent(); break; case 8: return 0; default: return 0; } } // insert code here... printf("Hello, World!\n"); return 0; } 

————————————————

版权声明:本文为CSDN博主「Ministarler」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ministarler/article/details/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/60341.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信