C语言程序设计实践实验题目
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题目:循环结构程序设计
实验目的:
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 "stdio.h"
main()
{int i,j,result;
for (i=1;i<10;i++)
{ for(j=1;j<i;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}
printf("\n");/*每一行后换行*/
}
}
程序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("%5d",m);
}
}
程序4:计算和统计旅客运费程序。
由键盘输入旅客行李重量(w),按公式:
计算运费,要求:
(1)打印每位旅客的顺序号,行李重量,应付运费;
(2)假定每天最多办理100人的行李托运手续或当w≤0时循环结束, 下班时打印出全天的运费总收入和办理的总人数。
方法一(while结构)
#include “stdio.h”
main( )
{
int num=0;
float w,f,total=0;
scanf("%f ",&w);
while (w>0&&num<100 )
{ if (w<=50) f=1.5*w;
else f=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=%d TotalIncome=%10.2f\n",num,total);
}
方法二(do-while结构)
#include “stdio.h”
main( )
{
int num=0;
float w,f,total=0;
do
{ scanf("%f ",&w);
if (w<=0) break;
if (w<=50) f=1.5*w;
else f=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=%d TotalIncome=%10.2f\n",num,total);
}
方法三(for结构)
#include “stdio.h”
main( )
{
int num;
float w,f,total=0;
scanf("%f",&w);
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 ( "%d %6.0f %8.2f\n",num,w,f);
total+=f; scanf("%f",&w);
}
printf ("Customers=%d TotalIncome=%10.2f\n",num,total);
实验二:数组
实验目的:1.更加灵活的使用一维数组和二维数组
2.把数组和指针结合使用
实验内容:
1.约瑟夫环问题
由n个人围成一个首尾相连的圈报数。
从第一个人开始,从1开始报数,报到3的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。
求出所有人的出圈顺序。
#include<stdio.h>
main()
{int a[10];
int n=8,i,k=0,j=1,len;
len=n;
i=0;
//给数组赋值
for(i=0;i<n;i++)
a[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 <stdio.h>
void main()
{
int grade[10][4];
int i,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<stdio.h>
void main()
{ 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<b+5;q++,s++)
*s=*q;
paixu(c);
}
paixu(int c[])
{int i,j,k;
for(j=0;j<12;j++)
for(i=0;i<12-j;i++)
if(c[i]>c[i+1])
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.初步掌握书写程序设计开发文档的能力。
实验内容:
程序一:学生信息管理系统
编写程序,实现学生信息的管理(包括学生信息的建立、增加、删除、修改、查找),要求:小组分工情况
一
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];
二总体设计
框架结构图(系统的功能结构图)
程序流程图: (visio)
三、详细设计
(流程图!!!)
四、程序源代码(参考答案)
1.用结构体数组完成
2.用结构体指针完成
1. #include "stdio.h"
#include "string.h"
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("请输入要录入的人数:");
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);
}
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<n;i++)
if(strcmp(s[i].num,num)==0)break;
for(j=i+1;j<n;j++)
s[j-1]=s[j];
n--;
}
void list(st s[])
{ int i;
printf("学号\t姓名\t系别\t年龄\t性别\n");
for(i=0;i<n;i++)
printf("%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); }
void main()
{
int k,f,age;
char num[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("请选择:");
scanf("%d",&k);
switch(k)
{case 1:s=creslink();break;
case 2: printf("请输入新学生的学号,姓名,系别,年龄,性别:");
scanf("%s%s%s%d%c",num,name,xibie,&age,&sex);
insert(s,num,name,xibie,age,sex);
break;
case 3:printf("请输入要删除的学生的学号:");
scanf("%s",num);
delete(s,num);
break;
case 4:list(s);break;
case 5:f=getlen(s);printf("学生总数为:%d",f);break;
case 6:return;
}
}
}
2.#include "stdio.h"
#include "string.h"
#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("%d",&n);
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名学生的学号,姓名,系别,年龄,性别:",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;
return head;
}
{
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("%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");
}
void main()
{
int k,f,age;
char num[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)
{case 1:head=creslink();break;
case 2: printf("请输入新学生的学号,姓名,系别,年龄,性别:");
scanf("%s%s%s%d%c",num,name,xibie,&age,&sex);
insert(head,num,name,xibie,age,sex);
break;
case 3:printf("请输入要删除的学生的学号:");
scanf("%s",num);
delete(head,num);
break;
case 4:list(head);break;
case 5:f=getlen(head);printf("学生总数为:%d",f);break;
case 6:return;
}
}
}
实验五文件操作
实验目的:
1.初步了解C语言中文件操作的类型;
2.掌握文件的打开、关闭及读写的操作
3.能熟练进行字符及数据块的读写操作,为后续的课程设计打好基础。
实验内容:
程序1:从键盘上输入若干个学生的学号及考试成绩, 将这些数据写入磁盘文件y.dat中。
(由学号等于0作终止标记)
#include "stdio.h"
main()
{ struct student
{ int num;
float score; };
struct student stu;
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 <stdio.h>
main()
{FILE *fp;
int i=0,num=0;
float x , 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;
float x,y,z;
fp1=fopen("cj.txt","r");
fp2=fopen("stud.txt","w");
while(!feof(fp1))
{ fscanf (fp1,"%f,%f,%f",&x,&y,&z);
printf("%f,%f,%f,%f\n",x,y,z,x+y+z); fprintf(fp2,"%f,%f,%f,%f\n",x,y,z,x+y+z); } fclose(fp1); fclose(fp2); }
实验六:万年历
实验目的:
1、复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握;
2、将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力
3、提高学生适应实际,实践编程的能力。
实验内容:
程序一:编写万年历
小组分工情况
一
万年历能实现一些功能,主要包括以下几点:
(1)日历显示功能。
能根据系统日期进行初始化,如果没有任何输入,则显示系统日期所在月份的月历。
判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期:
nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;
w=nDay%7;
其中year:要查询的年份
nday:从该年的一月一日起到该天的天数
w:得出的星期数,w==0表示星期天。
在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。
对于初始输入当前月历,可以通过<time.h>中的time 和localtime函数取出系统时间进行初始化。
time_t timer;
struct tm* gmt;
time(&timer);
gmt=localtime(&timer);
gmt就是一个时间结构体,可以从中取出年月日.
(2)日历查询、闰年判断功能。
输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年
能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。
日期的查询,就是直接打印改天所在月份的月历
(3)参数检查功能。
如果输入日期不合法,查询将被拒绝,并显示提示信息。
判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,
闰年二月份不能超过29天,平年二月份不能超过28天。
在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。
(4)通过键盘操作(如:光标上、下、左、右移动键,pageup、pagedown键)调整年份、月份和日期,并显示调整后的日期及月历。
捕获键盘的输入,通过两个getch();将后一个getch()的返回值付给整型或字符型k,k为相应键的ascii值,判断ascii值,就可以知道时哪个键的输入。
若捕获到某键的输入,则设置相应的年或月或日的值,再进行刷性输出,就可以实现日期的调整。
二总体设计(visio)
本系统包括4个模块,分别是功能控制模块﹑打印输出模块﹑日历显示模块和键值获取模块。
1、功能控制模块。
该模块用于实现日期有效性检查﹑判断是否是闰年和返回指定日期对应的日期。
2、打印输出模块。
该模块主要是进行输出显示,包括打印指定个数的空格﹑打印分隔线﹑打印用户使用手册﹑打印当前日期对应的星期以及打印指定的星期。
3、日历显示模块。
该模块是系统的核心模块,是用来显示指定日期所在月份的月历。
4、键值获取模块。
该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。
图
(1
平年365+1月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=星期三
平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;
(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<month-1;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;
}
(流程图!!!)
四、程序源代码
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<windows.h>
#include<conio.h>
#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%400==0||(year%4==0&&year%100!=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:
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<month-1;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;
}
void printCalender(int year,int month,int day);
void setDay(int year,int month,int day)//调节日期
{ char k;
printf("%c:上一年%c:下一年\n",24,25);
printf("%c:上个月%c:下个月\n",27,26);
printf("PageUp:昨天PageDown:明天\n");
printf("其他:返回主菜单\n");
getch();
k=getch();
switch(k) //通过方向键和PageUp、PageDown键来调整日期
{
case KEYNUMUp: year--;
if(dayExame(year,month,day)==0){year++; printf("%c",7);} //检查日期的合法性,//若错误,保持日期不变,并警告
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
case KEYNUMDown: year++;
if(dayExame(year,month,day)==0){year--;printf("%c",7);}
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
case KEYNUMLeft: month--;
if(dayExame(year,month,day)==0){month++;printf("%c",7);}
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
case KEYNUMRight: month++;
if(dayExame(year,month,day)==0){month--;printf("%c",7);}
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
case KEYNUMPageUp: day--;
if(dayExame(year,month,day)==0){day++;printf("%c",7);}
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
case KEYNUMPageDown: day++;
if(dayExame(year,month,day)==0){day--;printf("%c",7);}
system("cls");printCalender(year,month,day);setDay(year,month,day);break;
default: ;
}
}
void printCalender(int year,int month,int day)//打印月历
{
int i,n; int w; int nowDay=1;
char wday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
printf(" %d年%d月%d日\n",year,month,day);
printf("***********************************\n");
for(i=0;i<7;i++)
printf("%5s",wday[i]);
printf("\n");
w=getwDay(year,month,nowDay);//找到第一天的星期
n=daysOfMonth[runYear(year)][month-1];
switch(w) //放置第一天
{
case 0:printf("%5d",nowDay);break;
case 1:printf("%10d",nowDay);break;
case 2:printf("%15d",nowDay);break;
case 3:printf("%20d",nowDay);break;
case 4:printf("%25d",nowDay);break;
case 5:printf("%30d",nowDay);break;
default:printf("%35d\n",nowDay);
}
nowDay++;
for(i=1;i<n;i++)
{
w=getwDay(year,month,nowDay);
printf("%5d",nowDay);
if(w==6) //如果是星期六则换行打印
puts("\n");
nowDay++;
}
printf("\n***********************************\n\n");
}
void checkCalender()//查询日历
{ int year,month,day;
system("cls");
printf("请输入你要查询的日期(格式为年月日,如2009 11 3):");
scanf("%d%d%d",&year,&month,&day);
while(!dayExame(year,month,day)) //如果日期输入不正确,则重新输入{
printf("%c你输入的日期错误,请重新输入:",7);
scanf("%d%d%d",&year,&month,&day);
}
system("cls");
if(runYear(year))
printf("\n 闰年\n\n");
else printf("\n 平年\n\n");
printCalender(year,month,day);
}
void backMenu()
{
printf("请按任意字符键返回主菜单:");
getch();
system("cls");
}
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("\n 请输入相应数字:");
scanf("%s",menu);
if(strlen(menu)>2)f=1;
}while(f==1);
switch(*menu)
{
case '1':
system("cls"); //清屏
printCalender(year,month,day);
backMenu(); //实现任意键返回主菜单
mainMenu(year,month,day);
break;
case '2':
system("cls");
checkCalender();
backMenu();
mainMenu(year,month,day);
break;
case '3':
system("cls");
printCalender(year,month,day);
setDay(year,month,day);
printf("请按任意字符键返回主菜单:");
getch();
system("cls");
mainMenu(year,month,day);
break;
case '4':
system("cls");
printf("在主菜单中输入相应的数字就可以完成以下功能:\n\n");
printf("* 1、显示今天所在月的月份\n\n");
printf("* 2、输入日期,判断该年是否是闰年,并显示所在月份的月历\n\n");
printf("* 3、用%c %c %c %c PageUp PageDown 进行日期的调整\n\n",24,25,27,26);
printf("* 4、显示功能及操作方法\n\n");
printf("* 5、退出程序\n\n");
backMenu();
mainMenu(year,month,day);
break;
case '5':system("cls");printf("程序已退出!\n");exit(0);
default:printf("%c 输入错误!\n",7);flag=1;
}
}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)提供保存信息的功能。
小组分工情况
软一软二班
表1-3 时间进度安排表
一
设计一个通讯录管理系统具有以下功能:
(1)菜单功能:采用文本菜单界面。
(2)查看功能:可以显示出通讯录里的姓名、电话号码等详细信息。
(3)添加功能:依次输入编号、姓名、年龄、电话号码、电子邮箱后,会提示是否继续添加。
(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改。
(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除。
(6)查询功能:要求能通过输入姓名或者电话号码查询此人的详细信息。
(7)保存功能:输入文件名(带后缀名)后,即可将通讯录信息保存到文件。
需求说明:在主界面菜单下,根据提示,选择功能操作,来实现通讯信息的存储、修改、删除、查看等功能。
通讯录个人信息包括个人的编号、姓名、年龄、电话号码、电子邮箱等,并且要求人名、号码不能重复,录入的个人信息要求用文件形式保存,并可以进行查看、查询、修改、删除等基本操作。
个人信息显示要求有一定的规范的格式。
对个人信息的查询应能够按照号码和姓名两种方式来查找浏览信息。
二总体设计
图2-1 功能模块图
其中,添加通讯录信息模块完成通讯录个人信息的输入功能,输入信息包括个人的编号、姓名、年龄、电话号码、电子邮箱等;修改联系人信息模块完成个人通讯信息的修改功能;删除联系人信息模块完成个人通讯信息的删除功能;查询联系人信息模块完成个人通讯信息的查询,查询时对应有按号码和姓名等多种方式;菜单选择模块是通讯录管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择,并通过调用其他模块实现相应的功能。
三、详细设计
①添加:添加通讯录记录
②显示:显示通讯录记录
③删除:删除通讯录记录
④查询:查询通讯录记录先选择查询方式(以姓名查询方式为例)
⑤修改:修改通讯录记录
四、程序源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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("cls");
printf("\t\t *****通讯录***** \n");
printf("\t\t┌───────┐\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");
printf("\t\t│0. 退出程序│\n");
printf("\t\t└───────┘\n");
printf("\t\t请您选择(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("\t编号:");
scanf("\t%d",&per[n+i].score);
printf("\t姓名:");
scanf("\t%s",per[n+i].name);
printf("\t年龄:");
scanf("\t%s",per[n+i].age);
printf("\t电话号码:");
scanf("\t%s",per[n+i].num);
printf("\t通讯住址:");
scanf("\t%s",per[n+i].adds);
printf("\t电子邮箱:");
scanf("\t%s",per[n+i].email);
gets(x);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}
void Display(Person per[],int n)
{
int i;
printf("----------------------------------------------------------------------\n");
/*格式*/
printf("编号姓名年龄电话号码通讯地址电子邮箱\n");
printf("----------------------------------------------------------------------\n");
for(i=1;i<n+1;i++)
{
printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1] .age,per[i-1].num,per[i-1].adds,per[i-1].email);
if(i>1&&i%10==0)
{
printf("\t-----------------------------------\n");
printf("\t");
system("pause");
printf("\t-----------------------------------\n");
}
}
printf("----------------------------------------------------------------------\n");
system("pause");
}
int Delete_a_record(Person per[],int n)
{
char s[20];
int i=0,j;
printf("\t请输入想删除记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;j++)
{
strcpy(per[j].num,per[j+1].num);
strcpy(per[j].name,per[j+1].name);
strcpy(per[j].age,per[j+1].age);
strcpy(per[j].adds,per[j+1].adds);
strcpy(per[j].email,per[j+1].email);
per[j].score=per[j+1].score;
}
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
void Query_a_record(Person per[],int n)
{
int m;
printf("\t\n请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名│\n");
printf("\t│2------电话│\n");
printf("\t│3------地址│\n");
printf("\t│4------返回│\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=3&&m!=4)
{
printf("输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t电话号码: %s\n",per[i].num);
printf("\t通讯地址: %s\n",per[i].adds);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
if(m==2)
{
char s[20];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人姓名: %s\n",per[i].name);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t通讯地址: %s\n",per[i].adds);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
if(m==3)
{
char s[20];
int i=0;
printf("\t请输入想查询的地址:");
scanf("\t%s",s);
while(strcmp(per[i].adds,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人姓名: %s\n",per[i].name);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t电话号码: %s\n",per[i].num);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
}
void Change(Person per[],int n)
{
char s[20];
int i=0;
printf("\t请输入想修改的记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t编号:");
scanf("\t%d",&per[i].score);
printf("\t姓名:");
scanf("\t%s",per[i].name);
printf("\t年龄:");
scanf("\t%s",per[i].age);
printf("\t电话号码:");
scanf("\t%s",per[i].num);
printf("\t通讯住址:");
scanf("\t%s",per[i].adds);
printf("\t电子邮箱:");
scanf("\t%s",per[i].email);
printf("\t修改成功!");
}
void WritetoText(Person per[],int n)
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/ printf("\t保存到文件\n"); /*输入文件名*/
printf("\t请输入所保存的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\t无法打开文件\n");
system("pause");
return;
}
fprintf(fp,"******************************************通讯录******************************************\n");
fprintf(fp,"编号姓名年龄电话号码通讯地址电子邮箱\n");
fprintf(fp,"------------------------------------------------------------------------------------------\n");
while(i<n)
{
fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,p er[i].age,per[i].num,per[i].adds,per[i].email);
i++;
}
fprintf(fp,"------------------------------------------------------------------------------------------\n");
fprintf(fp,"***************************************共有%d条记录****************************************\n",n);
fclose(fp); /*关闭文件*/
printf("保存成功!\n");
}。