成绩管理系统

/* file name: slist.c */
/* 单向键结链表,插入、删除使用排序 */

//学会对文件操作文件操作和单链表一起使用
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

void read_func(void);
void write_func(void);
void insert_func(void);
void sort_func(void);
void delete_func(void);
void display_func(void);
void modify_func(void);
void anykey_func(void);

struct student
{
 char name[20];
 int score;
 struct student *next;
};

struct student *ptr, *head, *current, *prev;//全部声明为全局变量

int main(void)
{
 char option1;

 system("cls");//清屏
 read_func();
 while(1)
 {
  printf("****************************************/n");
  printf("              1.insert/n");
  printf("              2.delete/n");
  printf("              3.display/n");
  printf("              4.modify/n");
  printf("              5.quit/n");
  printf("****************************************/n");
  printf("   Please enter your choice (1-5)...");
  option1=getche();
  printf("/n");
  switch(option1)
  {
   case '1':
    insert_func();
    break;
   case '2':
    delete_func();
    break;
   case '3':
    display_func();
    break;
   case '4':
    modify_func();
    break;
   case '5':
      // write_func();
    exit(0);//这里也处理的比较好
  }
 }
}

void read_func(void)
{
 FILE *fptr;

 head=(struct student *) malloc(sizeof(struct student));
 head->next = NULL;
 
 /* 开始时,若表中不存在数据,则要求输入第一笔数据 */
 if((fptr=fopen("slist.dat","r")) == NULL)
 {
  printf(" Data file not exist/n");
  printf(" Press any key to edit first record.../n");
  getch();
  insert_func();//不存在就实行插入操作
 }
 else
 {
  ptr=(struct student *) malloc(sizeof(struct student));
  while(fscanf(fptr, "%s %d", ptr->name, &ptr->score) != EOF)
  {
   sort_func();
   ptr=(struct student *) malloc(sizeof(struct student));
  }
  fclose(fptr);
 }
}

void write_func(void)
{
 FILE *fptr;
 
    fptr=fopen("slist.dat","w");
 current=head->next;
 while(current != NULL)
 {
  fprintf(fptr, "%s %d/n", current->name, current->score);
  current = current->next;
 }
 fclose(fptr);
}

void insert_func(void) //一插入就比较字符串(2 2想比较很简单) 不是等到全部插完了才比较  
{
 char s_temp[4];
 ptr=(struct student *) malloc(sizeof(struct student));
 printf(" Student name : ");
 gets(ptr->name);
 printf(" Student score: ");
 gets(s_temp);
 ptr->score = atoi(s_temp);//把字符串转化为 整数  为什么不直接把成绩存在ptr->score ???
   
 sort_func();
}

/*以分数高低由大到小排列*/
void sort_func(void)
{
 //插入数据
 prev = head;
 current = head->next;
 while ((current != NULL) && (current->score > ptr->score))
 {
  prev = current;
  current = current->next;
 }
 ptr->next = current;
 prev->next = ptr;
}

void delete_func(void)
{
 char del_name[20];
 printf(" Delete student name: ");
 gets(del_name);
 
 prev = head;
 current = head->next;
    while ((current != NULL) && (strcmp(current->name , del_name)!=0))//用到了strcmp 比较字符串
 {
  prev = current;
  current = current->next;
 }
 if (current != NULL)
 {
  prev->next = current->next;
  free(current);
  printf(" %s student record deleted/n",del_name);
 }
 else
  printf(" Student %s not found/n",del_name);

 anykey_func();
}

void modify_func(void)
{
 char n_temp[20],s_temp[4];
 printf(" Modify student name: ");
 gets(n_temp);//这样输入姓名
 current=head->next;

 while ((current != NULL) && (strcmp(current->name , n_temp)!=0))
 {
  prev = current;
  current = current->next;
 }
 if (current != NULL)
 {
  printf(" **************************/n");
  printf("  Student name : %s/n",current->name);
  printf("  Student score: %d/n",current->score);
  printf(" **************************/n");
  printf(" Please enter new score: ");
  gets(s_temp);
  current->score = atoi(s_temp);
  printf(" %s student record modified/n",n_temp);
 }
 else
  printf(" Student %s not found/n",n_temp);

 anykey_func();
}

void display_func(void)
{
 int count=0;
 system("cls");
 if(head->next == NULL)
 {
  printf(" No student record/n");
 }
 else
 {
  printf("  NAME                SCORE/n");
  printf(" ---------------------------/n");
  current=head->next;
  while(current != NULL)
  {
   printf("  %-20s %3d/n", current->name, current->score);
   count++;
   current=current->next;
   if(count % 20 == 0) getch();
  }
  printf(" ---------------------------/n");
  printf(" Total %d record(s) found/n", count);
 }
 anykey_func();
}

void anykey_func(void)//任何键继续
{
 printf(" Press any key to continue...");
 getch();
 printf("/n");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值