通信工程C语言课程设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“通信工程课程设计报告”。
通信工程C语言强化训练实验报告
学 号:
4090710 姓 名: 张亮 提交日期: 成 绩: 评 语:
教师签字:
东北大学秦皇岛分校计算机工程系
6.26
通信工程C语言强化训练实验报告
学生信息管理程序
1、强化训练目的a)C语言基本知识的巩固和综合运用。基本数据类型、基本控制结构、数组、指针、函数、结构体和共用体。
b)C语言高级编程。链表基本操作、文件的基本操作、图形和声音制作。c)程序的结构化设计。
d)编辑、设置、编译、调试、执行。e)C语言结合实际问题的综合设计。
2、设计题目功能
对学生信息进行管理,能够完成学生信息的增、删、改、查找等功能。
数据文件名40607.dat。
学生信息至少包括学号、姓名、性别、出生日期、宿舍号等基本信息。
3、设计题目要求
1有主界面和主菜单
2以班级为单位用链表存放学生信息
3可以实现按学号、姓名、宿舍号查询和统计并在屏幕上输出查询结果 4友好的界面和操作提示
[A]信息录入 [D]信息删除 [F]信息查询 [Q]退出
4、程序流程图
—— 2 ——
通信工程C语言强化训练实验报告
5.主要代码
#include #include
#include /*其它说明*/ #include /*字符串函数*/
#include /*内存操作函数*/ #include /*字符操作函数*/ #include “conio.h”
#define LEN sizeof(STUDENT)
typedef struct stu /*定义结构体数组用于缓存数据*/ {char num[6];char name[5];int score[3];int sum;
float average;int order;
struct stu *next;}STUDENT;
/*函数原型*/
STUDENT *init();/*初始化函数*/ int menu_select();/*菜单函数*/ STUDENT *create();/*创建链表*/
void print(STUDENT *head);/* 显示全部记录*/ void search(STUDENT *head);/*查找记录*/
STUDENT *mydelete(STUDENT *head);/*删除记录*/ STUDENT *sort(STUDENT *head);/*排序*/
STUDENT *insert(STUDENT *head,STUDENT *mynew);/*插入记录*/ void save(STUDENT *head);/*保存文件*/ STUDENT *load();/*读文件*/
/*主函数界面*/ void main()
{STUDENT *head,mynew;
head=init();/*链表初始化,使head的值为NULL*/ for(;;)/*循环无限次*/ {switch(menu_select()){
case 1:head=create();break;case 2:print(head);break;case 3:search(head);break;
case 4:head=mydelete(head);break;case 5:head=sort(head);break;
case 6:head=insert(head,&mynew);break;/*&mynew表示返回地址*/ case 7:save(head);break;
—— 3 ——
通信工程C语言强化训练实验报告
case 8:head=load();break;
case 9:exit(0);/*如菜单返回值为9则程序结束*/ } } }
/*初始化函数*/ STUDENT *init(){
return NULL;/*返回空指针*/ }
/*菜单选择函数*/ menu_select(){int n;
printf(“n按任一键进入主菜单......npre any key to enter the menu......”);/*按任一键进入主菜单*/ getch();/*从键盘读取一个字符,但不显示于屏幕*/ system(“cls”);
printf(“********************************************************************************n”);
printf(“tt 欢迎 Welcome ton”);
printf(“nttt 使用学生管理系统1.0nntttttn”);
printf(“*************************************MENU***************************************n”);
printf(“ttt1.输入学生成绩记录 Enter the recordn”);/*输入学生成绩记录*/ printf(“ttt2.显示 Print the recordn”);/*显示*/
printf(“ttt3.寻找 Search record on namen”);/*寻找*/ printf(“ttt4.删除 mydelete a recordn”);/*删除*/
printf(“ttt5.排序 Sort to make mynew a filen”);/*排序*/ printf(“ttt6.插入 Insert record to listn”);/*插入*/ printf(“ttt7.保存 Save the filen”);/*保存*/ printf(“ttt8.读取 Load the filen”);/*读取*/ printf(“ttt9.退出 Quitn”);/*退出*/
printf(“********************************************************************************n”);do{
printf(“nttt输入你的选择Enter your choice(1~9):”);scanf(“%d”,&n);
}while(n9);/*如果选择项不在1~9之间则重输*/
return(n);/*返回选择项,主函数根据该数调用相应的函数*/ }
/*输入函数*/
STUDENT *create(){int i,s;
STUDENT *head=NULL,*p;/* 定义函数.此函数带回一个指向链表头的指针*/ system(“cls”);for(;;)
—— 4 ——
通信工程C语言强化训练实验报告
{p=(STUDENT *)malloc(LEN);/*开辟一个新的单元*/ if(!p)/*如果指针p为空*/
{printf(“n输出内存溢出.Out of memory.”);/*输出内存溢出*/ return(head);/*返回头指针,下同*/ }
printf(“输入学号Enter the num(0:list end):”);scanf(“%s”,p->num);
if(p->num[0]=='0')break;/*如果学号首字符为0则结束输入*/ printf(“输入名字Enter the name:”);scanf(“%s”,p->name);
printf(“请输入3门成绩Please enter the %d scoresn”,3);/*提示开始输入成绩*/ s=0;/*计算每个学生的总分,初值为0*/ for(i=0;i
printf(“成绩score%d:”,i+1);scanf(“%d”,&p->score[i]);
if(p->score[i]score[i]>100)/*确保成绩在0~100之间*/ printf(“数据错误,请重新输入 Data error,please enter again.n”);}while(p->score[i]score[i]>100);s=s+p->score[i];/*累加各门成绩*/ }
p->sum=s;/*将总分保存*/
p->average=(float)s/3;/*先用强制类型转换将s转换成float型,再求平均值*/ p->order=0;/*未排序前此值为0*/
p->next=head;/*将头结点做为新输入结点的后继结点*/ head=p;/*新输入结点为新的头结点*/ }
return(head);}
/* 显示全部记录函数*/ void print(STUDENT *head){int i=0;/* 统计记录条数*/ STUDENT *p;/*移动指针*/ system(“cls”);
p=head;/*初值为头指针*/
printf(“n************************************STUDENT************************************n”);
printf(“-----------------n”);printf(“| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |n”);
printf(“-----------------n”);while(p!=NULL){ i++;
printf(“| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n”,i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);p=p->next;
—— 5 ——
通信工程C语言强化训练实验报告
}
printf(“-----------------n”);
printf(“**************************************END**************************************n”);}
/*查找记录函数*/
void search(STUDENT *head){STUDENT *p;/* 移动指针*/
char s[5];/*存放姓名用的字符数组*/ system(“cls”);
printf(“请输入个姓名来查找.Please enter name for searching.n”);scanf(“%s”,s);
p=head;/*将头指针赋给p*/
while(strcmp(p->name,s)&& p!= NULL)/*当记录的姓名不是要找的,或指针不为空时*/ p=p->next;/*移动指针,指向下一结点*/ if(p!=NULL)/*如果指针不为空*/
{printf(“n*************************************FOUND************************************n”);
printf(“-----------------n”);printf(“| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |n”);
printf(“-----------------n”);printf(“| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n”,p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);printf(“-----------------n”);
printf(“***************************************END**************************************n”);} else
printf(“n没有该学生 There is no num %s student on the list.n”,s);/*显示没有该学生*/ }
/*删除记录函数*/
STUDENT *mydelete(STUDENT *head){int n;
STUDENT *p1,*p2;/*p1为查找到要删除的结点指针,p2为其前驱指针*/ char c,s[6];/*s[6]用来存放学号,c用来输入字母*/ system(“cls”);
printf(“请输入要删除的学号 Please enter the mydeleted num: ”);scanf(“%s”,s);
p1=p2=head;/*给p1和p2赋初值头指针*/
while(strcmp(p1->num,s)&& p1!= NULL)/*当记录的学号不是要找的,或指针不为空时*/ {p2=p1;/*将p1指针值赋给p2作为p1的前驱指针*/ p1=p1->next;/*将p1指针指向下一条记录*/ }
if(strcmp(p1->num,s)==0)/*学号找到了*/
{printf(“**************************************FOUND************************************n”);
printf(“-----------------n”);
—— 6 ——
通信工程C语言强化训练实验报告
printf(“| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |n”);
printf(“-----------------n”);printf(“| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n”,p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);printf(“-----------------n”);
printf(“***************************************END**************************************n”);
printf(“n是否要删除,输入Y删除,N则退出nAre you sure to mydelete the student Y/N ?”);/*提示是否要删除,输入Y删除,N则退出*/ for(;;)
{scanf(“%c”,&c);
if(c=='n'||c=='N')break;/*如果不删除,则跳出本循环*/ if(c=='y'||c=='Y'){
if(p1==head)/*若p1==head,说明被删结点是首结点*/ head=p1->next;/*把第二个结点地址赋予head*/ else
p2->next=p1->next;/*否则将一下结点地址赋给前一结点地址*/ n=n-1;
printf(“n学号为(Num): %s 学生以被删除(student have been mydeleted.)n”,s);printf(“别忘了保存.Don't forget to save.n”);break;/*删除后就跳出循环*/ } } } else
printf(“n没有这个学生在表上nThere is no num %s student on the list.n”,s);/*找不到该结点*/ return(head);}
/*排序函数*/
STUDENT *sort(STUDENT *head){int i=0;/*保存名次*/
STUDENT *p1,*p2,*t,*temp;/*定义临时指针*/
temp=head->next;/*将原表的头指针所指的下一个结点作头指针*/ head->next=NULL;/*第一个结点为新表的头结点*/ while(temp!=NULL)/*当原表不为空时,进行排序*/ {
t=temp;/*取原表的头结点*/
temp=temp->next;/*原表头结点指针后移*/ p1=head;/*设定移动指针p1,从头指针开始*/
p2=head;/*设定移动指针p2做为p1的前驱,初值为头指针*/
while(t->average
average&&p1!=NULL)/*作成绩平均分比较*/ {
p2=p1;/*待排序点值小,则新表指针后移*/ p1=p1->next;}
if(p1==p2)/*p1==p2,说明待排序点值大,应排在首位*/ {
—— 7 ——
通信工程C语言强化训练实验报告
t->next=p1;/*待排序点的后继为p*/ head=t;/*新头结点为待排序点*/ }
else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/ {
t->next=p1;/*t的后继是p1*/ p2->next=t;/*p2的后继是t*/ } }
p1=head;/*已排好序的头指针赋给p1,准备填写名次*/ while(p1!=NULL)/*当p1不为空时,进行下列操作*/ {
i++;/*结点序号*/
p1->order=i;/*将结点序号赋值给名次*/ p1=p1->next;/*指针后移*/ }
printf(“排序成功 Sorting is suceful.n”);/*排序成功*/ return(head);}
/*插入记录函数*/
STUDENT *insert(STUDENT *head,STUDENT *mynew){STUDENT *p0,*p1,*p2;int n,sum1,i;
p1=head;/*使p1指向第一个结点*/ p0=mynew;/*p0指向要插入的结点*/
printf(“nPlease enter a mynew record.n”);/*提示输入记录信息*/ printf(“输入学号Enter the num:”);scanf(“%s”,mynew->num);
printf(“输入名字Enter the name:”);scanf(“%s”,mynew->name);
printf(“Please enter the %d scores.n”,3);sum1=0;/*保存新记录的总分,初值为0*/ for(i=0;i
printf(“成绩score%d:”,i+1);scanf(“%d”,&mynew->score[i]);
if(mynew->score[i]>100||mynew->score[i]
printf(“数据错误Data error,please enter again.n”);}while(mynew->score[i]>100||mynew->score[i]score[i];/*累加各门成绩*/ }
mynew->sum=sum1;/*将总分存入新记录中*/ mynew->average=(float)sum1/3;mynew->order=0;
if(head==NULL)/*原来的链表是空表*/
{head=p0;p0->next=NULL;} /*使p0指向的结点作为头结点*/
—— 8 ——
通信工程C语言强化训练实验报告
else
{while((p0->average
average)&&(p1->next!=NULL)){p2=p1;/*使p2指向刚才p1指向的结点*/ p1=p1->next;/*p1后移一个结点*/ }
if(p0->average>=p1->average)
{if(head==p1)head=p0;/*插到原来第一个结点之前*/ else p2->next=p0;/*插到p2指向的结点之后*/ p0->next=p1;} else
{p1->next=p0;p0->next=NULL;} /*插到最后的结点之后*/ }
n=n+1;/*结点数加1*/
head=sort(head);/*调用排序的函数,将学生成绩重新排序*/
printf(“n学生Student %s 已被更新have been inserted.n”,mynew->name);printf(“不要忘了保存Don't forget to save the mynew file.n”);return(head);}
/*保存数据到文件函数*/ void save(STUDENT *head)
{FILE *fp;/*定义指向文件的指针*/ STUDENT *p;/* 定义移动指针*/ char outfile[10];
printf(“输出文件例如:c:score Enter outfile name,for example c:scoren”);scanf(“%s”,outfile);
if((fp=fopen(outfile,“w”))==NULL)/*为输出打开一个二进制文件,为只写方式*/ {
printf(“打不开文件Cannot open the filen”);return;/*若打不开则返回菜单*/ }
printf(“n保存中...Saving the file......n”);p=head;/*移动指针从头指针开始*/ while(p!=NULL)/*如p不为空*/ {
fwrite(p,LEN,1,fp);/*写入一条记录*/ p=p->next;/*指针后移*/ }
fclose(fp);/*关闭文件*/
printf(“保存成功....Save the file succefully!n”);}
/* 从文件读数据函数*/ STUDENT *load()
{STUDENT *p1,*p2,*head=NULL;/*定义记录指针变量*/ FILE *fp;/* 定义指向文件的指针*/ char infile[10];
printf(“倒入文件例如:c:score Enter infile name,for example c:scoren”);
—— 9 ——
通信工程C语言强化训练实验报告
scanf(“%s”,infile);
if((fp=fopen(infile,“r”))==NULL)/*打开一个二进制文件,为只读方式*/ {
printf(“打不开文件Can not open the file.n”);return(head);}
printf(“n寻找文件...Loading the file!n”);
p1=(STUDENT *)malloc(LEN);/*开辟一个新单元*/ if(!p1){
printf(“内存溢出!Out of memory!n”);return(head);}
head=p1;/*申请到空间,将其作为头指针*/ while(!feof(fp))/*循环读数据直到文件尾结束*/ {
if(fread(p1,LEN,1,fp)!=1)break;/*如果没读到数据,跳出循环*/ p1->next=(STUDENT *)malloc(LEN);/*为下一个结点开辟空间*/ if(!p1->next){
printf(“Out of memory!n”);return(head);}
p2=p1;/*使p2指向刚才p1指向的结点*/
p1=p1->next;/*指针后移,新读入数据链到当前表尾*/ }
p2->next=NULL;/*最后一个结点的后继指针为空*/ fclose(fp);
printf(“n你成功的从文件中读取了数据!nYou have succe to read data from the file!n”);return(head);}
—— 10 ——
通信工程C语言强化训练实验报告
—— 11 ——
通信工程C语言强化训练实验报告
—— 12 ——
通信工程C语言强化训练实验报告
6、强化训练心得体会
首先要感慨一下,这是我编的最长的一个程序,从开始拿到这个程序时候的迷茫、一无所知,到最后能够运行处这个程序,可谓经历了很多,但也感受到了那份成功后的欣然。在进行编程之前,首先复习一下c语言课本,回想起那些基本知识,然后根据题意的具体要求,看需要哪些基本原理,并将整体思路想一遍。
在编写程序的过程中,也犯了许多错误,没有该犯与不该犯,反正都犯了!这也是在提醒我,做事一定要仔细认真,并且一定要有耐心,我们小组成员在一次又一次的修改,一次又一次的运行之后,终于把这个程序运行成功。在这期间,也让我体会到,实践和自己在书上编程序,存在一定的差距,这也就是实践的意义所在,增强我们的动手能力,增强我们在临场的思考能力,和应变能力!
在此期间我们也产生了团队默契,增强了团队合作能力,这一点让我终生受益!同时也让我温故一下c语言知识,让我对他不会感觉陌生,例如:数组与指针的应用。与此同时也让我学会了许多新的知识,可谓受益匪浅。
—— 13 ——
通信工程C语言强化训练实验报告
—— 14 ——