1、C高级编程试验指导书 试验一 进制转换 一、试验要求 采取模块化程序设计完成进制转换。由键盘输入一个十进制正整数,然后将该数转换成指定进制数(二、八、十六)形式输出。指定进制由用户输入。 二、试验目标 1、熟悉C环境安装、使用。 2、承上启下,复习《C程序设计》等基础课程知识。 3、掌握C语言编程方法。 三、预备知识 1、VC6.0安装和使用。 2、C程序设计基础知识。 四、试验内容 采取模块化程序设计完成进制转换。 五、程序框图 请根据自己对程序设计需求了解进行设计。 输出结果 主函数输入需要转换数和进制 调用子函数 判定进制数是否为16 Y
2、 N 依据while里算式计算 依据while里算式计算 输出结果 六、程序清单 1.编写主函数:输入需转换数和转换进制 2.编写子函数 (1)函数转换为除16进制以外进制转换算数编程,使用while循环实现计算进制转换,并输出转换后数字; (2)函数转换为16进制,用while函数实现16进制转换计算并输出16进制转换后数据; 3.编写数组,相关16进制一系列字符 4.编写主函数加入do while 使函数能够循环。 七、试验步骤 1、绘制步骤图(程序框图)
3、
2、编码。
#include
4、ntf("\n"); } else { while(n) { a[++i]=num[n%16]; n/=16; } while(i!=-1) printf("%c",a[i--]); printf("\n"); } } int main() { int a, c; char cIn = 0; do { printf("\n输入正整数,转换进制:"); scanf("%d %d",&a,&c); fun(a,c); printf("Go on? (Y/N):");
5、cIn = getchar( ); if(cIn == 'N' || cIn == 'n') return 0; } while(1); } 3、调试。 八、试验结果 进制转换结果。 试验二 学生班级成绩统计 一、试验要求 设计一个统计班级学生成绩程序。 统计一个班(最多有35人)学生成绩,要求能实现以下四个功效: (1) 由键盘输入每个学生学号和四门课程成绩。 (2) 计算每个学生平均成绩和总成绩。 (3) 按总成绩从高到低排名,并按名次输出每个学生情况,包含: 学号,各科成绩,平
6、均成绩,总成绩,排名 (4) 依据要求输出某门课程(由键盘输入课程号)成绩在90分(含90分)以上且总分在前5名学生情况(请采取结构体数据类型,并采取模块化结构实现)。 二、试验目标 1、深入熟悉C环境安装、使用。 2、深入复习《C程序设计》等基础课程知识。 3、深入掌握C语言编程方法。 三、预备知识 1、VC6.0安装和使用。 2、C程序设计基础知识。 3、软件实现基础步骤。 四、试验内容 设计一个统计班级学生成绩程序。 五、程序框图 编写主函数包含所需要子函数 子函数1:输入数据,并计算平均分和总分存到数组中 子函数2:依据子函数1计算值进行排序 子函数3:
7、按子函数2中排序输出数据
子函数4:输入需要查询科目标缩写,将查询到数据输出
六、 程序清单
1、 先编写主函数,将所需要用到子函数编写,
2、 子函数1:输入数据,将所需要数据存到数组中并计算平均值和总分,
3、 子函数2:依据子函数1计算所得值进行排序,
4、 子函数3:输出排序完数据,
5、 子函数4:编写查询程序,输入查询科目缩写,并排名后输出。
七、试验步骤
1、可行性分析
2、需求分析
3、概要设计和具体设计(含绘制步骤图)。
4、编码实现
#include 8、o.h>
int order[35];
double addsum[35];
double addaver[35];
int b= 0;
typedef struct student
{
int id;
char name[35];
double math;
double english;
double chinese;
double computer;
} student;
student stu[35];
void shuru()
{
b= 0;
while( b < 35 )
{
9、
printf( "输入学号(输入0退出输入):" );
scanf( "%d", &stu[b].id );
fflush( stdin );
if ( stu[b].id <= 0 )
break;
printf("输入名字:");
scanf("%s",&stu[b].name);
printf( "输入4门成绩(数学 英语 语文 计算机):" );
scanf( "%lf %lf %lf %lf", &stu[b].math, &stu[b]. 10、english,
&stu[b].chinese, &stu[b].computer );
fflush( stdin );
addsum[b] = stu[b].math + stu[b].english +stu[b].chinese, stu[b].computer;
addaver[b] = addsum[b] / 4.0;
order[b] = stu[b].id;
b++;
}
}
int query( int id )
{
11、int i = 0;
for( i=0; i 12、{
int temp_id = order[i];
order[i] = order[j];
order[j] = temp_id;
}
}
}
}
void output()
{
int i;
printf( "名次 学号 姓名 数学 英语 语文 计算机 总分 平均\n" );
for( i=0; i 13、er[i] );
if ( j<0 )
{
printf( "order[%d]= %d error\n", i+1, order[i] );
continue;
}
printf( "%02d %5.d %s %4.2f %4.2f %4.2f %6.2f %4.2f %4.2f\n",
i+1, stu[j].id, stu[j].name,stu[j].math, stu[j].english, stu[j].chinese, stu[j].comput 14、er,addsum[j], addaver[j] );
}
}
void chaxun()
{
char a[1];
int i;
printf("输入你所想要查询课程代号:");
scanf("%c",&a[1]);
printf( "名次 学号 姓名 数学 英语 语文 计算机 总分 平均\n" );
if(a[1]=='m')
{
for(i=0;i90 && order[i]< 5)
{
printf( "%02d %5.d %s %4.2 15、f %4.2f %4.2f %6.2f %4.2f %4.2f\n",
i+1, stu[i].id, stu[i].name,stu[i].math, stu[i].english, stu[i].chinese, stu[i].computer,addsum[i], addaver[i] );
}
}
}
else if(a[1]=='e')
{
for(i=0;i90 && order[i]< 5)
{
printf( "%02d %5.d %s %4.2 16、f %4.2f %4.2f %6.2f %4.2f %4.2f\n",
i+1, stu[i].id, stu[i].name,stu[i].math, stu[i].english, stu[i].chinese, stu[i].computer,addsum[i], addaver[i] );
}
}
}
else if (a[1]=='c')
{
for(i=0;i90 && order[i]< 5)
{
printf( "%02d %5.d %s %4. 17、2f %4.2f %4.2f %6.2f %4.2f %4.2f\n",
i+1, stu[i].id, stu[i].name,stu[i].math, stu[i].english, stu[i].chinese, stu[i].computer,addsum[i], addaver[i] );
}
}
}
else
{
for(i=0;i90 && order[i]< 5)
{
printf( "%02d %5.d %s %4.2f %4.2f %4. 18、2f %6.2f %4.2f %4.2f\n",
i+1, stu[i].id, stu[i].name,stu[i].math, stu[i].english, stu[i].chinese, stu[i].computer,addsum[i], addaver[i] );
}
}
}
}
void main()
{
shuru();
paiming();
output();
chaxun();
}5、调试6、运行维护,完善文档
八、试验结果
试验三 文件合并
一、试验要求
将两个文件中数据合并至一个文件。
有两 19、个文件“Afile”和“Bfile”,各存放一行字母,今要求把这两个文件中信息合并(按字母次序排列),输出到一个新文件“Cfile”中去。
二、试验目标
1、掌握指针、文件指针概念。
2、掌握文件操作知识。
3、深入掌握软件开发基础步骤。
三、预备知识
1、C程序设计基础知识。
2、软件实现基础步骤。
四、试验内容
将两个文件中数据合并至一个文件。
五、程序清单
1、将头文件编写齐全,建立主函数;
2、建立数组空间str1[40], str2[20],str3[60]用来存放文件A,B,C字符;
3、打开文件A,并将文件A中字符存入str1[40]中,并输出;
4、 20、打开文件B,并将文件B中字符存入str1[40]中,并输出;
5、将str2中字符存入str1中,将str1中字符存入str3中;
6、将str3中字符排序,存入文件C中;
7、输出文件C中字符。
六、程序框图
编写头文件&主函数
建立文件指针和数组空间
打开文件A,将文件A中数据存入数组str1
打开文件B,将文件B中数据存入数组str2
将str2中字符存入str1中,将str1中字符存入str3中
将str3中字符排序,存入文件C中,以后输出
七、试验步骤
1、可行性分析
2、需求分析
编写头文件&主函数
建立文件指针和数组空间
打开文件A,将 21、文件A中数据存入数组str1
打开文件B,将文件B中数据存入数组str2
将str2中字符存入str1中,将str1中字符存入str3中
将str3中字符排序,存入文件C中,以后输出
3、概要设计和具体设计(含绘制步骤图)。
4、编码实现
# include 22、 str1[40], str2[20],str3[60];
if((fp1=fopen("A.txt","r"))==NULL)
{
printf("无法打开A文件!");
exit(0);
}
fgets(str1,20,fp1);
printf("%s\n",str1);
if((fp2=fopen("B.txt","r"))==NULL)
{
printf("无法打开B文件!");
exit(0);
} 23、
fgets(str2,20,fp2);
printf("%s\n",str2);
strcat(str1,str2);
strcpy(str3,str1);
n=strlen(str3);
for(j=0;j 24、3[i+1]=t;
}
if((fp3=fopen("C.txt","w"))==NULL)
{
printf("无法打开C文件!");
exit(0);
}
fputs(str3,fp3);
fputs("\n",fp3);
printf("%s\n",str3);
return 0;
}
5、调试
6、运行维护,完善文档
八、试验结果
试验四 链表基础操作
一、试验要求
完成单链表建立、插入和删除操作 25、
链表,就是用“指针域”链在一起自引用结构(称为“结点”)线性集合。链表是经过指向链表第一个结点指针访问,其后结点是经过前一结点中“指针域”访问。在单链表中,数据域用来存放数据,指针域用来存放下一个结点地址。
建立单链表能够经过头插法完成,也能够经过尾插法完成。
在单链表第i个元素前插入一个新元素,先必需找到第i-1个元素、找到第i个元素,然后新建一个节点,再进行对应插入。
从单链表中删除一个元素,先必需找到这个元素前一个元素、找到这个元素,然后进行对应删除,删除后元素必需被释放掉内存。
二、试验目标
1、复习指针概念。
2、复习数据结构相关基础知识。
3、掌握链表使用方法。 26、
三、预备知识
1、C程序设计基础知识。
2、数据结构相关基础知识。
四、试验内容
完成单链表建立、插入和删除操作。
五、程序清单
1、定义头文件,编写共用体结构体及主函数;
2、在主函数中利用switch和do—while函数使程序能够循环调用子函数;
3、编写子函数1:手动输入链表长度及链表中数值建立链表;
4、编写子函数2:从键盘输入需要查询值,然后输出其所在节点;
5、编写子函数3:从键盘输入需要删除节点,然后输出删除此节点后链表;
6、编写子函数4:从键盘输入需要添加数值节点,从键盘输入要添加进去数值,然后输出增加此节点数加1后添加数值链表;
7、从键 27、盘输入0后推出程序。 28、
六、程序框图
编写子函数2查找数值,并输出数值所在节点数
定义头文件,共用体变量及主函数
编写子函数1建立链表
编写子函数3删除节点数,并输出链表
编写子函数4插入节点数,并输出链表
输入0结束
七、试验步骤
1、可行性分析
编写子函数2查找数值,并输出数值所在节点数
定义头文件,共用体变量及主函数
编写子函数1建立链表 29、
编写子函数3删除节点数,并输出链表
编写子函数4插入节点数,并输出链表
输入0结束
2、需求分析
3、概要设计和具体设计(含绘制步骤图)。
4、编码实现
#include 30、
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 31、 Print_Lian_Doc(struct lian_node*llist);
int main(void)
{
struct lian_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 :插 32、入\n");
printf(" 0 : 退出\n");
printf("请选择功效:");
scanf("%d",&choice);
switch(choice){
case 0:
break;
case 1:
printf("输入值 : ");
scanf("%d",&num);
SearchDoc_num(llist,num);
break;
case 3:
printf("插入结点位置:");
scanf("%d",&n);
33、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);
ret 34、urn 0;
}
struct lian_node*Create_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;i<=n;i++)
{
p=(struct lian_node *)malloc(size);
sc 35、anf("%d",&num);
p->n=i;
p->num=num;
p->link=NULL;
if(llist==NULL)
llist=p;
else
tail->link=p;
tail=p;
}
return llist;
}
void SearchDoc_num(struct lian_node*llist,int num)
{
struct lian_node *ptr;
if(llist==NULL){
printf("\n无结果!\n");
return;
36、}
for(ptr=llist;ptr;ptr=ptr->link){
if(ptr->num==num){
printf("输出序号为 : %d\n\n",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=llist;
pt 37、r2=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 38、llist,int n)
{
struct lian_node *ptr,*ptr1,*ptr2;
int i=1;
while(llist!=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;
39、
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_Lian_Doc(struct lian_node*llist)
{
struct lian_node*ptr;
printf("输出链表 : ");
for(ptr=llist;ptr;ptr=ptr->lin 40、k)
printf("%5d",ptr->num);
printf("\n");
}
5、调试
6、运行维护,完善文档
八、试验结果
试验五 约瑟夫环(一)
一、试验要求
编号为1,2,…,nn个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1次序报数,报到m时停止报数。报m人出列,将她密码作为新m值,从她在顺时针方向上下一个人开始重新从1报数,如此下去,直至全部人全部出列为止。试设计一个程序,求出出列次序。要求利用单循环链表作为存放结构模拟此过程,根据出列次序打印出各人编号。比如m初值为20,n 41、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 42、pedef 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)
{
43、
PNode p=h,q;
int i=1;
if (pos == 1)/*尾插法*/
{
p->Num = x;
p->next = p;
return 1;
}
while(i 44、return 1;
}
void TraverseList(HNode h, int M)
{
int i = 0;
PNode p = h;
printf("参与人编号为:\n");
while (i 45、ode p=h,q;
while(M>1)
{
for(i=1;i 46、",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 ( 47、i = 1; i <=N; i++)
{
JoseInsert(h, i, i);
}
/**************遍历单链表***************/
TraverseList(h,N);
/***************出局函数************/
if(k > 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、运行维护,完善文档
八、试验结果






