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

学生成绩管理系统(易错点的解析,文件的加载和保存)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.录入学生信息

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

2.文件的载入

欢迎大家来到IT世界,在知识的湖畔探索吧!//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指针的响应移动,这样子可以减小时间复杂度.

代码如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!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/16886095

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

(0)

相关推荐

发表回复

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

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信