[C/OC的那点事儿]学生成绩管理系统(易错点的解析,文件的加载和保存)

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值