}
printf("Canceledmaxscore:
%d\nCanceledminscore:
%d\n",max,min);
printf("Averagescore:
%d\n",(sum-max-min)/8);/*输出结果*/
getch();
}
2五个国家名排序
2.1功能说明
输入5个国名并按字母顺序排列后输出。
2.2设计说明
主函数voidmain():
从键盘上输入各个国家的名字数组cs[5],然后用字符串运算符strcpy将数组cs[5]copy到st[20],再比较两数组对应各元素,输出
2.3程序运行截图
2.4源程序代码
#include
#include
voidmain()
{
charst[20],cs[5][20];
inti,j,p;
printf("inputcountry'sname:
\n");
for(i=0;i<5;i++)
gets(cs[i]);
printf("\n");
for(i=0;i<5;i++)
{p=i;strcpy(st,cs[i]);
for(j=i+1;j<5;j++)
if(strcmp(cs[j],st)<0)p=j;
if(p!
=i)
{
strcpy(st,cs[i]);
strcpy(cs[i],cs[p]);
strcpy(cs[p],st);
}
puts(cs[i]);
}
printf("\n");
getch();
}
3谜语博士的难题
3.1功能说明
两面族是荒岛上的一个新民族,他们的特点是说话真一句假一句且真假交替。
如果第一句为真,则第二句是假的;如果第一句为假的,则第二句就是真的,但是第一句是真是假没有规律。
迷语博士遇到三个人,知道他们分别来自三个不同的民族:
诚实族、说谎族和两面族。
三人并肩站在博士前面。
博士问左边的人:
“中间的人是什么族的?
”,左边的人回答:
“诚实族的”。
博士问中间的人:
“你是什么族的?
”,中间的人回答:
“两面族的”。
博士问右边的人:
“中间的人究竟是什么族的?
”,右边的人回答:
“说谎族的”。
判断这三个人都是哪个民族的。
3.2设计说明
变量A=1表示:
左边的人是诚实族的(用C语言表示为A);
变量B=1表示:
中间的人是诚实族的(用C语言表示为B);
变量C=1表示:
右边的人是诚实族的(用C语言表示为C);
变量AA=1表示:
左边的人是两面族的(用C语言表示为AA);
变量BB=1表示:
中间的人是两面族的(用C语言表示为BB);
变量CC=1表示:
右边的人是两面族的(用C语言表示为CC);
则左边的人是说谎族可以表示为:
A!
=1且AA!
=1(不是诚实族和两面族的人)
用C语言表示为:
!
A&&!
AA
中间的人是说谎族可以表示为:
B!
=1且BB!
=1
用C语言表示为:
!
B&&!
BB
右边的人是说谎族可以表示为:
C!
=0且CC!
=1
用C语言表示为:
!
C&&!
CC
根据题目中“三人来自三个民族”的条件,可以列出:
a+aa!
=2&&b+bb!
=2&&c+cc!
=2且a+b+c==1&&aa+bb+cc==1
根据左边人的回答可以推出:
若他们是诚实族,则中间的人也是诚实族;若他不是诚实族,则中间的人也不是诚实族。
以上条件可以表示为:
c&&!
b&&!
bb||(!
c&&!
cc)&&(b||bb)||!
c&&cc
将全部逻辑条件联合在一起,利用穷举的方法求解,凡是使上述条件同时成立的变量取值就是题目的答案。
3.3程序运行截图
3.4源程序代码
#include
intmain()
{
inta,b,c,aa,bb,cc;
for(a=0;a<=1;a++)/*穷举全部情况*/
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(aa=0;aa<=1;aa++)
for(bb=0;bb<=1;bb++)
for(cc=0;cc<=1;cc++)
if(a+aa!
=2&&b+bb!
=2&&c+cc!
=2&&/*判断逻辑条件*/
a+b+c==1&&aa+bb+cc==1&&
(a&&!
aa&&b&&!
bb||!
a&&!
b)&&
!
b&&
(c&&!
b&&!
bb||(!
c&&!
cc)&&(b||bb)||!
c&cc))
{
printf("Themanstandonleftisa%s.\n",
aa?
"double--dealer":
(a?
"honest":
"lier"));
printf("Themanstandonleftisa%s.\n",
bb?
"double--dealer":
(b?
"honest":
"lier"));
printf("Themanstandonleftisa%s.\n",
cc?
"double--dealer":
(c?
"honest":
"lier"));
/*输出最终的推理结果*/
}
getch();
}
4哪个大夫哪天值班
4.1功能说明
医院有A、B、C、D、E、F、G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天。
现在已知:
A大夫比C大夫晚一天值班;
D大夫比E大夫晚二天值班;
B大夫比G大夫早三天值班;
F大夫的值班日在B和C大夫的中间,且是星期四;
确定每天究竟是哪位大夫值班。
4.2设计说明
由题目可推出如下已知条件:
F是星期四值班;
B值班的日期在星期一至星期三,且三天后是G值班;
C值班的日期在星期五至星期六,且一天后是A值班;
E两天后是D值班;E值班的日期只能在星期一至星期三;
在编程时用数组元素的下标1到7表示星期一到星期天,用数组元素的值分别表示A-F七位大夫。
4.3程序运行截图
4.4源程序代码
#include
#include
inta[8];
char*day[]={"","MONDAY","TUESDAY","WED","THUSDAY",
"FRIDAY","SATDAY","SUNDAY"};
main()
{
inti,j,t;
a[4]=6;
for(i=1;i<=3;i++)
{
a[i]=2;
if(!
a[i+3])a[i+3]=7;
else{a[i]=0;continue;}
for(t=1;t<=3;t++)
{
if(!
a[t])a[t]=5;
elsecontinue;
if(!
a[t+2])a[t+2]=4;
else{a[t]=0;continue;}
for(j=5;j<7;j++)
{
if(!
a[j])a[j]=3;
elsecontinue;
if(!
a[j+1])a[j+1]=1;
else{a[j]=0;continue;}
for(i=1;i<=7;i++)
printf("Doctor%disonduty%s.\n",1+a[i]-1,day[i]);
}
}
}
getch();
}
5分辨黑与白
5.1功能说明
有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。
五人对坐,每人都可以看到其它人额头上的纸的颜色。
五人相互观察后,
A说:
“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸。
”
B说:
“我看见其它四人额头上帖的都是黑纸。
”
C说:
“我看见一人额头上帖的是白纸,其它三人额头上帖的是黑纸。
”
D说:
“我看见四人额头上帖的都是白纸。
”
E什么也没说。
现在已知额头上帖黑纸的人说的都是谎话,额头帖白纸的人说的都是实话。
判断五人谁的额头是帖白纸,谁的额头是帖黑纸。
5.2设计说明
假如变量A、B、C、D、E表示每个人额头上所帖纸的颜色,0代表是黑色,1代表是白色。
根据题目中A、B、C、D四人所说的话可以总结出下列关系:
A说:
a&&b+c+d+e==3||!
a&&b+c+d+e!
=3
B说:
b&&a+c+d+e==0||!
b&&a+c+d+e!
=0
C说:
c&&a+b+d+e==1||!
c&&a+b+d+e!
=1
D说:
d&&a+b+c+e==4||!
d&&a+b+c+e!
=4
穷举每个人额头所帖纸的颜色的所有可能的情况,代入上述表达式中进行推理运算,使上述表达式为“真”的情况就是正确的结果。
5.3程序运行截图
5.4源程序代码
#include
intmain()
{
inta,b,c,d,e;
for(a=0;a<=1;a++)/*黑色:
0白色:
1*/
for(b=0;b<=1;b++)/*穷举五个人额头帖纸的全部可能*/
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
if((a&&b+c+d+e==3||!
a&&b+c+d+e!
=3)
&&(b&&a+c+d+e==0||!
b&&a+c+d+e!
=0)
&&(c&&a+b+d+e==1||!
c&&a+b+d+e!
=1)
&&(d&&a+b+c+e==4||!
d&&a+b+c+e!
=4))
{
printf("Aispastedapieceof%spaperonhisforehead.\n",
a?
"white":
"black");
printf("Bispastedapieceof%spaperonhisforehead.\n",
b?
"white":
"black");
printf("Cispastedapieceof%spaperonhisforehead.\n",
c?
"white":
"black");
printf("Dispastedapieceof%spaperonhisforehead.\n",
d?
"white":
"black");
printf("Eispastedapieceof%spaperonhisforehead.\n",
e?
"white":
"black");
}
getch();
}
6学生成绩查询系统
6.1功能说明
查询修改统计成绩。
6.2设计说明
子函数:
intSelectMainMenu()显示并选择主菜单。
返回:
被选择的菜单项
voidShow()成绩查询模块
voidModify()成绩修改模块
voidStat()成绩统计模块
voidStatAve(float*AveWuLi,float*AveShuXue,float*AveYingYu,float*AveKuaiJi)统计平均分
intFindStudent(intnum)根据学号查找某一学生
voidSetAllTotle()计算所有学生总分
voidSetTotle(intNo)计算第No个学生总分
voidShowAllStudent()显示所有成绩
voidShowTitle()显示表头信息
voidShowStudent(intNo)显示第No个的学生信息
主函数voidmain():
运用switch语句,调用各个子函数完成学生成绩的管理
6.3程序运行截图
6.4源程序代码
#include
structstudent/*成绩表的结构声明*/
{
intnum;
charname[15];
charsex;
floatWuLi;
floatShuXue;
floatYingYu;
floatKuaiJi;
floattotle;
};
/*定义6个学生的信息:
*/
#defineSTU_NUMBER6/*宏定义学生数为6*/
structstudentStu[STU_NUMBER]={{101,"yuchen",'F',98,85,96,89,0},
{102,"xiaotong",'F',99,91,90,93,0},
{103,"likanglong",'M',76,83,74,82,0},
{104,"yinger",'F',88,76,89,77,0},
{105,"fengjiao",'F',97,100,94,96,0},
{106,"sunyao",'M',87,89,66,84,0}};
intSelectMainMenu();/*显示并选择主菜单。
返回:
被选择的菜单项*/
/*所有的函数声明:
*/
voidShow();/*成绩查询模块*/
voidModify();/*成绩修改模块*/
voidStat();/*成绩统计模块*/
voidStatAve(float*AveWuLi,float*AveShuXue,float*AveYingYu,float*AveKuaiJi);/*统计平均分*/
intFindStudent(intnum);/*根据学号查找某一学生*/
voidSetAllTotle();/*计算所有学生总分*/
voidSetTotle(intNo);/*计算第No个学生总分*/
voidShowAllStudent();/*显示所有成绩*/
voidShowTitle();/*显示表头信息*/
voidShowStudent(intNo);/*显示第No个的学生信息*/
voidmain()
{
intisend=0,password=0;/*程序结束标志量,0表示不结束,1表示结束*/
SetAllTotle();/*计算所有学生总分*/
while(password!
=666)
{printf("qingshurumima:
\n");
scanf("%d",&password);
}
while
(1)
{
switch(SelectMainMenu())/*显示并选择主菜单*/
{
case1:
/*成绩查询*/
Show();/*调用成绩查询函数*/
break;
case2:
/*成绩修改*/
Modify();/*调用成绩修改函数*/
break;
case3:
/*成绩统计*/
Stat();/*调用成绩统计函数*/
break;
case4:
/*退出系统*/
printf("\nxiexienindeshiyong,zaijian!
\n\n");
isend=1;/*设置程序结束标志*/
break;
}
if(isend)break;/*程序结束*/
}
}
intSelectMainMenu()/*显示并选择主菜单。
返回:
被选择的菜单项*/
{
intmenu_no=0;
do/*显示并选择菜单*/
{
printf("=================================\n");
printf("\n");
printf("zuozhe:
liyiman\n");
printf("=================================\n");
printf("zhucaidan:
\n");
printf("1-chengjichaxun\n");
printf("2-chengjixiugai\n");
printf("3-chengjitongji\n");
printf("4-tuichuxitong\n");
printf("qingxuanze(1-4):
");
scanf("%d",&menu_no);
}while(menu_no<1&&menu_no>4);/*直到选择出正确的序号*/
returnmenu_no;
}
voidShow()/*成绩查询模块*/
{
intn,i;
while
(1)
{
printf("\n====chengjichaxun====\n");
printf("qingshuruxuehao(shuru0tuichuchengjichaxun,shuru1chaxunquanbu):
");
scanf("%d",&n);
if(n==0)break;/*退出成绩查询模块*/
if(n==1)ShowAllStudent();/*显示所有成绩*/
elseif((i=FindStudent(n))>=0)/*找到学号为n的学生*/
{
ShowTitle();/*显示表头信息*/
ShowStudent(i);/*显示该学生信息*/
}
elseprintf("----zhaobudaogaixuehao----\n");
}
}
voidModify()/*成绩修改模块*/
{
intn,i,a;
while
(1)
{
printf("\n====chengjixiugai====\n");
printf("qingshuruxuehao(shuru0tuichuchengjixiugai):
");
scanf("%d",&n);
if(n==0)break;/*退出成绩修改模块*/
if((i=FindStudent(n