1、C高级编程试验指导书试验一 进制转换一、试验要求采取模块化程序设计完成进制转换。由键盘输入一个十进制正整数,然后将该数转换成指定进制数(二、八、十六)形式输出。指定进制由用户输入。二、试验目标1、熟悉C环境安装、使用。2、承上启下,复习C程序设计等基础课程知识。3、掌握C语言编程方法。三、预备知识1、VC6.0安装和使用。2、C程序设计基础知识。四、试验内容采取模块化程序设计完成进制转换。五、程序框图请根据自己对程序设计需求了解进行设计。输出结果 主函数输入需要转换数和进制调用子函数判定进制数是否为16YN依据while里算式计算依据while里算式计算输出结果六、程序清单1.编写主函数:输入
2、需转换数和转换进制2.编写子函数(1)函数转换为除16进制以外进制转换算数编程,使用while循环实现计算进制转换,并输出转换后数字;(2)函数转换为16进制,用while函数实现16进制转换计算并输出16进制转换后数据;3.编写数组,相关16进制一系列字符4.编写主函数加入do while 使函数能够循环。七、试验步骤1、绘制步骤图(程序框图)。 2、编码。#include char num16=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;void fun(int n, int m) int i=-1, a100; if(m!=16) while(n) ai+=n%m;
3、n=n/m; while(i!=-1) printf(%d,a-i); printf(n); else while(n) a+i=numn%16; n/=16; while(i!=-1) printf(%c,ai-); printf(n); int main() int a, c;char cIn = 0;doprintf(n输入正整数,转换进制:);scanf(%d %d,&a,&c);fun(a,c); printf(Go on? (Y/N):);cIn = getchar( ); if(cIn = N | cIn = n) return 0;while(1);3、调试。八、试验结果进制转
4、换结果。试验二 学生班级成绩统计一、试验要求设计一个统计班级学生成绩程序。统计一个班(最多有35人)学生成绩,要求能实现以下四个功效:(1) 由键盘输入每个学生学号和四门课程成绩。(2) 计算每个学生平均成绩和总成绩。(3) 按总成绩从高到低排名,并按名次输出每个学生情况,包含:学号,各科成绩,平均成绩,总成绩,排名(4) 依据要求输出某门课程(由键盘输入课程号)成绩在90分(含90分)以上且总分在前5名学生情况(请采取结构体数据类型,并采取模块化结构实现)。二、试验目标1、深入熟悉C环境安装、使用。2、深入复习C程序设计等基础课程知识。3、深入掌握C语言编程方法。三、预备知识1、VC6.0安
5、装和使用。2、C程序设计基础知识。3、软件实现基础步骤。四、试验内容设计一个统计班级学生成绩程序。五、程序框图编写主函数包含所需要子函数子函数1:输入数据,并计算平均分和总分存到数组中子函数2:依据子函数1计算值进行排序子函数3:按子函数2中排序输出数据子函数4:输入需要查询科目标缩写,将查询到数据输出六、 程序清单1、 先编写主函数,将所需要用到子函数编写,2、 子函数1:输入数据,将所需要数据存到数组中并计算平均值和总分,3、 子函数2:依据子函数1计算所得值进行排序,4、 子函数3:输出排序完数据,5、 子函数4:编写查询程序,输入查询科目缩写,并排名后输出。七、试验步骤1、可行性分析2
6、、需求分析3、概要设计和具体设计(含绘制步骤图)。4、编码实现#include int order35;double addsum35;double addaver35;int b= 0; typedef struct student int id;char name35; double math; double english; double chinese; double computer; student;student stu35;void shuru()b= 0; while( b 35 ) printf( 输入学号(输入0退出输入): ); scanf( %d, &stub.id
7、); fflush( stdin ); if ( stub.id = 0 ) break;printf(输入名字:);scanf(%s,&stub.name); printf( 输入4门成绩(数学 英语 语文 计算机): ); scanf( %lf %lf %lf %lf, &stub.math, &stub.english, &stub.chinese, &puter ); fflush( stdin ); addsumb = stub.math + stub.english +stub.chinese, puter; addaverb = addsumb / 4.0; orderb = s
8、tub.id; b+; int query( int id ) int i = 0; for( i=0; ib; i+ ) if ( stui.id = id ) return i; return -1; void paiming() int i,j; for( i=0; ib; i+ ) for( j=i+1; jb; j+ ) if ( addsumi - addsumj 0.001 ) int temp_id = orderi; orderi = orderj; orderj = temp_id; void output() int i; printf( 名次 学号 姓名 数学 英语 语
9、文 计算机 总分 平均n ); for( i=0; ib; i+ ) int j = query( orderi ); if ( j0 ) printf( order%d= %d errorn, i+1, orderi ); continue; printf( %02d %5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2fn,i+1, stuj.id, stuj.name,stuj.math, stuj.english, stuj.chinese, puter,addsumj, addaverj ); void chaxun()char a1;int i;pr
10、intf(输入你所想要查询课程代号:);scanf(%c,&a1);printf( 名次 学号 姓名 数学 英语 语文 计算机 总分 平均n );if(a1=m)for(i=0;i90 & orderi 5)printf( %02d %5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2fn,i+1, stui.id, stui.name,stui.math, stui.english, stui.chinese, puter,addsumi, addaveri );else if(a1=e)for(i=0;i90 & orderi 5)printf( %02d
11、%5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2fn,i+1, stui.id, stui.name,stui.math, stui.english, stui.chinese, puter,addsumi, addaveri );else if (a1=c)for(i=0;i90 & orderi 5)printf( %02d %5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2fn,i+1, stui.id, stui.name,stui.math, stui.english, stui.chinese, puter,ad
12、dsumi, addaveri );else for(i=0;i90 & orderi 5)printf( %02d %5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2fn,i+1, stui.id, stui.name,stui.math, stui.english, stui.chinese, puter,addsumi, addaveri );void main()shuru(); paiming(); output();chaxun();5、调试6、运行维护,完善文档八、试验结果试验三 文件合并一、试验要求将两个文件中数据合并至一个文件。有两个文件“A
13、file”和“Bfile”,各存放一行字母,今要求把这两个文件中信息合并(按字母次序排列),输出到一个新文件“Cfile”中去。二、试验目标1、掌握指针、文件指针概念。2、掌握文件操作知识。3、深入掌握软件开发基础步骤。三、预备知识1、C程序设计基础知识。2、软件实现基础步骤。四、试验内容将两个文件中数据合并至一个文件。五、程序清单1、将头文件编写齐全,建立主函数;2、建立数组空间str140, str220,str360用来存放文件A,B,C字符;3、打开文件A,并将文件A中字符存入str140中,并输出;4、打开文件B,并将文件B中字符存入str140中,并输出;5、将str2中字符存入s
14、tr1中,将str1中字符存入str3中;6、将str3中字符排序,存入文件C中;7、输出文件C中字符。六、程序框图编写头文件&主函数建立文件指针和数组空间打开文件A,将文件A中数据存入数组str1打开文件B,将文件B中数据存入数组str2将str2中字符存入str1中,将str1中字符存入str3中将str3中字符排序,存入文件C中,以后输出七、试验步骤1、可行性分析2、需求分析编写头文件&主函数建立文件指针和数组空间打开文件A,将文件A中数据存入数组str1打开文件B,将文件B中数据存入数组str2将str2中字符存入str1中,将str1中字符存入str3中将str3中字符排序,存入文件
15、C中,以后输出3、概要设计和具体设计(含绘制步骤图)。4、编码实现# include # include # include int main()FILE *fp1, *fp2, *fp3;int i,j,n; char t; char str140, str220,str360; if(fp1=fopen(A.txt,r)=NULL) printf(无法打开A文件!); exit(0); fgets(str1,20,fp1); printf(%sn,str1); if(fp2=fopen(B.txt,r)=NULL) printf(无法打开B文件!); exit(0); fgets(str2
16、,20,fp2); printf(%sn,str2); strcat(str1,str2); strcpy(str3,str1); n=strlen(str3); for(j=0;jn-1;j+) for(i=0;istr3i+1) t=str3i; str3i=str3i+1; str3i+1=t; if(fp3=fopen(C.txt,w)=NULL) printf(无法打开C文件!); exit(0); fputs(str3,fp3); fputs(n,fp3); printf(%sn,str3); return 0; 5、调试6、运行维护,完善文档八、试验结果试验四 链表基础操作一、试
17、验要求完成单链表建立、插入和删除操作。链表,就是用“指针域”链在一起自引用结构(称为“结点”)线性集合。链表是经过指向链表第一个结点指针访问,其后结点是经过前一结点中“指针域”访问。在单链表中,数据域用来存放数据,指针域用来存放下一个结点地址。建立单链表能够经过头插法完成,也能够经过尾插法完成。在单链表第i个元素前插入一个新元素,先必需找到第i-1个元素、找到第i个元素,然后新建一个节点,再进行对应插入。从单链表中删除一个元素,先必需找到这个元素前一个元素、找到这个元素,然后进行对应删除,删除后元素必需被释放掉内存。二、试验目标1、复习指针概念。2、复习数据结构相关基础知识。3、掌握链表使用方
18、法。三、预备知识1、C程序设计基础知识。2、数据结构相关基础知识。四、试验内容完成单链表建立、插入和删除操作。五、程序清单 1、定义头文件,编写共用体结构体及主函数;2、在主函数中利用switch和dowhile函数使程序能够循环调用子函数; 3、编写子函数1:手动输入链表长度及链表中数值建立链表;4、编写子函数2:从键盘输入需要查询值,然后输出其所在节点;5、编写子函数3:从键盘输入需要删除节点,然后输出删除此节点后链表;6、编写子函数4:从键盘输入需要添加数值节点,从键盘输入要添加进去数值,然后输出增加此节点数加1后添加数值链表;7、从键盘输入0后推出程序。 六、程序框图编写子函数2查找数
19、值,并输出数值所在节点数定义头文件,共用体变量及主函数编写子函数1建立链表编写子函数3删除节点数,并输出链表编写子函数4插入节点数,并输出链表输入0结束七、试验步骤1、可行性分析编写子函数2查找数值,并输出数值所在节点数定义头文件,共用体变量及主函数编写子函数1建立链表编写子函数3删除节点数,并输出链表编写子函数4插入节点数,并输出链表输入0结束2、需求分析3、概要设计和具体设计(含绘制步骤图)。4、编码实现#include#include#includestruct lian_node int n; int num; struct lian_node*link;struct lian_nod
20、e*Create_Lian_Doc(); void SearchDoc_n(struct lian_node*link,int n); void SearchDoc_num(struct lian_node*link,int num); void InsertDoc(struct lian_node*llist,struct lian_node*p,int n); void DeleteDoc(struct lian_node*llist,int n); void Print_Lian_Doc(struct lian_node*llist); int main(void) struct lia
21、n_node*llist,*p; int n,num,choice; int size=sizeof(struct lian_node); llist=Create_Lian_Doc();do printf( n链表操作n); printf( 1 :查找n); printf( 2 :删除n); printf( 3 :插入n); printf( 0 : 退出n); printf(请选择功效:); scanf(%d,&choice); switch(choice)case 0: break;case 1: printf(输入值 : ); scanf(%d,&num); SearchDoc_num(
22、llist,num); break;case 3: printf(插入结点位置:); scanf(%d,&n); printf(插入结点数值:); scanf(%d,&num); p=(struct lian_node *)malloc(size); p-n=n+1; p-num=num; p-link=NULL; InsertDoc(llist,p,n); break;case 2: printf(n删除结点: ); scanf(%d,&n); DeleteDoc(llist,n); break; while (choice!=0);return 0;struct lian_node*Cre
23、ate_Lian_Doc()int i,num,n; int size=sizeof(struct lian_node);struct lian_node *llist,*tail,*p;llist=tail=NULL;printf(请输入链表长度n=);scanf(%d,&n);printf(请输入链表各个值:);for(i=1;in=i; p-num=num; p-link=NULL; if(llist=NULL) llist=p; elsetail-link=p; tail=p;return llist;void SearchDoc_num(struct lian_node*llist,
24、int num) struct lian_node *ptr; if(llist=NULL) printf(n无结果!n); return; for(ptr=llist;ptr;ptr=ptr-link) if(ptr-num=num) printf(输出序号为 : %dnn,ptr-n); break; if(ptr=NULL) printf(n无结果!n); void InsertDoc(struct lian_node*llist,struct lian_node*p,int n) int i=1; struct lian_node *ptr,*ptr1,*ptr2; ptr1=llis
25、t; ptr2=llist-link; while(ptr1-n!=n & ptr2!=NULL) ptr1=ptr2; ptr2=ptr2-link; if(ptr1-n=n) p-link=ptr2; ptr1-link=p; else printf(n无结果!n); for(ptr=llist;ptr;ptr=ptr-link) ptr-n=i; i+; Print_Lian_Doc(llist);void DeleteDoc(struct lian_node*llist,int n) struct lian_node *ptr,*ptr1,*ptr2; int i=1; while(l
26、list!=NULL & llist-n=n) ptr2=llist; llist=llist-link; free(ptr2); if(llist=NULL) printf(n无结果!n); ptr1=llist; ptr2=llist-link; while(ptr2!=NULL) if(ptr2-n=n) ptr1-link=ptr2-link; free(ptr2); else ptr1=ptr2; ptr2=ptr1-link; for(ptr=llist;ptr;ptr=ptr-link) ptr-n=i; i+; Print_Lian_Doc(llist); void Print
27、_Lian_Doc(struct lian_node*llist) struct lian_node*ptr; printf(输出链表 : ); for(ptr=llist;ptr;ptr=ptr-link) printf(%5d,ptr-num); printf(n);5、调试6、运行维护,完善文档八、试验结果试验五 约瑟夫环(一)一、试验要求编号为1,2,nn个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1次序报数,报到m时停止报数。报m人出列,将她密码作为新m值,从她在顺时针方向上下一个人开始重新从1报数,如此下去,直至全
28、部人全部出列为止。试设计一个程序,求出出列次序。要求利用单循环链表作为存放结构模拟此过程,根据出列次序打印出各人编号。比如m初值为20,n=7,7个人密码依次是3,1,7,2,4,8,4,出列次序为6,1,4,7,2,3,5。请用链表完成。二、试验目标1、复习指针概念。2、复习数据结构相关基础知识。3、复习链表使用方法。三、预备知识1、C程序设计基础知识。2、数据结构相关基础知识。四、试验内容用链表完成约瑟夫环过程。五、程序清单六、程序框图请根据自己对程序设计需求了解进行设计。七、试验步骤1、可行性分析2、需求分析3、概要设计和具体设计(含绘制步骤图)。4、编码实现#include #incl
29、ude typedef struct Node int Num; struct Node *next;JoseNode, *PNode, *HNode;int JoseInit(HNode *h) if (!h) printf(初始化链表错误!n); return 0; (*h)-next = (*h);/循环单链表 return 1;int JoseInsert(JoseNode *h, int pos, int x) PNode p=h,q; int i=1; if (pos = 1)/*尾插法*/ p-Num = x; p-next = p; return 1; while(inext;
30、 i+; q=(PNode)malloc(sizeof(JoseNode); q-Num=x; q-next=p-next; p-next=q; return 1;void TraverseList(HNode h, int M) int i = 0; PNode p = h; printf(参与人编号为:n); while (iNum); p = p-next; i+; printf(n);int JoseDelete(HNode h, int M, int k) int i; PNode p=h,q; while(M1) for(i=1;inext; q=p-next; p-next=q-
31、next; printf(出局人为:%d号n,q-Num); free(q); p=p-next; M-; printf(*获胜者为:%d号*,p-Num); return 1;int main() int i;/计数器 int N;/参与人数 int k;/报数密码 printf(请输入参与人数:); scanf(%d,&N); printf(请输入出局密码:); scanf(%d,&k); HNode h = (HNode)malloc(sizeof(JoseNode); JoseInit(&h); for (i = 1; i 1) JoseDelete(h, N, k); else for(i = 1; i N; i+) printf(出局人为:%d号n,i); printf(*获胜者为:%d号*,N); printf(n); printf(n); return 0;5、调试6、运行维护,完善文档八、试验结果