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和这个语句system("chcp 437")

还有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);

}

运行结果:

本文来源:https://www.bwwdw.com/article/3gze.html

Top