C语言程序设计实践实验题目
更新时间:2023-09-20 04:46:01 阅读量: 医药卫生 文档下载
绥化学院程序设计实践实验报告范例 参考
实验题目:循环结构程序设计
实验目的:
1.熟悉VC++6.0的运行环境,掌握C程序的执行方法; 2.掌握三种基本数据类型、部分运算符号和常用函数;
3.掌握三种循环控制语句及break和continue语句的使用方法; 4.掌握循环结构的嵌套及正确控制计数型循环结构次数的方法。 实验内容:
程序1:搬砖问题:36块砖,36人搬,男搬4,女搬3,两个小孩抬1砖,要求一次搬完,问男、女和小孩各若干? #include “stdio.h” main() {
int men,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 \ main()
{int i,j,result; for (i=1;i<10;i++) { for(j=1;j
result=i*j;
printf(\表示左对齐,占3位*/ }
printf(\每一行后换行*/ } }
程序3 求1000以内的所有素数。 #include “stdio.h” main( ) {
int m,i;
for(m=2;m<=100;m++) { for(i=2;i<=m-1;i++) if(m%i==0) break; if(i>m-1) printf(\ } }
程序4:计算和统计旅客运费程序 。 由键盘输入旅客行李重量(w),按公式 :
若( w<=50kg )f=1.5*w ,若(w>50kg)f=1.5*50 + 2.8*(w-50) ( w>50kg )
1
绥化学院程序设计实践实验报告范例 参考
计算运费,要求:
(1)打印每位旅客的顺序号,行李重量,应付运费 ; (2)假定每天最多办理100人的行李托运手续或当w≤0时循环结束, 下班时打印出全天的运费总收入和办理的总人数。 方法一(while结构) #include “stdio.h” main( ) {
int num=0;
float w,f,total=0; scanf(\
while (w>0&&num<100 ) { if (w<=50) f=1.5*w;
else f=1.5*50+2.8*(w-50); num++;
printf ( \ total+=f; scanf (\ }
printf (\ TotalIncome=.2f\\n\}
方法二(do-while结构) #include “stdio.h” main( ) {
int num=0;
float w,f,total=0; do
{ scanf(\ if (w<=0) break; if (w<=50) f=1.5*w; else f=1.5*50+2.8*(w-50); num++;
printf ( \ %8.2f\\n\ total+=f;
} while (num<100);
printf (\ TotalIncome=.2f\\n\ }
方法三(for结构) #include “stdio.h” main( ) {
int num;
float w,f,total=0; scanf(\
for (num=1;w>0&&num<=100;num++) {if (w<=50) f=1.5*w;
else f=1.5*50+2.8*(w-50);
printf ( \ %8.2f\\n\ total+=f; scanf(\ }
printf (\ TotalIncome=.2f\\n\ }
2
绥化学院程序设计实践实验报告范例 参考
3
绥化学院程序设计实践实验报告范例 参考
实 验 二:数组
实验目的:1.更加灵活的使用一维数组和二维数组 2.把数组和指针结合使用 实验内容:
1.约瑟夫环问题
由n个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到3的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。求出所有人的出圈顺序。 #include
{int a[10];
int n=8,i,k=0,j=1,len; len=n; i=0;
//给数组赋值 for(i=0;i //i为元素下标,j代表当前要报的数 ,len表示圈中当前人数 while(len>0){ if(a[k%n]>0){ if(j%3==0){ printf(\找到要出圈的人,并把圈中人数减一 ,最后一个人才输出 a[k%n]=-1; j=1; k++; len--; } else{//报数不是3 k++; j++; } } else//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数 k++; } } 2.学生成绩统计与分析 输入10名学生的英语、C语言、计算机文化基础成绩,统计每名学生三科成绩的平均分,分析三门课程的优秀率,85分以上为优秀。 #include int grade[10][4]; int i,j,average,egood,cgood,jgood; 4 绥化学院程序设计实践实验报告范例 参考 for(i=0;i<10;i++) { printf(\请输入第%d个学生的英语、c语言、计算机\\n\ for(j=0;j<3;j++) scanf(\ } 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\ printf(\英语成绩优秀的学生为%d\\n\ printf(\语言成绩优秀的学生为%d\\n\ printf(\计算机成绩优秀的学生为%d\\n\} 3.利用指针实现数组合并 数组a:“1,7,9,11,13,15,17,19”; 数组b:“2,4,6,8,10”, 两个数组合并为数组c,按升序排列。 #include { int paixu (int c[]); int a[8]={1,7,9,11,13,15,17,19}; int b[5]={2,3,6,8,10}; int c[13]; int *p,*q,*s; for(p=a,s=c;p<8+a;p++,s++) *s=*p; for(q=b;q paixu(int c[]) {int i,j,k; for(j=0;j<12;j++) 5 绥化学院程序设计实践实验报告范例 参考 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(\} 6 绥化学院程序设计实践实验报告范例 参考 实 验 三:函数 实验目的: 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)打印出名次表,包括名次、学生编号、各科分数、总分; 要求程序运行后先打印出一个菜单,提示用户选择:成绩录入、成绩排序、成绩查找,在选择某项功能后执行相应的操作。 7 绥化学院程序设计实践实验报告范例 参考 实 验 四:结构体 实验目的: 1.更加灵活的使用数组作为函数参数; 2.初步掌握开发一个小型实用系统的基本方法; 3.初步掌握书写程序设计开发文档的能力。 实验内容: 程序一:学生信息管理系统 编写程序,实现学生信息的管理(包括学生信息的建立、增加、删除、修改、查找),要求: 小组分工情况 小组分工情况统计表 信息工程学院 计算机科学与技术专业 2012级 软件工程(方向) 班级 班 组 名称 项目组长 组员 组员学号 工作简介 学生信息管理系统 (本次项目小组组长) 一 需求分析 I设计一个学生成绩管理系统至少具有以下功能: (1)菜单功能:采用文本菜单界面。 (2)学生信息的建立。 (3)学生信息的增加。 (4)学生信息的删除。 (5)学生信息的修改。 (6)学生信息的查找。 II数据库结构 struct student { char num[10]; char name[10]; char xibie[10]; char sex; int age; }st[30]; 二 总体设计 框架结构图(系统的功能结构图) 8 绥化学院程序设计实践实验报告范例 参考 学生成绩管理系统 输入 增加 ……退出 程序流程图: (visio) 开始 输出菜单 根据菜单输入n的值选择程序 输入 增加 删除 修改 查找 退出 结束 三、详细设计 (流程图!!!) 四、程序源代码(参考答案) 1.用结构体数组完成 2.用结构体指针完成 1. #include \#include \typedef struct node { char num[10]; char name[10]; char xibie[10]; char sex; int age; }st; int n; st *creslink() { int i; st s[10]; printf(\请输入要录入的人数:\ 9 绥化学院程序设计实践实验报告范例 参考 scanf(\ for (i=0;i<=n-1;i++) { printf(\请输入第%d名学生的学号,姓名,系别,年龄,性别:\ scanf(\ } return s; } int getlen(st s[]) { return n; } insert(st s[],char num[],char name[],char xibie[],int age,char sex) { 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(st s[],char num[]) {int i,j; for(i=0;i if(strcmp(s[i].num,num)==0)break; for(j=i+1;j void list(st s[]) { int i; printf(\学号\\t姓名\\t系别\\t年龄\\t性别\\n\ for(i=0;i printf(\ } void main() { int k,f,age; char num[10],name[10],xibie[10],sex; st *s; while(1) { printf(\学生信息管理系统\\n\ printf(\ printf(\录入学生信息\\n\ printf(\插入新学生信息\\n\ printf(\删除学生信息\\n\ printf(\输出学生信息\\n\ printf(\输出学生总数\\n\ printf(\退出\\n\ printf(\ printf(\请选择:\ scanf(\ 10 绥化学院程序设计实践实验报告范例 参考 switch(k) {case 1:s=creslink();break; case 2: printf(\请输入新学生的学号,姓名,系别,年龄,性别:\ scanf(\ insert(s,num,name,xibie,age,sex); break; case 3:printf(\请输入要删除的学生的学号:\ scanf(\ delete(s,num); break; case 4:list(s);break; case 5:f=getlen(s);printf(\学生总数为:%d\ case 6:return; } } } 2.#include \#include \#define null 0 typedef struct node { char num[10]; char name[10]; char xibie[10]; char sex; int age; struct node *next; }slink; slink *creslink() { slink *head,*p,*s; int i,n; printf(\请输入要录入的人数:\scanf(\if(n<1) return null; p=head=(slink *)malloc(sizeof(slink)); head->next=null; for (i=1;i<=n;i++) { s=(slink *)malloc(sizeof(slink)); printf(\请输入第%d名学生的学号,姓名,系别,年龄,性别:\ scanf(\ p->next=s; p=s; } p->next=null; return head; } int getlen(slink *head) { 11 绥化学院程序设计实践实验报告范例 参考 slink *p; int n; p=head->next; n=0; while (p!=null) { n++; p=p->next; } return n; } insert(slink *head,char num[],char name[],char xibie[],int age,char sex) { slink *p,*q; p=head; while(p->next!=null) p=p->next; q=(struct node *)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,char num[]) { 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); } void list(slink *head) { slink *p; printf(\学号\\t姓名\\t系别\\t年龄\\t性别\\n\ p=head->next; while(p!=null) { printf(\ p=p->next; } printf(\} void main() { int k,f,age; char num[10],name[10],xibie[10],sex; slink *head; 12 绥化学院程序设计实践实验报告范例 参考 while(1) { printf(\学生信息管理系统\\n\ printf(\ printf(\录入学生信息\\n\ printf(\插入新学生信息\\n\ printf(\删除学生信息\\n\ printf(\输出学生信息\\n\ printf(\输出学生总数\\n\ printf(\退出\\n\ printf(\ printf(\请选择:\ scanf(\ switch(k) {case 1:head=creslink();break; case 2: printf(\请输入新学生的学号,姓名,系别,年龄,性别:\ scanf(\ insert(head,num,name,xibie,age,sex); break; case 3:printf(\请输入要删除的学生的学号:\ scanf(\ delete(head,num); break; case 4:list(head);break; case 5:f=getlen(head);printf(\学生总数为:%d\ case 6:return; } } } 13 绥化学院程序设计实践实验报告范例 参考 实验五 文件操作 实验目的: 1.初步了解C语言中文件操作的类型; 2.掌握文件的打开、关闭及读写的操作 3.能熟练进行字符及数据块的读写操作,为后续的课程设计打好基础。 实验内容: 程序1:从键盘上输入若干个学生的学号及考试成绩, 将这些数据写入磁盘文件y.dat中。(由学号等于0作终止标记) #include \main() { struct student { int num; float score; }; struct student stu; FILE *fp; fp=fopen(\ scanf(\while(stu.num!=0) { fprintf(fp, \ %f\\n\ scanf(\fclose(fp);} 程序2:设有一文件cj.dat存放了50个人的成绩(英语、计算机、数学),存放格式为:每人一行,成绩间由逗号分隔。计算三门课平均成绩,统计个人平均成绩大于或等于90分的学生人数。 #include int i=0,num=0; float x , y , z , s1=0, s2=0, s3=0 ; fp=fopen (\ while(i<=50) {fscanf (fp,\ s1=s1+x; s2=s2+y; s3=s3+z; if((x+y+z)/3>=90) num=num+1; i++;} printf(\分数高于90的人数为:%d\ fclose(fp);} 程序3:统计上题cj.dat文件中每个学生的总成绩,并将原有数据和计算出的总分数存放在磁盘文件“stud”中。 #include \ main() { FILE *fp1,*fp2; float x,y,z; fp1=fopen(\ fp2=fopen(\ 14 绥化学院程序设计实践实验报告范例 参考 while(!feof(fp1)) { fscanf (fp1,\ printf(\ fprintf(fp2,\ fclose(fp1); fclose(fp2); } 15 绥化学院程序设计实践实验报告范例 参考 实 验 六:万年历 实验目的: 1、复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握; 2、将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力 3、提高学生适应实际,实践编程的能力。 实验内容: 程序一:编写万年历 小组分工情况 小组分工情况统计表 信息工程学院 计算机科学与技术专业 2012级 软件工程(方向) 班级 班 组 名称 项目组长 组员 组员学号 工作简介 学生成绩管理系统 (本次项目小组组长) 一 需求分析 万年历能实现一些功能,主要包括以下几点: (1)日历显示功能。能根据系统日期进行初始化,如果没有任何输入,则显示系统日期所在月份的月历。 判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期: nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; 其中year:要查询的年份 nday:从该年的一月一日起到该天的天数 w:得出的星期数,w==0表示星期天。 在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。对于初始输入当前月历,可以通过 gmt=localtime(&timer); gmt就是一个时间结构体,可以从中取出年月日. (2)日历查询、闰年判断功能。输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年 能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。日期的查询,就是直接打印改天所在月份的月历 (3)参数检查功能。如果输入日期不合法,查询将被拒绝,并显示提示信息。 判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和 16 绥化学院程序设计实践实验报告范例 参考 31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。 (4)通过键盘操作(如:光标上、下、左、右移动键,pageup、pagedown键)调整年份、月份和日期,并显示调整后的日期及月历。 捕获键盘的输入,通过两个getch();将后一个getch()的返回值付给整型或字符型k,k为相应键的ascii值,判断ascii值,就可以知道时哪个键的输入。若捕获到某键的输入,则设置相应的年或月或日的值,再进行刷性输出,就可以实现日期的调整。 二 总体设计(visio) 本系统包括4个模块,分别是功能控制模块﹑打印输出模块﹑日历显示模块和键值获取模块。 1、功能控制模块。该模块用于实现日期有效性检查﹑判断是否是闰年和返回指定日期对应的日期。 2、打印输出模块。该模块主要是进行输出显示,包括打印指定个数的空格﹑打印分隔线﹑打印用户使用手册﹑打印当前日期对应的星期以及打印指定的星期。 3、日历显示模块。该模块是系统的核心模块,是用来显示指定日期所在月份的月历。 4、键值获取模块。该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。 万年历 功打 日键能印 历值控输 显获制出 示取模模 模模块 块 块 块 日日修帮 历历改助 显查日退 期 示 询 出 图2-1功能模块图 总函数流程图 17 绥化学院程序设计实践实验报告范例 参考 图3-1总函数流程图 三、详细设计 (1)由于万年历具有以下特点: 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。 (2)根据万年历以上特点进行编写 1)首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义一个数组存放天数,用while循环控制。 2)再对其中的星期进行编写: 由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)由于其公式为:某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7 闰4百年3月1日星期算法(百年%4=0)其公式为:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7例: 2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三 18 绥化学院程序设计实践实验报告范例 参考 平4百年3月1日星期算法(百年%4<>0)其公式为:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 例:2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年) 其中万年某日星期算法 其公式为:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 (1)int isleapYear(int year); 该函数判断某年是否是闰年,参数year表示要判断的年份,返回值1表示该年为闰年,0表示该年为平年。 int IsLeapYear( int year ) {if ((year %4 == 0) && (year % 100 != 0) ||(year % 400 == 0) ) return 1; else return 0; 流程图: 开始 Y Return 1 Year@0 N Y N Year%4 Year0 Return 0 N Y Return 0 Return 1 闰年判断 (2)struct tm* getDay(); 该函数用以取得系统的时间。该函数没有参数,返回值类型为struct tm*,是一个包含时间的结构体 struct tm* getDay()//从系统取得当前时间 { time_t timer; struct tm* gmt; time(&timer); gmt=localtime(&timer); return gmt; } (3)int getwDay(int year,int month,int day); 该函数用以根据一个日期推断星期,参数为要判断的年月日。返回值为整型,123456分别表示星期一到星期六,0表示星期天。 int getwDay(int year,int month,int day)//取得星期 { int nday=0,nDay,i,w; for(i=0;i nday+=daysOfMonth[runYear(year)][i]; nday+=day; nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; return w; } 19 绥化学院程序设计实践实验报告范例 参考 (流程图!!!) 四、程序源代码 #include #define KEYNUMUp 0x48 #define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d #define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int year,month,day; //全局变量记录时间 int daysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31, 30,31}}; int runYear(int year) //判断是否是闰年 { int flag=0; if(year@0==0||(year%4==0&&year0!=0)) flag=1; return flag; } struct tm* getDay()//从系统取得当前时间 { time_t timer; struct tm* gmt; time(&timer); gmt=localtime(&timer); return gmt; } int dayExame(int year,int month,int day)//检查日期是否正确 { if(year<0||month<1||month>12||day<1||day>31) return 0; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day>31)return 0;break; case 4: case 6: case 9: case 11: 20 绥化学院程序设计实践实验报告范例 参考 附:项目三书写格式 项目三:汇款系统 1、实验目的: (1)掌握C语言整型变量、实型变量、字符数组的初始化、引用。 (2)掌握C语言的循环控制、通过循环控制引用字符数组中的元素进行操作。 (3)通过对部分C库函数的使用,掌握最基本的程序控制,字符数组操作,自定义函数的编写。 (3)了解C语言中数组参数的传递如何通过指针来实现。 2、项目简介 电子汇兑系统是国家邮政局为了适应市场竞争,彻底改变传统邮政汇兑的手工方式,建立的一个连接国家邮政局、31个省局、2468个县局和大量的基层网点的安全、稳定高效的系统,它将传统邮政汇兑的传递实物汇票的方式改变为以电子信息传递汇兑数据,以电子信息作为业务交易。业务种类有普通、电子汇款、加急汇款、特急汇款。本项目仅仅模拟了电子汇兑电子汇款中计算汇费的部分,不包括邮政电子汇兑其他附加服务所收取的费用。下面我们来了解一下汇费计算的具体需求: (1)国内邮政电子汇兑每笔汇款最高限额为5万元,最低汇款限额每笔为1元。 (2)限额内按汇款金额的1%收取汇费,每笔汇款最低汇费2元,最高汇费50元。 3、需求分析 我们根据项目需求简介中汇费计算的具体需求,来分析一下汇费的计算方法,如下: 限额内按汇款金额的1%收取汇费:汇费 = 汇款金额 × 0.01 每笔汇款最低汇费2元:如果汇费小于最低汇费,则汇费 = 2元。 每笔汇款最高汇费50元:如果汇费大于最高汇费,则汇费 = 50元。 下面,举例来说明汇费的计算方法。 汇款金额计算方法 1600元:计算公式为 1600 × 0.01 = 16元 6000元:计算公式为 6000 × 0.01 = 60元 大于最高汇费50元,则汇费 = 50元。 10元:计算公式为 10 × 0.01 = 0.1元 小于最低汇费2元,则汇费 = 2元。 4、系统设计 (1)功能概述:输入汇款金额,计算出应缴纳的汇费。 (2)系统主要功能: 1.主函数:循环录入汇款金额,并计算出汇费,录入?0?表示结束。 2.数据的合法性检查:输入汇款金额,检查数据的合法性,必须大于等于1,小于等于50000,必须是包含一个小数点的金额格式。 3.计算:根据汇款金额,计算出应缴汇费。 (3)汇款系统流程图: 41 绥化学院程序设计实践实验报告范例 参考 开始录入汇款金额格式非法格式是否合法格式合法0非 01-50000小于1或者大于50000计算汇费0 结束打印汇费结束5、系统实现 (1)系统主函数main()实现 在主函数中,循环获得录入的汇款金额,把汇款金额当做参数,传递给格式判断函数,判断汇款金额格式是否合法,格式非法则停止当前循环,进入下一次循环;格式合法然后判断汇款金额是0还是正常汇款金额(1到50000),0表示退出程序;非正常汇款金额(小于1或者大于50000)停止当前循环,进入下一次循环;如果是正常汇款金额把正常汇款金额当作参数,传递给汇费计算函数,计算返回应缴汇费。最后把结果打印到屏幕上,进入下一次循环。 在主函数main()之前添加需要的系统头文件: #include 包含以上系统头文件后才能正常调用C语言的库函数,首先得到用户录入的汇款金额。功能的实现是通过C语言的字符串处理函数gets实现的。接着调用自定义函数CheckMoney检查汇款金额格式是否合法。如果汇款金额格式非法,则提示“录入的金额格式非法!” continue停止当前这一遍循环,然后直接尝试下一遍循环继续提示用户“请录入汇款金额(元),0表示结束:”。 如果汇款金额格式合法,首先调用atof函数将汇款金额字符数组转换成实型数据,然后判断汇款金额是否是?0?,如果用户录入?0?则break退出循环,正常结束程序。 如果汇款金额非?0?,然后判断汇款金额是否低于最低汇款限额1元。如果低于最低汇款限额,则提示“低于最低汇款限额!” continue停止当前这一遍循环,然后直接尝试下一遍循环继续提示用户“请录入汇款金额(元),0表示结束:”。 如果汇款金额不低于最低汇款限额1元,则判断录入的汇款金额是否超过最高汇款限额50000元。如果超过最高汇款限额,则提示“超过最高汇款限额!” continue停止当前这一遍循环,然后直接尝试下一遍循环继续提示用户“请录入汇款金额(元),0表示结束:”。 如果汇款金额格式正常,没有超出汇款金额限制范围,则调用自定义函数Get_Fee根据汇款金额计算汇费,然后调用printf函数显示应收汇费。继续下一遍循环继续提示用户“请录入汇款金额(元),0表示结束:”。 (2)自定义函数CheckMoney 函数CheckMoney的形参money为指向字符数组的指针变量,函数开始执行时,money指向实参cmoney[0]。为什么函数CheckMoney的参数要定义成指针呢? 42 绥化学院程序设计实践实验报告范例 参考 因为:数组的名字就是指向首元素的指针,取数组元素可以通过指针运算获得,数组参数的传递通过指针来实现。首先调用C语言的字符串库函数memset初始化临时字符数组变量cStrTmp,然后调用同样是C语言的字符串库函数memcpy将money中的内容复制到cStrTmp中。 6、源码 #include //检查录入的汇款金额格式是否合法。 int CheckMoney(char * money); //根据汇款金额计算汇费。 double Get_Fee(double money); main() { char cmoney[100];//汇款金额 double dmoney = 0,dfee = 0;//汇款金额,汇费 printf(\ printf(\ ***\\n\ printf(\ (欢迎光临汇款系统) ***\\n\ printf(\ ***\\n\ printf(\ for(;;) { memset(cmoney, 0 , sizeof(cmoney)); printf(\请录入汇款金额(元),0表示结束:\ gets(cmoney); //检查录入的汇款金额格式是否合法 if(CheckMoney(cmoney)) { printf(\录入的金额格式非法!\\n\ continue; } dmoney = atof(cmoney); //判断是否退出循环 if(dmoney == 0) { break; } //判断汇款金额是否低于最低汇款限额1元 if(dmoney < 1) { printf(\低于最低汇款限额!\\n\ continue; } //判断汇款金额是否超过最高汇款限额50000元 if(dmoney > 50000) { 43 绥化学院程序设计实践实验报告范例 参考 printf(\超过最高汇款限额!\\n\ continue; } //根据汇款金额计算汇费 dfee = Get_Fee(dmoney); printf(\汇款金额:%8.2f元,应收汇费:%8.2f元\\n\ } exit(0); } //检查录入的汇款金额格式是否合法。输入参数:汇款金额。返回值:1 格式非法;0 格式正确 int CheckMoney(char * money) { char cStrTmp[100];// int i,length = 0,flag = 0;//循环变量,字符串长度,小数点出现的次数标志 memset(cStrTmp, 0, sizeof(cStrTmp)); memcpy(cStrTmp, money, sizeof(cStrTmp)); length = strlen(cStrTmp); //循环检查字符串中每一个字符的合法性 for(i=0; i //如果小数点出现大于1次,格式非法 if(flag > 1) { return 1; } //如果小数点出现,小数点出现的次数标志加1 if(cStrTmp[i] == '.') { flag += 1; continue; } //如果字符不是数字,格式非法 if(!isdigit(cStrTmp[i])) { return 1; } } return 0; } //根据汇款金额计算汇费。输入参数:汇款金额。返回值:汇费。 double Get_Fee(double money) { double fee = 0; //收取1%汇费 fee = money * 0.01; //最低汇费2元 if(fee < 2) 44 绥化学院程序设计实践实验报告范例 参考 { fee = 2; } //最高汇费50元 if(fee > 50) { fee = 50; } return fee; } 45 绥化学院程序设计实践实验报告范例 参考 if(day>30)return 0;break; default: if(runYear(year)&&day>29) return 0; else if(runYear(year)==0&&day>28) return 0; } return 1; } int getwDay(int year,int month,int day)//取得星期 { int nday=0,nDay,i,w; for(i=0;i void printCalender(int year,int month,int day); void setDay(int year,int month,int day)//调节日期 { char k; printf(\上一年 %c:下一年\\n\ printf(\上个月 %c:下个月\\n\ printf(\昨天 PageDown:明天\\n\ printf(\其他:返回主菜单\\n\ getch(); k=getch(); switch(k) //通过方向键和PageUp、PageDown键来调整日期 { case KEYNUMUp: year--; if(dayExame(year,month,day)==0){year++; printf(\检查日期的合法性,//若错误,保持日期不变,并警告 system(\ case KEYNUMDown: year++; if(dayExame(year,month,day)==0){year--;printf(\ system(\ case KEYNUMLeft: month--; if(dayExame(year,month,day)==0){month++;printf(\ system(\ case KEYNUMRight: month++; if(dayExame(year,month,day)==0){month--;printf(\ system(\ case KEYNUMPageUp: day--; if(dayExame(year,month,day)==0){day++;printf(\ system(\ case KEYNUMPageDown: day++; if(dayExame(year,month,day)==0){day--;printf(\ 21 绥化学院程序设计实践实验报告范例 参考 system(\ default: ; } } void printCalender(int year,int month,int day)//打印月历 { int i,n; int w; int nowDay=1; char wday[7][4]={\ printf(\ %d年%d月%d日\\n\ printf(\ for(i=0;i<7;i++) printf(\ printf(\ w=getwDay(year,month,nowDay);//找到第一天的星期 n=daysOfMonth[runYear(year)][month-1]; switch(w) //放置第一天 { case 0:printf(\ case 1:printf(\ case 2:printf(\ case 3:printf(\ case 4:printf(\ case 5:printf(\ default:printf(\ } nowDay++; for(i=1;i void checkCalender()//查询日历 { int year,month,day; system(\ printf(\请输入你要查询的日期(格式为年月日,如2009 11 3):\ scanf(\ while(!dayExame(year,month,day)) //如果日期输入不正确,则重新输入 { printf(\你输入的日期错误,请重新输入:\ scanf(\ 22 绥化学院程序设计实践实验报告范例 参考 } system(\ if(runYear(year)) printf(\闰年\\n\\n\ else printf(\ 平年\\n\\n\ printCalender(year,month,day); } void backMenu() { printf(\请按任意字符键返回主菜单:\ getch(); system(\} void mainMenu(int year,int month,int day)//主菜单 {char menu[100]; int f=0; int flag=0; printf(\ ************主菜单************\\n\ printf(\ * 1、日历显示 *\\n\ printf(\ * 2、日历查询 *\\n\ printf(\ * 3、修改日期 *\\n\ printf(\ * 4、帮助 *\\n\ printf(\ * 5、退出 *\\n\ printf(\ ******************************\\n\ do{ do { f=0; printf(\ 请输入相应数字:\ scanf(\ if(strlen(menu)>2)f=1; }while(f==1); switch(*menu) { case '1': system(\ //清屏 printCalender(year,month,day); backMenu(); //实现任意键返回主菜单 mainMenu(year,month,day); break; case '2': system(\ checkCalender(); backMenu(); mainMenu(year,month,day); break; 23 绥化学院程序设计实践实验报告范例 参考 case '3': system(\ printCalender(year,month,day); setDay(year,month,day); printf(\请按任意字符键返回主菜单:\ getch(); system(\ mainMenu(year,month,day); break; case '4': system(\ printf(\在主菜单中输入相应的数字就可以完成以下功能:\\n\\n\ printf(\、显示今天所在月的月份\\n\\n\ printf(\、输入日期,判断该年是否是闰年,并显示所在月份的月历\\n\\n\ printf(\、用%c %c %c %c PageUp PageDown 进行日期的调整\\n\\n\ printf(\、显示功能及操作方法\\n\\n\ printf(\、退出程序\\n\\n\ backMenu(); mainMenu(year,month,day); break; case '5':system(\程序已退出!\\n\ default:printf(\ 输入错误!\\n\ } }while(flag); } void main() { struct tm *gmt=getDay(); year=gmt->tm_year+1900; month=gmt->tm_mon+1; day=gmt->tm_mday; printCalender(year,month,day);//用系统时间进行初始化,打印当前月历 backMenu(); mainMenu(year,month,day); } 实验题目: 通讯录 实验目的: 通过本次实验使学生进一步加深对程序设计实践课程内容的理解,能够利用程序设计的基本思想进行程序的开发,进一步掌握编程方法和技巧,提高学生用程序的思想来解决实际问题的能力。 实验内容 通讯录是大家十分熟悉的系统,主要是为方便查询联系方式、通信地址而建立的。应至少提供以下功能: (1)提供简单、易操作的人机界面; (2)提供对通讯录的建立、修改、追加记录、删除记录等基本功能; (3)提供查询记录的功能; (4)提供显示通讯录的功能; (5)提供保存信息的功能。 24 绥化学院程序设计实践实验报告范例 参考 小组分工情况 班级 名称 项目组长 组员 组员学号 工作简介 时间进度安排 软一软二班 顺序 阶段日期 1 预习 2 4月10日 3 4月12日 4 4月12日 5 4月17日 软三软四班 顺序 1 2 3 4 5 阶段日期 预习 4月9日 4月12日 4月12日 4月16日 表1-2 时间进度安排表 计 划 完 成 内 容 查阅资料,充分解读题目内容 小组分工,确定每个人的具体任务,上机编程。 上机编程,程序整合,综合调试。 程序测试,撰写实验报告。 上交实验报告。 表1-3 时间进度安排表 计 划 完 成 内 容 查阅资料,充分解读题目内容 小组分工,确定每个人的具体任务,上机编程。 上机编程,程序整合,综合调试。 程序测试,撰写实验报告。 上交实验报告。 备注 4学时 2学时 2学时 2学时 上课前 表1-1小组分工情况统计表 信息工程学院 计算机科学与技术专业 2012级 软件工程(方向) 班 组 通讯录 (本次项目小组组长) 备注 4学时 2学时 2学时 2学时 上课前 25 绥化学院程序设计实践实验报告范例 参考 一 需求分析 设计一个通讯录管理系统具有以下功能: (1)菜单功能:采用文本菜单界面。 (2)查看功能:可以显示出通讯录里的姓名、电话号码等详细信息。 (3)添加功能:依次输入编号、姓名、年龄、电话号码、电子邮箱后,会提示是否继续添加。 (4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改。 (5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除。 (6)查询功能:要求能通过输入姓名或者电话号码查询此人的详细信息。 (7)保存功能:输入文件名(带后缀名)后,即可将通讯录信息保存到文件。 需求说明:在主界面菜单下,根据提示,选择功能操作,来实现通讯信息的存储、修改、删除、查看等功能。通讯录个人信息包括个人的编号、姓名、年龄、电话号码、电子邮箱等,并且要求人名、号码不能重复,录入的个人信息要求用文件形式保存,并可以进行查看、查询、修改、删除等基本操作。个人信息显示要求有一定的规范的格式。对个人信息的查询应能够按照号码和姓名两种方式来查找浏览信息。 二 总体设计 通讯录功能模块图,如图2-1所示。 主菜单 添加 显示删除查询修改保存退出 图2-1 功能模块图 其中,添加通讯录信息模块完成通讯录个人信息的输入功能,输入信息包括个人的编号、姓名、年龄、电话号码、电子邮箱等;修改联系人信息模块完成个人通讯信息的修改功能;删除联系人信息模块完成个人通讯信息的删除功能;查询联系人信息模块完成个人通讯信息的查询,查询时对应有按号码和姓名等多种方式;菜单选择模块是通讯录管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择,并通过调用其他模块实现相应的功能。 26 绥化学院程序设计实践实验报告范例 参考 三、详细设计 ①添加:添加通讯录记录 ②显示:显示通讯录记录 ③删除:删除通讯录记录 27 绥化学院程序设计实践实验报告范例 参考 ④查询:查询通讯录记录先选择查询方式(以姓名查询方式为例) ⑤修改:修改通讯录记录 28 绥化学院程序设计实践实验报告范例 参考 29 绥化学院程序设计实践实验报告范例 参考 四、程序源代码 #include typedef struct { char score; /*编号*/ char name[10]; /*姓名*/ char num[15]; /*号码*/ char email[20]; /*邮箱*/ char age[8]; /*年龄*/ char adds[20]; /*住址*/ }Person; Person pe[80]; int menu_select() { char c; do{ system(\ printf(\通讯录***** \\n\ printf(\┌───────┐\\n\ printf(\│ 1. 添加记录 │\\n\ printf(\│ 2. 显示记录 │\\n\ printf(\│ 3. 删除记录 │\\n\ printf(\│ 4. 查询记录 │\\n\ printf(\│ 5. 修改记录 │\\n\ printf(\│ 6. 保存记录 │\\n\ printf(\│ 0. 退出程序 │\\n\ printf(\└───────┘\\n\ printf(\请您选择(0-6):\ c=getchar(); }while(c<'0'||c>'6'); return(c-'0'); } int Input(Person per[],int n) { int i=0; char sign,x[10]; while(sign!='n'&&sign!='N') { printf(\编号:\ scanf(\ printf(\姓名:\ scanf(\ 30 绥化学院程序设计实践实验报告范例 参考 printf(\年龄:\ scanf(\ printf(\电话号码:\ scanf(\ printf(\通讯住址:\ scanf(\ printf(\电子邮箱:\ scanf(\ gets(x); printf(\是否继续添加?(Y/N)\ scanf(\ i++; } return(n+i); } void Display(Person per[],int n) { int i; printf(\ /*格式*/ printf(\编号 姓名 年龄 电话号码 通讯地址 电子邮箱\\n\ printf(\ for(i=1;i printf(\.age,per[i-1].num,per[i-1].adds,per[i-1].email); if(i>1&&i==0) { printf(\ printf(\ system(\ printf(\ } } printf(\ system(\ } int Delete_a_record(Person per[],int n) { char s[20]; int i=0,j; printf(\请输入想删除记录中的名字:\ 31 绥化学院程序设计实践实验报告范例 参考 scanf(\ while(strcmp(per[i].name,s)!=0&&i for(j=i;j printf(\已经成功删除!\\n\ return(n-1); } void Query_a_record(Person per[],int n) { int m; printf(\请选择查询方式:\\n\ printf(\┌──────┐\\n\ printf(\│1------姓名 │\\n\ printf(\│2------电话 │\\n\ printf(\│3------地址 │\\n\ printf(\│4------返回 │\\n\ printf(\└──────┘\\n\ printf(\请选择:\ scanf(\ while(m!=1&&m!=2&&m!=3&&m!=4) { printf(\输入错误,请重新选择:\ scanf(\ } if(m==1) { char s[20]; int i=0; printf(\请输入想查询的姓名:\ scanf(\ while(strcmp(per[i].name,s)!=0&&i 32 绥化学院程序设计实践实验报告范例 参考 } ; printf(\通讯录中没有此人!\\n\ return; } printf(\此人编号: %d\\n\printf(\此人年龄: %s\\n\ printf(\电话号码: %s\\n\ printf(\通讯地址: %s\\n\printf(\电子邮箱: %s\\n\ if(m==2) { char s[20]; int i=0; printf(\请输入想查询的电话:\ scanf(\ while(strcmp(per[i].num,s)!=0&&i } printf(\此人编号: %d\\n\printf(\此人姓名: %s\\n\printf(\此人年龄: %s\\n\ printf(\通讯地址: %s\\n\printf(\电子邮箱: %s\\n\ if(m==3) { char s[20]; int i=0; printf(\请输入想查询的地址:\ scanf(\ while(strcmp(per[i].adds,s)!=0&&i 33 绥化学院程序设计实践实验报告范例 参考 } void Change(Person per[],int n) { char s[20]; int i=0; printf(\请输入想修改的记录中的名字:\ scanf(\ while(strcmp(per[i].name,s)!=0&&i printf(\编号:\ scanf(\ printf(\姓名:\ scanf(\ printf(\年龄:\ scanf(\ printf(\电话号码:\ scanf(\ printf(\通讯住址:\ scanf(\ printf(\电子邮箱:\ scanf(\ printf(\修改成功!\} void WritetoText(Person per[],int n) { int i=0; FILE *fp; /*定义文件指针*/ char filename[20]; /*定义文件名*/ printf(\保存到文件\\n\ /*输入文件名*/ printf(\请输入所保存的文件名:\ scanf(\ if((fp=fopen(filename,\ { printf(\无法打开文件\\n\ system(\ return; } fprintf(fp,\通讯录******************************************\\n\ 34 绥化学院程序设计实践实验报告范例 参考 fprintf(fp,\编号 姓名 年龄 电话号码 通讯地址 电子邮箱\\n\ fprintf(fp,\-----\\n\ while(i fprintf(fp,\er[i].age,per[i].num,per[i].adds,per[i].email); i++; } fprintf(fp,\-----\\n\ fprintf(fp,\共有%d条记录****************************************\\n\ fclose(fp); /*关闭文件*/ printf(\保存成功!\\n\ } void main() /*主函数*/ { int n=0; for(;;) { switch(menu_select()) { case 1: printf(\添加记录到通讯录\\n\ /*添加记录*/ n=Input(pe,n); break; case 2: printf(\ 通讯录记录表\\n\ /*显示记录*/ Display(pe,n); break; case 3: printf(\从通讯录中删除记录\\n\ n=Delete_a_record(pe,n); /*删除记录*/ printf(\ system(\ break; case 4: printf(\在通讯录中查找记录\\n\ Query_a_record(pe,n); /*查找记录*/ 35
正在阅读:
C语言程序设计实践实验题目09-20
毕奥-萨伐尔定律是怎样建立的03-09
综采电工评分办法04-30
湖南工大机电控制技术试卷B - 图文10-20
抗肿瘤药物药效学实验方法及指导原则05-27
2016秋人教版三年级语文下册第四单元素质能力测试试题12-15
人教版八年级语文下册课内古诗词鉴赏05-15