c语言课程设计 数组or链表 1月13日22点前

C课程设计 题目:学生公共选修课管理系统 一、 功能需求说明(必须采用结构体和动态链表实现) (1)用户登录与主界面模块。负责用户登录窗口的生成、用户名以及用户密码的输入与确认。 (2)输入模块。涉及课程信息(包括开课学院,开课教师工号及姓名,开课课程名,课程学分,考试形式)、学生信息的输入(学生所在院系,学生学号,学生姓名,学生性别,年级)。 (3)查询模块。实现按学号查询、按课程查询、按选课学生所在院系查询 (4)更新模块。主要实现记录的修改、删除和排序操作。 (5)统计模块。查询完成选课的课程信息以及未成功开课的课程信息,查询每门课的选课人数。(若选课人数没有达到50人,则不能开课) (6)选课模块。每个学生每学期选课不能超过3门。可以统计每个学生所选课程的总学分。 (7)可以根据实际情况做功能扩充 二、加分项 (1)使用图形界面。 (4) 使用线、图表示查询记录和统计信息 (3)可参考实际情况对软件进行功能扩充。 三、设计要求 1、不同的模块都要有出错处理,并能给提示。如输入数据错误,文件操作错误等。 2、以上各个功能均编写成子函数,有良好的注释说明,由主函数调用实现。 3、必须采用结构体数组或链表结构进行存储和管理; 4、必须使用文件保存数据 5、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观 要求!!!: 1.只能使用 C 语言,工具采用 TC2.0 或 3.0,源程序要有适当的 注释,使程序容易阅读,所有程序要求使用多文件多函数编程方式。 2.要有用户界面。要求至少采用文本菜单界面;鼓励采用图形菜 单界面,使用文件保存数据,鼓励自行增加新功能。 3.写课程设计报告(要求正规打印,A4 幅面,双面打印),内容 包括:  封面(以附件格式为主)  课程设计题目、内容、要求。  总体设计(包含几大功能模块),画出系统功能模块结构图  详细设计(各功能模块的具体实现,画出相关流程图)  公用数据结构设计及用法说明  各函数模块的功能介绍,程序结构(画流程图),数据结构设 计描述,参数说明等。(画流程图推荐使用 Microsoft Visio 工具)  试验结果(包括输入数据和输出结果)  体会,总结(课程设计完成了哪些功能,有什么扩展功能 有 什么地方需要改进,通过课程设计有何收获,调试程序的体会等)  参考文献

#include<stdio.h>

#include<windows.h>

#include<stdlib.h>

#include<conio.h>

  

typedef unsignedchar uint8_t;

typedef unsignedshort uint16_t;

typedef unsignedint  uint32_t;

  

#define CLASS_CLS  system("cls")

#define CLASS_NAME  80

  

typedef struct class

 {

  char name[CLASS_NAME];/* 课程名称 -- 唯一性 */

  uint32_t nature;   /* 课程性质(必修或者选修) */

  uint32_t total_period;/* 课程总学时 */

  uint32_t teach_period;/* 授课学时 */

  uint32_t exper_period;/* 上机学时 */

  uint32_t start_time; /* 课程开始时间 */

  uint8_t score;    /* 课程学分 */

  uint8_t is_exsit;   /* 课程是否存在 */

  struct class *next;

 } class_t;// 课程结构体

  

class_t *head = NULL;

static uint32_t count = 1;

  

void play(char *text,int display,int time,int nu)//动画打印

{

 CLASS_CLS;

 int i, len;

 for(i = 0; i <= nu; i++)

 {

  printf("\n");

 }

 for(i = 0; i < 25; i++)

 {

  printf(" ");

 }

 len =strlen(text);

 for(i = 0; i < len; i++)

 {

  printf("%c", text[i]);

  Sleep(display);

 }

 Sleep(time);

}

  

void titile(char *text,char *str)

{

 CLASS_CLS;

 uint8_t i;

 for(i = 0; i < 25; i++)

 {

  printf(" ");

 }

 printf("%s\n", text);

 for(i = 0; i <= 60; i++)

 {

  printf("%s", str);

 }

 printf("\n");

}

  

void menu(void)

{

 titile("【学生选课系统】","-");

 printf("\n\t|-----------------------------------|");

 printf("\n\t|      [1]--增加课程     |");

 printf("\n\t|      [2]--浏览课程     |");

 printf("\n\t|      [3]--查询课程     |");

 printf("\n\t|      [4]--删除课程     |");

 printf("\n\t|      [5]--修改课程     |");

 printf("\n\t|      [Q]--退出系统     |");

 printf("\n\t|-----------------------------------|");

}

  

void get_bat_data(void)

{

 class_t *point, *q;

 uint32_t count = 0;

 FILE *fp =fopen("c:\\student_elective.dat","rb");

 rewind(fp);

  

 point = (class_t *)malloc(sizeof(class_t));

 head = point;

  

 while(!feof(fp))

 {

  count++;

  fread(point,sizeof(class_t), 1, fp);

  point->next = (class_t *)malloc(sizeof(class_t));

  q = point;

  point = point->next;

 }

 q->next = NULL;

 fclose(fp);

}

  

void save_bat_data(void)

{

 class_t *point = head;

 FILE *fp =fopen("c:\\student_elective.dat","w+");

  

 while(NULL != point)

 {

  count++;

  fwrite(point,sizeof(class_t), 1, fp);

  point = point->next;

 }

 fclose(fp);

}

  

uint32_t num_check(void)

{

 char ch;

 uint32_t sum = 0;

  

 while(1)

 {

  ch = getch();

  if('\n' == ch ||'\r' == ch)

  {

   return sum;

  }

  else if('\b' == ch)

  {

   sum /= 10;

   printf("\b \b");

  }

  else if(('0' <= ch) && ('9' >= ch))

  {

   sum *= 10;

   sum += ch -'0';

   printf("%d", ch -'0');

  }

 }

  

}

  

void create(void)

{

 class_t *point, *q;

 char tmp[CLASS_NAME], ch;

 uint8_t flag = 0;

  

 while(1)

 {

  if(1 != count)

  {

   printf("是否继续增加课程(y/n):");

   gets(tmp);

   if(strcmp(tmp,"n") == 0)

   {

    break;

   }

  }

  

  point = (class_t *)malloc(sizeof(class_t));

  point->is_exsit = 0;

  printf("\n====请输入第%d个选修课程信息====\n", count);

  printf("选择课程名称:");

  gets(point->name);

  q = head;

  while(NULL != q)

  {

   if(strcmp(q->name, point->name) == 0)

   {

    flag = 1;

    printf("课程名称重复或者不合格,请重新输入...\n");

    break;

   }

   q = q->next;

  }

  if(1 == flag)

  {

   continue;

  }

  

  printf("课程性质:");

  printf("\n[B]--【必修】 [X]--【选修】");

  while(1)

  {

   ch = getch();

   if(ch =='b' || ch =='B')

   {

    point->nature = 1;

    break;

   }

   if(ch =='x' || ch =='X')

   {

    point->nature = 2;

    break;

   }

  }

  

  printf("\n输入总学时:(只接受数字!)");

  point->total_period = num_check();

  printf("\n输入授课学时:(只接受数字!)");

  point->teach_period = num_check();

  printf("\n输入上机学时:(只接受数字!)");

  point->exper_period = num_check();

  printf("\n输入本课程学分:(只接受数字!)");

  point->score = num_check();

  printf("\n输入开课学期:(只接受数字!)");

  point->start_time = num_check();

  point->is_exsit = 1;

  

  point->next = head;

  head = point;

  count++; 

 }

  

 printf("信息录入完毕,按任意键继续……");

 getch();

}

  

void display(void)

{

 class_t *point = head;

  

 CLASS_CLS;

 titile("【查看课程】","-");

 printf("\n名称      \t性质\t总学时\t授课学时\t上机学时\t学分\t开课学期");

  

 while(NULL != point)

 {

  if(1 == point->is_exsit)

  {

   printf("\n%-14s  ", point->name);

   if(1 == point->nature)

   {

    printf("必修课");

   }

   else

   {

    printf("选修课");

   }

   printf("   %d时   %d时      %d时      %d分   %d时", point->total_period, point->teach_period, point->exper_period, point->score, point->start_time);

  }

  point = point->next;

 }

 getch();

}

// 对照学生管理系统自行拓展

void search(void)

{

  

}

  

void modify(void)

{

  

}

  

void delete(void)

{

  

}

  

int main(void)

{

 uint8_t value;

 uint8_t movie = 1;

 char choice[3];

  

 FILE *fp =fopen("c:\\student_elective.dat","a");

 fclose(fp);

  

 system("color 30");

 system("mode con:cols=100 lines=35");

 system("title 【选修课系统】");

  

 if(1 == movie)

 {

  play("欢迎使用【选修课系统】", 80, 1500, 10);

 }

  

 while(1)

 {

  CLASS_CLS;

  menu();

  do

  {

   gets(choice);

   value =atoi(choice);

  }

  while((value > 12) || (value < 0));

  switch(value)

  {

  case 1:

   create();

   break;

  case 2:

   display();

   break;

  case 3:

   search();

   break;

  case 4:

   modify();

   break;

  case 5:

   delete();

   break;

  case 6:

   save_bat_data();

   break;

  case 7:

   get_bat_data();

   break;

  case 8:

   exit(1);

   break;

  

  default:

   break;

  }

 }

  

 return 0;

}

数组的长度是固定的,但是链表可以任意一个长度

所以你可以采用很多相关的技术,来灵活的运用

不一定说链表就比数组要好,这是程序中特殊的情况造成的

但是你最好还是两个办法都事先下

实现了这样的功能,程序的完备性可以得到提高

一般来说数组我们可以使用变量来定义的

而结构体的定义就可以借助链表了

推荐使用链表,链表的应用,将结构体涵盖其中,结构体的定义和应用,是C语言程序设计的升华。

通过链表,可以很容易实现节点的增加和删除,不需要像数组一样,逐个遍历之后还有移动前后元素。

当然,数组的随机查询是非常方便的,这是牺牲了内存空间的,数组的定义必须是一个完整的连续空间,而链表中节点可以是离散分布,不需要连续分布。对于一个系统来说,存储的数据量非比较大,使用链表的话,更合适。

楼上大哥说的很对,在存储对象长度未知的情况下使用链表是最合适的,插入与删除都比较方便,数组一旦确定长度就无法进行插入与删除。课设设计自己做一下对C语言的学习有很大长进。