C语言程序设计课程报告
更新时间:2023-05-01 18:03:01 阅读量: 实用文档 文档下载
C语言课程设计实验报告
班级:信息14-2
学号:201411041072
姓名:邓承值
指导老师:祝洪杰
一:设计目的
1、通过课程设计掌C语言的语法结构,准确的使用各种数据类型。
2、熟练运用if、switch、for_w h i l e、do_while、continue、break等语句为经典
的题目编写程序,为科研项目中的部分题目编写程序。
3、灵活的使用数组,处理一维数组、二维数组、指针;掌握各种排序的方法;理解
递归调用的过程,使用递归的方法设计程序。掌握“自顶向下,逐步细化”的模块化程序设计方法。
4、通过使用C语言程序设计,巩固和掌握C语言的一些基本概念和基本理论,提高实
际动手能力,并通过实现编写程序,加强对C语言的运用,加深对C语言的理解和掌握。
二:题目
必做题
1、输入某年某月某日,判断这一天是这一年的第几天。
2、输出一个国际象棋棋盘。
3、任意输入三个实数,打印其最大值,最小值,平均值,要求用函数及指针作函数实参,
指针变量作形参的方法实现。
4、通过指针数组P和一维数组a构成一个3*2的二维数组;并为a数组赋初值2,4,6,8……
要求先按行的顺序输出此二维数组;然后再按列的顺序输出它。
选做题
图书信息管理系统设计
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,使之能提供以下功能:
v系统以菜单方式工作
v图书信息录入功能(图书信息用文件保存)--输入
v图书信息浏览功能--输出
v查询和排序功能:(至少一种查询方式)--算法
l 按书名查询
l 按作者名查询
v图书信息的删除与修改(可选项)
三:总体设计第1题1,2:
第1题3:
第2题:
第3 题1:
第4题1:
第3题2:排序主函数
第4题2:行输出列输出
是
四:具体设计过程
第1题1:本题的关键是平年和闰年的区分,就是2月份是28天还是29天的区分。
#include
void main()
{
int sumday (int month,int day);
int leap (int year);
int year,month,days,day;
int
daytab[13]={0,31,28,31,30,31,30,31,30,31,30,31,30};
printf("please input date(year mouth day):");
scanf("%d%d%d",&year,&month,&day);
printf("%d%d%d",&year,&month,&day);
days=sumday(month,day);
if(leap(year)&&month>=3)
days=days+1;
printf("Today is the %d of this year.",days);
printf("\n");
}
int sumday(int month,int day)
{
int
daytab[13]={0,31,28,31,30,31,30,31,30,31,30,31,30};
int i;
for(i=0;i return day; } int leap(int year) { int leap; leap=(year%4==0&&year%100!=0||year% 400==0); return leap; } 这是一个基本的程序题目,看上去比较复杂,但是内容十分好懂,只是涉及到基本的语句,定义一个多维数组,还有值传递以及一个判断语句,闰年的判断。 程序的运行结果如下: 明显的,输入的数据是是2014年2月30日,2月是没有30号的,但是程序却依旧输出了结果,由此可知,程序存在错误,2月份应该不超过29,否则应该提示错误。 第1题2: #include int main() { int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i,year,month,d,n,sum; printf("please input date(year mouth day):"); while(scanf("%d%d%d",&year,&month,&d)) { sum=0; for(i=1;i sum=sum+days[i]; sum=sum+d; if((year%400==0||(year%4==0&&year%100!=0))&&month>=3) sum=sum+1; printf("%d\n",sum); } return 0; } 第二种方法仍是一维数组,用了一个while循环,这样的设计可以一次性输入多个日期,程序当中的“ar%4==0&&year%100!=0))&&month>=3) sum=sum+1;” 则是判断出闰年后使其结果增加一天。 由程序运行结果可是,已经存在2月30日的输出结果,是因为没有添加判断输入日期是否正确的语句,应该在程序中再将其加入。 第1题3: #include int main() { int year,month,day,flag,i,x=0; int num[][14]={ {0,0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,0,31,29,31,30,31,30,31,31,30,31,30,31}}; printf("请输入年,月,日\n"); scanf("%d,%d,%d",&year,&month,&day); if(year%4==0&&year%100!=0||(year%400)==0) flag=1; else flag=0; if(day>num[flag][month+1]) { printf("Enters dates in an incorrect format!\n"); return 0; } else { for(i=1;i<=month;i++) x=x+num[flag][i]; x=x+day; printf("%d月%d日是%d年第%d天\n",month,day,year,x); return 0; } } 这回定义了一个二维数组,直接写出二月平常年份28天,闰年29天,通过 day>num[flag][month+1] printf("Enters dates in an incorrect format!\n"); 这个语句是日期输入是否正确的判断语句,如果输入的日期错误,将会提示输入错误。 其运行结果如下图: 由运行结果图可知,通过不断调试,程序能够正确判断输入的日期是否正确以及能够正确计算出结果,程序完成。 第2题: #include #include int main() { int i,j; system("chcp 437"); for(i=1;i<=8;i++) { for(j=1;j<=8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("\n"); } return 0; } 本题难度不大,做起来比较简单,注意一个循环就行,但是容易犯错,下面只最初写的程序#include int main() { int i,j; for(i=1;i<=8;i++) { for(j=1;j<=8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("\n"); } return 0; } 这个程序看上去没什么明显错误,通过编译运行之后,运行的结果却是这样的: 查找资料才得知,标准输入输出函数是不能输出127后边的ASCII值的,通过查找资料得知要用到标准扩#include 还有printf(" ");时中间为俩个空格,因为219是竖的黒格,得两个一起,否则就是这样 正确的运行结果如下图: 一个很简单的程序题,只因为一个小细节而发生这么大的误差,所以C语言的精确是很值得注意,也是很重要的。 第3题1: #include double MAX(double *x,double * y,double *z); double MIN(double *x,double * y,double *z); double max,min,ave; //定义全局变量 int main() { double a,b,c; double *p1,*p2,*p3; printf("Please input a,b,c:"); scanf("%lf,%lf,%lf",&a,&b,&c); p1=&a;p2=&b;p3=&c;//指针赋值 MAX(p1,p2,p3); MIN(p1,p2,p3); ave=(a+b+c)/3; printf("max = %lf\n",max); printf("min = %lf\n",min); printf("ave = %lf\n",ave); return 0; } double MAX(double *x,double * y,double *z) { max = *x; if(*y>max) max = *y; if(*z>max) max = *z; return (max); } double MIN(double *x,double * y,double *z) { min=*x; if(*y if(*z return (min); } 运行结果为: 这里定义了全局变量 为了能够得到小数,又因为在C编译系统把浮点型常量都按双精度处理,所以直接定义成双精度浮点型double 而又因为是按%f输出,所以小数部分输出六位 第3题2: #include float num(int *a,int *b,int *c) { int temp; if(*a<*c) {temp=*a;*a=*c;*c=temp;} if(*b>*a) {temp=*a;*a=*b;*b=temp;} else if(*b<*c) {temp=*b;*b=*c;*c=temp;} return((*a+*b+*c)/3.00); } void main() { int i,j,k,*p1,*p2,*p3; float aver; p1=&i; p2=&j; p3=&k; printf("please enter 3 numbers:"); scanf("%d%d%d",&i,&j,&k); aver=num(p1,p2,p3); printf("max=%d\nmin=%d\naverage=%.2f\n",*p1,*p3,aver); } 运行结果: 对于这个,主要是设计程序时遇到一些问题,真正运行时几乎没遇到错误,就是用(*a+*b+*c)/3计算平均值时,小数位一直是零,将3变成3.00后小数位正常。 第4题1: #include main() { int a[]={2,4,6,8,10,12}; int (*p)[2]=a; int i,j; printf("按行输出\n"); for(i=0;i<3;i++) { for(j=0;j<2;j++) {printf("%d",p[i][j]); } printf("\n"); } printf("按列输出\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%d",p[j][i]); printf("\n"); } } 运行结果: 这里定义了一个一维数组a[],接下来就将数组a强制转换成二维数组 然后按行输出判断,按列输出判断,就完成了 遇到的问题也是一个很严重的问题,就是把int (*p)[2]=a;写成了int *p[2]=a; 其实int (*p)[2] //这是指向一维数组的指针变量 而int *p[2] //这是指针数组 二者不可混淆 第4题2: #include void hang(int *p[]) { int i; for(i=0;i<6;i++) { printf("%d ",*p[i]); if((i%2)==1) printf("\n"); } } void lie(int *p[]) { int i,j; for(i=0;i<2;i++) { for(j=0+i;j<6;j=j+2) printf("%d ",*p[j]); printf("\n"); } } void main() { int *p[6],i; int a[]={2,4,6,8,10,12}; for(i=0;i<6;i++) p[i]=&a[i]; printf("此3*2矩阵为:\n2 4\n6 8\n10 12\n"); printf("按行输出:\n"); hang(p); printf("按列输出:\n"); lie(p); } 运行结果: 选做题: #include #include #include #include typedef struct book { char num[15]; //中图分类号 char name[20]; //书名 char author[20]; //作者 char press[20]; //出版单位 char time[15]; //出版时间 char status[10]; //是否可借 double price; //价格 int count; //库存量 }book; void menu(); //图书馆系统界面void insert(); //插入图书信息记录void browse(); //浏览图书信息void find(); //查找图书信息void deleter(); //删除图书信息void modify(); //修改图书信息void leave(); //退出图书系统 void main() { int choice; do { menu(); printf("请选择服务项目:"); scanf("%d",&choice); switch(choice) { case 1:insert();break; case 2:browse();break; case 3:find();break; case 4:deleter();break; case 5:modify();break; case 6:leave();break; default:printf("输入数据错误,请从新输入!"); } }while(1); } void menu() { printf("\t====================欢迎进入图书馆系统!=============================\n\n"); printf("\t\t*****************1.录入图书信息********************\n"); printf("\t\t*****************2.浏览图书信息********************\n"); printf("\t\t*****************3.查询图书信息********************\n"); printf("\t\t*****************4.删除图书信息********************\n"); printf("\t\t*****************5.修改图书信息********************\n"); printf("\t\t********************6.退出*************************\n"); } void insert() { FILE *fp; book a={"\0","\0","\0","\0","\0","\0",0.0,0}; if(access("bookinf.txt",0)) //如果文件不存在,则初始化文件格式{ if((fp=fopen("bookinf.txt","w"))==NULL) { printf("file creat failure!"); exit(0); } fprintf(fp,"图书分类号书名作者出版社出版时间状态价格数量"); } else //如果文件存在,则打开文件追加信息 { if((fp=fopen("bookinf.txt","a+"))==NULL) { printf("file open error!"); exit(0); } } printf("请输入图书信息\n"); printf("图书分类书名作者出版社出版时间状态价格数量\n"); scanf("%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price,&a.c ount); printf("%s %s %s %s %s %s %lf %d\n",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a. status,a.price,a.count); fprintf(fp,"\n%-15s%-20s%-20s%-20s%-15s%-10s%-8.2lf%4d",a.num,0d88144eee06eff9aef807c2,a.author,a.pre ss,a.time,a.status,a.price,a.count); //-为左对齐,必须是"\n和+右对齐",方便实现browse()函数fclose(fp); } void browse() { FILE *fp; book a={"\0","\0","\0","\0","\0","\0",0.0,0},b=a; if((fp=fopen("bookinf.txt","a+"))==NULL) { printf("file open error!"); exit(0); } fscanf(fp,"%*[^\n]"); //跳过文本的第一行fscanf(fp,"%*[^\n]%*c");? while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price, &a.count); printf("%-4s%-4s%-4s%-4s%-4s%-4s%-8.2lf%-4d\n",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a .status,a.price,a.count); a=b; } fclose(fp); } void find() { char str[15]="\0"; FILE *fp; int flag=0; book a={"\0","\0","\0","\0","\0","\0",0.0,0},b=a; printf("请输入所要查找图书的图书分类号:"); scanf("%s",str); if((fp=fopen("bookinf.txt","r"))==NULL) { printf("file open error!\n"); exit(0); } fscanf(fp,"%*[^\n]"); //跳过文本的第一行fscanf(fp,"%*[^\n]%*c");? while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price, &a.count); if(!strcmp(a.num,str)) { flag=1; printf("所找图书信息为:"); printf("%-4s%-4s%-4s%-4s%-4s%-4s%-8.2lf%-4d\n",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a .status,a.price,a.count); break; } a=b; //b的用处 } if(flag==0) printf("您所找的图书不存在!\n"); fclose(fp); } void deleter() { char str[15]="\0"; int flag=0; FILE *fp,*fp1; book a={"\0","\0","\0","\0","\0","\0",0.0,0},b=a; printf("请输入所要删除图书的图书分类号:"); scanf("%s",str); if((fp=fopen("bookinf.txt","r"))==NULL) { printf("file open error!"); exit(0); } if((fp1=fopen("f.txt","w"))==NULL) { printf("file open error!"); exit(0); } fprintf(fp1,"图书分类书名作者出版社出版时间状态价格数量"); fscanf(fp,"%*[^\n]"); //跳过文本的第一行fscanf(fp,"%*[^\n]%*c");? while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price, &a.count); if(!strcmp(str,a.num)) { flag=1; continue; } fprintf(fp1,"\n%-15s%-20s%-20s%-20s%-15s%-10s%-8.2lf%4d",a.num,0d88144eee06eff9aef807c2,a.author,a.pr ess,a.time,a.status,a.price,a.count); a=b; } fclose(fp1); fclose(fp); remove("bookinf.txt"); rename("f.txt","bookinf.txt"); if(flag==0) printf("所要删除的图书不存在!\n"); else printf("删除成功!\n"); } void modify() { char str[15]="\0"; FILE *fp,*fp1; char s[120]="\0"; book a={"\0","\0","\0","\0","\0","\0",0.0,0}; printf("请输入所要修改图书的图书分类号:"); scanf("%s",str); if((fp=fopen("bookinf.txt","r+"))==NULL) { printf("file open error!"); exit(0); } if((fp1=fopen("f.txt","w"))==NULL) { printf("file open error!"); exit(0); } fgets(s,120,fp); //读取bookinf.txt第一行的信息,使读取位置移动到第二行 fprintf(fp1,"图书分类书名作者出版社出版时间状态价格b数量");//初始化新文件f.txt while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price, &a.count); if(!strcmp(str,a.num)) //如果遇到所要修改的记录,则从新输入图书信息 { printf("请输入图书信息,即将记录修改为:\n"); printf("图书分类书名作者出版社出版时间状态价格数量\n"); scanf("%s%s%s%s%s%s%lf%d",a.num,0d88144eee06eff9aef807c2,a.author,a.press,a.time,a.status,&a.price,&a.c ount); } fprintf(fp1,"\n%-15s%-20s%-20s%-20s%-15s%-10s%-8.2lf%4d",a.num,0d88144eee06eff9aef807c2,a.author,a.pr ess,a.time,a.status,a.price,a.count); } fclose(fp1); fclose(fp); remove("bookinf.txt"); rename("f.txt","bookinf.txt"); } void leave() { exit(0); } 运行结果:
正在阅读:
C语言程序设计课程报告05-01
MSO5000D系列示波器说明书2012.11.3 - 图文03-03
宅基地管理09-17
初中英语代词的用法05-26
电子商务概论试卷105-16
八年级第二章人教版动物的运动和行为第一节动物的运动08-15
这里也是我的舞台作文500字07-02
小学劳动技术学科教学评价新探06-20
制度管理与人性化管理05-28
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 程序设计
- 语言
- 课程
- 报告
- 二年级下册语文教案-6《千人糕》(第2课时) 人教(部编版)
- 最新人教版四年级数学工作上册 教学工作计划 (2)
- 北京地铁 15 号线一期工程盾构施工组织设计最终版
- 20XX下半年小学一年级期末家长会发言稿【精选】
- 布病有何药物治疗比较好?谢谢
- UTM反垃圾邮件配置手册v1.0
- 译林版牛津初中英语八年级下册第二学期第一次月考试卷及答题卡
- 福建省福州市高三英语上学期第四次质量检查试题
- 2017-2018学年河北省唐山市滦县二中高二上学期期中考试化学(理)试题
- 高三一轮复习:工业地域的形成和发展专题练习(含答案)
- 三级安全教育制度92354
- 化工热力学习题集及答案
- 2016年二级建造师市政实务精品资料集个人学习经验分享+原创笔记+历年真题1
- 宏观经济对保险业的影响
- 企业内部承包合同章程范本(示范合同)
- 2013ESC稳定型冠心病诊疗指南
- 历史遗留含砷铅冶炼废渣污染场地修复工程案例
- 中国城市化进程中若干问题思考
- 2018-2019年初中生物知识点《健康的生活》《了解自己,增进健康》综合测试试卷【10】含答案考点
- 2018-2019年小学英语山西六年级开学考试汇编试卷【1】含答案考点及解析