C语言程序设计实践实验题目.docx
《C语言程序设计实践实验题目.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实践实验题目.docx(68页珍藏版)》请在冰豆网上搜索。
C语言程序设计实践实验题目
实验题目:
循环结构程序设计
实验目的:
1.熟悉VC++6.0的运行环境,掌握C程序的执行方法;
2.掌握三种基本数据类型、部分运算符号和常用函数;
3.掌握三种循环控制语句及break和continue语句的使用方法;
4.掌握循环结构的嵌套及正确控制计数型循环结构次数的方法。
实验内容:
程序1:
搬砖问题:
36块砖,36人搬,男搬4,女搬3,两个小孩抬1砖,要求一次搬完,问男、女和小孩各若干?
#include“stdio.h”
main()
{
intmen,women,children;
men=0;
while(men<=8)
{women=0;
while(women<=11)
{children=36-men-women;
if((men*4+women*3+children/2==36)&&children%2==0)
printf(“men=%d,women=%d,children=%d\n”,men,women,children);
women++;}
men++;}
}
程序2打印形状为直角三角形的乘法口诀。
#include"stdio.h"
main()
{inti,j,result;
for(i=1;i<10;i++)
{for(j=1;j
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}
printf("\n");/*每一行后换行*/
}
}
程序3求1000以内的所有素数。
#include“stdio.h”
main()
{
intm,i;
for(m=2;m<=100;m++)
{for(i=2;i<=m-1;i++)
if(m%i==0)break;
if(i>m-1)printf("%5d",m);
}
}
程序4:
计算和统计旅客运费程序。
由键盘输入旅客行李重量(w),按公式:
若(w<=50kg)f=1.5*w,若(w>50kg)f=1.5*50+2.8*(w-50)(w>50kg)
计算运费,要求:
(1)打印每位旅客的顺序号,行李重量,应付运费;
(2)假定每天最多办理100人的行李托运手续或当w≤0时循环结束,下班时打印出全天的运费总收入和办理的总人数。
方法一(while结构)
#include“stdio.h”
main()
{
intnum=0;
floatw,f,total=0;
scanf("%f",&w);
while(w>0&&num<100)
{if(w<=50)f=1.5*w;
elsef=1.5*50+2.8*(w-50);
num++;
printf("%d,%6.0f,%8.2f\n",num,w,f);
total+=f;scanf("%f",&w);}
printf("Customers=%dTotalIncome=%10.2f\n",num,total);
}
方法二(do-while结构)
#include“stdio.h”
main()
{
intnum=0;
floatw,f,total=0;
do
{scanf("%f",&w);
if(w<=0)break;
if(w<=50)f=1.5*w;
elsef=1.5*50+2.8*(w-50);
num++;
printf("%d%6.0f%8.2f\n",num,w,f);
total+=f;
}while(num<100);
printf("Customers=%dTotalIncome=%10.2f\n",num,total);
}
方法三(for结构)
#include“stdio.h”
main()
{
intnum;
floatw,f,total=0;
scanf("%f",&w);
for(num=1;w>0&&num<=100;num++)
{if(w<=50)f=1.5*w;
elsef=1.5*50+2.8*(w-50);
printf("%d%6.0f%8.2f\n",num,w,f);
total+=f;scanf("%f",&w);
}
printf("Customers=%dTotalIncome=%10.2f\n",num,total);
}
实验二:
数组
实验目的:
1.更加灵活的使用一维数组和二维数组
2.把数组和指针结合使用
实验内容:
1.约瑟夫环问题
由n个人围成一个首尾相连的圈报数。
从第一个人开始,从1开始报数,报到3的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。
求出所有人的出圈顺序。
#include
main()
{inta[10];
intn=8,i,k=0,j=1,len;
len=n;
i=0;
//给数组赋值
for(i=0;ia[i]=i+1;
//i为元素下标,j代表当前要报的数,len表示圈中当前人数
while(len>0){
if(a[k%n]>0){
if(j%3==0){
printf("%d\n",a[k%n]);//找到要出圈的人,并把圈中人数减一,最后一个人才输出
a[k%n]=-1;
j=1;
k++;
len--;
}
else{//报数不是3
k++;
j++;
}
}
else//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
k++;
}
}
2.学生成绩统计与分析
输入10名学生的英语、C语言、计算机文化基础成绩,统计每名学生三科成绩的平均分,分析三门课程的优秀率,85分以上为优秀。
#include
voidmain()
{
intgrade[10][4];
inti,j,average,egood,cgood,jgood;
for(i=0;i<10;i++)
{
printf("请输入第%d个学生的英语、c语言、计算机\n",i+1);
for(j=0;j<3;j++)
scanf("%d",&grade[i][j]);
}
egood=cgood=jgood=0;
for(i=0;i<10;i++)//10个人
{
average=0;
for(j=0;j<3;j++)//三门课程
{
average+=grade[i][j];
if(grade[i][j]>=85)
{
if(j==0)egood++;if(j==1)cgood++;if(j==2)jgood++;
}
}
grade[i][3]=average/3;
}
for(i=0;i<10;i++)
printf("第%d个学生的三科平均分为:
%d\n",i+1,grade[i][3]);
printf("英语成绩优秀的学生为%d\n",egood);
printf("C语言成绩优秀的学生为%d\n",cgood);
printf("计算机成绩优秀的学生为%d\n",jgood);
}
3.利用指针实现数组合并
数组a:
“1,7,9,11,13,15,17,19”;数组b:
“2,4,6,8,10”, 两个数组合并为数组c,按升序排列。
#include
voidmain()
{intpaixu(intc[]);
inta[8]={1,7,9,11,13,15,17,19};
intb[5]={2,3,6,8,10};
intc[13];
int*p,*q,*s;
for(p=a,s=c;p<8+a;p++,s++)
*s=*p;
for(q=b;q
*s=*q;
paixu(c);
}
paixu(intc[])
{inti,j,k;
for(j=0;j<12;j++)
for(i=0;i<12-j;i++)
if(c[i]>c[i+1])
{k=c[i];
c[i]=c[i+1];
c[i+1]=k;
}
for(i=0;i<13;i++)
printf("%d\n",c[i]);
}
实验三:
函数
实验目的:
1.更加灵活的使用数组和指针作为函数参数;
2.更加灵活使用指针处理字符串。
实验内容:
1.字符串复制
输入一个长度不大于30的字符串,将此字符串中从第m个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。
要求用指针方法处理字符串。
2.插入字符串
从键盘上先后读入两个字符串,假定存储在字符数组s1和s2中。
注意,这两个字符串最长均可达到26个字符、最短均可为0个字符。
将字符串s2插入字符串s1中,生成一个新的字符串s。
插入方法为s2的第i个字符插入到原s1的第i个字符后,如果s2比s1(假定s1的长度为L1)长,则s2的第L1个字符开始到s2结尾的所有字符按在s2中的顺序放在新生成的字符串s之后。
用指针完成程序。
3.学生成绩管理系统
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。
(1)计算每个学生的总分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,包括名次、学生编号、各科分数、总分;
要求程序运行后先打印出一个菜单,提示用户选择:
成绩录入、成绩排序、成绩查找,在选择某项功能后执行相应的操作。
实验四:
结构体
实验目的:
1.更加灵活的使用数组作为函数参数;
2.初步掌握开发一个小型实用系统的基本方法;
3.初步掌握书写程序设计开发文档的能力。
实验内容:
程序一:
学生信息管理系统
编写程序,实现学生信息的管理(包括学生信息的建立、增加、删除、修改、查找),要求:
小组分工情况
小组分工情况统计表
班级
信息工程学院计算机科学与技术专业2012级软件工程(方向)班组
名称
学生信息管理系统
项目组长
(本次项目小组组长)
组员
组员学号
工作简介
一需求分析
I设计一个学生成绩管理系统至少具有以下功能:
(1)菜单功能:
采用文本菜单界面。
(2)学生信息的建立。
(3)学生信息的增加。
(4)学生信息的删除。
(5)学生信息的修改。
(6)学生信息的查找。
II数据库结构
structstudent
{charnum[10];
charname[10];
charxibie[10];
charsex;
intage;
}st[30];
二总体设计
框架结构图(系统的功能结构图)
程序流程图:
(visio)
三、详细设计
(流程图!
!
!
)
四、程序源代码(参考答案)
1.用结构体数组完成
2.用结构体指针完成
1.#include"stdio.h"
#include"string.h"
typedefstructnode
{charnum[10];
charname[10];
charxibie[10];
charsex;
intage;
}st;
intn;
st*creslink()
{
inti;
sts[10];
printf("请输入要录入的人数:
");
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{printf("请输入第%d名学生的学号,姓名,系别,年龄,性别:
",i+1);
scanf("%s%s%s%d%c",s[i].num,s[i].name,s[i].xibie,&s[i].age,&s[i].sex);
}
returns;
}
intgetlen(sts[])
{
returnn;
}
insert(sts[],charnum[],charname[],charxibie[],intage,charsex)
{strcpy(s[n].num,num);
strcpy(s[n].name,name);
strcpy(s[n].xibie,xibie);
s[n].age=age;
s[n].sex=sex;
n++;
}
delete(sts[],charnum[])
{inti,j;
for(i=0;iif(strcmp(s[i].num,num)==0)break;
for(j=i+1;js[j-1]=s[j];
n--;
}
voidlist(sts[])
{inti;
printf("学号\t姓名\t系别\t年龄\t性别\n");
for(i=0;iprintf("%s\t%s\t%s\t%d\t%c\n",s[i].num,s[i].name,s[i].xibie,s[i].age,s[i].sex);
}
voidmain()
{
intk,f,age;
charnum[10],name[10],xibie[10],sex;
st*s;
while
(1)
{
printf("\n\n\t\t\t学生信息管理系统\n");
printf("\t\t*************************************\n");
printf("\t\t\t1.录入学生信息\n");
printf("\t\t\t2.插入新学生信息\n");
printf("\t\t\t3.删除学生信息\n");
printf("\t\t\t4.输出学生信息\n");
printf("\t\t\t5.输出学生总数\n");
printf("\t\t\t6.退出\n");
printf("\t\t*************************************\n");
printf("请选择:
");
scanf("%d",&k);
switch(k)
{case1:
s=creslink();break;
case2:
printf("请输入新学生的学号,姓名,系别,年龄,性别:
");
scanf("%s%s%s%d%c",num,name,xibie,&age,&sex);
insert(s,num,name,xibie,age,sex);
break;
case3:
printf("请输入要删除的学生的学号:
");
scanf("%s",num);
delete(s,num);
break;
case4:
list(s);break;
case5:
f=getlen(s);printf("学生总数为:
%d",f);break;
case6:
return;
}
}
}
2.#include"stdio.h"
#include"string.h"
#definenull0
typedefstructnode
{charnum[10];
charname[10];
charxibie[10];
charsex;
intage;
structnode*next;
}slink;
slink*creslink()
{
slink*head,*p,*s;
inti,n;
printf("请输入要录入的人数:
");
scanf("%d",&n);
if(n<1)
returnnull;
p=head=(slink*)malloc(sizeof(slink));
head->next=null;
for(i=1;i<=n;i++)
{
s=(slink*)malloc(sizeof(slink));
printf("请输入第%d名学生的学号,姓名,系别,年龄,性别:
",i);
scanf("%s%s%s%d%c",s->num,s->name,s->xibie,&s->age,&s->sex);
p->next=s;
p=s;
}
p->next=null;
returnhead;
}
intgetlen(slink*head)
{
slink*p;
intn;
p=head->next;
n=0;
while(p!
=null)
{
n++;
p=p->next;
}
returnn;
}
insert(slink*head,charnum[],charname[],charxibie[],intage,charsex)
{
slink*p,*q;
p=head;
while(p->next!
=null)p=p->next;
q=(structnode*)malloc(sizeof(slink));
strcpy(q->num,num);
strcpy(q->name,name);
strcpy(q->xibie,xibie);
q->sex=sex;
q->age=age;
q->next=p->next;
p->next=q;
}
delete(slink*head,charnum[])
{
slink*p,*q;
p=head;
while(p->next!
=null&&strcmp(p->next->num,num)!
=0)
p=p->next;
q=p->next;
p->next=q->next;
free(q);
}
voidlist(slink*head)
{
slink*p;
printf("学号\t姓名\t系别\t年龄\t性别\n");
p=head->next;
while(p!
=null)
{
printf("%s\t%s\t%s\t%d\t%c\n",p->num,p->name,p->xibie,p->age,p->sex);
p=p->next;
}
printf("\n");
}
voidmain()
{
intk,f,age;
charnum[10],name[10],xibie[10],sex;
slink*head;
while
(1)
{
printf("\n\n\t\t\t学生信息管理系统\n");
printf("\t\t*************************************\n");
printf("\t\t\t1.录入学生信息\n");
printf("\t\t\t2.插入新学生信息\n");
printf("\t\t\t3.删除学生信息\n");
printf("\t\t\t4.输出学生信息\n");
printf("\t\t\t5.输出学生总数\n");
printf("\t\t\t6.退出\n");
printf("\t\t*************************************\n");
printf("请选择:
");
scanf("%d",&k);
switch(k)
{case1:
head=creslink();break;
case2:
printf("请输入新学生的学号,姓名,系别,年龄,性别:
");
scanf("%s%s%s%d%c",num,name,xibie,&age,&sex);
insert(head,num,name,xibie,age,sex);
break;
case3:
printf("请输入要删除的学生的学号:
");
scanf("%s",num);
delete(head,num);
break;
case4:
list(head);break;
case5:
f=getlen(head);printf("学生总数为:
%d",f);break;
case6:
return;
}
}
}
实验五文件操作
实验目的:
1.初步了解C语言中文件操作的类型;
2.掌握文件的打开、关闭及读写的操作
3.能熟练进行字符及数据块的读写操作,为后续的课程设计打好基础。
实验内容:
程序1:
从键盘上输入若干个学生的学号及考试成绩,将这些数据写入磁盘文件y.dat中。
(由学号等于0作终止标记)
#include"stdio.h"
main()
{structstudent
{intnum;
floatscore;};
structstudentstu;
FILE*fp;
fp=fopen("y.dat","w");
scanf("%d%f",&stu.num,&stu.score);
while(stu.num!
=0)
{fprintf(fp,"%d%f\n",stu.num,stu.score);
scanf("%d%f",&stu.num,&stu.score);}
fclose(fp);}
程序2:
设有一文件cj.dat存放了50个人的成绩(英语、计算机、数学),存放格式为:
每人一行,成绩间由逗号分隔。
计算三门课平均成绩,统计个人平均成绩大于或等于90分的学生人数。
#include
main()
{FILE*fp;
inti=0,num=0;
floatx,y,z,s1=0,s2=0,s3=0;
fp=fopen("cj.txt","r");
while(i<=50)
{fscanf(fp,"%f,%f,%f",&x,&y,&z);
s1=s1+x;
s2=s2+y;
s3=s3+z;
if((x+y+z)/3>=90)
num=num+1;
i++;}
printf("分数高于90的人数为:
%d",num);
fclose(fp);}
程序3:
统计上题cj.dat文件中每个学生的总成绩,并将原有数据和计算出的总分数存放在磁盘文件“stud”中。
#include"stdio.h"
main()
{FILE*fp1,*fp2;
floatx,y,z;
fp1=fopen("cj.txt","r");
fp2=fopen("stud.txt","w");
while(!
feof(fp1))
{fscanf(fp