练习题:
注:标有(课堂)字样的为课上练习,其他为课下练习
基础题(50题)
1、(课堂)编写程序,输出“XXX欢迎来到动物园!”(XXX是自己的名字)。
2、(课堂)打印用*组成的字母C
3、交换杯子里的液体。使用不同的整数代表液体,变量代表杯子。
(课堂)方法1:中间变量法
(课堂)方法2:三步异或法
方法3:加和分减法
4、(课堂)使用宏定义PI来定义3.1415926,计算圆的面积。
5、(课堂)租船问题。
写程序计算游客需要付的租船的费用。租船每小时30元。游客输入租船时间,计算出租船费用。租船费用=时间*每小时钱数+押金。
要求押金与每小时钱数使用宏定义。
6、(课堂)求以下数字的原码、反码、补码。(可以使用计算器)
15(10进制)
0xE3A4(16进制)
7、输入一个整数(0~255),输出这个整数代表的ASCII码字符。
8、输入一个字符,判断这个字符是0~9之间的数字,还是大写字母,还是小写字母。若都不是输出错误信息。
9、计算输入时间的下一秒。例如输入12 15 32,输出12:15:33;输入21 59 59,输出22:00:00。若输入非法时间(如输入小时是25、输入分钟/秒是61等情况)则报错。
10、(课堂)练习:从键盘输入5个学生的成绩(整数),要求输出总成绩(整数)和平均成绩(小数)
11、(课堂)读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include <stdio.h>
int main(void)成都
{
double y;
float a = 2.0;
int b =6,c=3;
y = a*b/c-1.5+'A';
printf("%f\n",y);
return 0;
}
12、(课堂)读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include <stdio.h>
int main()
{
int i = 8,j = 10,k = 12;
int m,n,p;
m = ++i;
n = j--;
p = (++m)*(n++)+(--k);
printf("i=%d,j=%d,k=%d\n",i,j,k);
printf("m=%d,n=%d,p=%d\n",m,n,p);
return 0;
}
13、(课堂)设
int a=3,b=4,c=5,d;
分别求出下列表达式的d的值(即判断此表达式真假)
1)d = a+b>c && b==c
2)d = a || b+c && b-c
3)d = !(a>b) && !c || 1
4)d = !(x=a)&&(y=b)&&0(x和y均为int型,求出x和y的值)
5)d = !(a+b)+c-1 && b+c/2
14、(课堂)输入3个整数,从小到大输出
15、(课堂)输入3个正整数作为3条线段的长度,判断这3条线段能否构成三角形。构成三角形的条件是:任意两边之和大于第三边
16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)
17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,0~59为不及格,其他则输出错误信息。要求使用switch实现。
18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
freight = weight * distance * price * (1-discount);
路程与折扣的关系如下:
s<250:无折扣
250<=s<500:2%折扣
500<=s<1000:5%折扣
1000<=s<2000:8%折扣
2000<=s<3000:10%折扣
3000<=s:15%折扣
要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。
19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。
20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。
21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1 + Fn-2 (n>=3)
22、(课堂)输出如下图形:
*
***
*****
*******
*********
……
其中需要输出几行由键盘输入。
23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。列举出所有的购买方案,以及列举出所有花光100元的购买方案
24、(课堂)输出100~200间的所有素数
25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。
26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;计算输入的数中的偶数的个数、总和、平均值。
27、卡拉兹(Callatz)猜想:
对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1?
28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=0;
if(x!=0)
{
if(x>0)
y=1;
else
y=-1;
}
printf("x=%d\ny=%d\n",x,y);
return 0;
}
29、给定一个不多于5位的正整数,要求:
①求出它是几位数
②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
③将数字逆序。例如输入123,则输出321
30、使用公式求π的近似值
π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
直到某一项的绝对值小于10^-6为止。
(提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
若要使用fabs()函数,则应包含头文件math.h
#include<math.h>
而且要在编译时添加-lm,即手动添加数学库libm.o
gcc qiupai.c -o qiupai -lm)
31、读懂以下程序,说明程序的功能
#include<stdio.h>
int main()
{
int m,n,r,m1,m2;
printf("请输入2个正整数:");
scanf("%d%d",&m1,&m2);
m=m1;
n=m2;
do{
r=m%n;
m=n;
n=r;
}while(r!=0);
printf("%d\n",m);
return 0;
}
32、一个数如果恰好等于它的所有的因子之和,则这个数就称为“完数”。例如6的因子有1、2、3,而1+2+3=6,因此6是一个完数。编程找出1000内所有的完数。
33、(课堂)思考这个宏定义错在哪里
#define S (r) PI*r*r//注意S与(r)之间有空格
34、我们在头文件(.h文件)中,经常看到这样的内容
#ifndef __H_INCLUDE__
#define __H_INCLUDE__
//头文件的实际内容
#endif
思考头文件的开头和结尾需要这样书写的原因。
35、(课堂)运行以下程序
int main()
{
char a,b;
a = getchar();
b = getchar();
putchar(a);
putchar(b);
return 0;
}
运行程序,输入x回车y回车,会发现输出的并不是xy,而是
x
思考这是为什么。
36、(课堂)使用数组存储斐波那契数列前40项,并输出
37、(课堂)从键盘输入10个学生的成绩,如果遇到大于100或者小于0的成绩需要提示输入错误重新输入。之后计算10个学生的总成绩和平均成绩
38、(课堂)冒泡排序
从键盘输入10个各不相同的整数,存储在数组中,使用冒泡排序法将数组排序并输出
冒泡排序:是一种简单的排序算法
1)比较相邻的元素和其身后的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。一次循环过后,最后的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
39、(课堂)自定义一个3*4的矩阵,输出矩阵中值最大的元素,并输入其数组下标
40、(课堂)打印杨辉三角型前10行
41、给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
42、(课堂)自定义2个字符数组,不使用系统提供的strcat()函数,实现strcat()函数功能。
43、(课堂)自定义2个字符数组,不使用系统提供的strcpy()函数,实现strcpy()函数功能。
44、(课堂)自定义2个字符数组,不使用系统提供的strcmp()函数,实现strcmp()函数功能。
45、(课堂)自定义1个字符数组,不使用系统提供的strlen()函数,实现strlen()函数功能。
46、输出以下图案。要求每行的字符数与每次偏移几个字符由用户输入。结束条件为最后一行开头与第一行末尾对齐或在其之后
**********
**********
**********
**********
**********
**********
//结束条件:最后一行开头与第一行末尾对齐或在其之后
47、按以下规律加密一段文字。
A->Z a->z
B->Y b->y
C->X c->x
……
Z->A z->a
其中不是字母的部分不加密。
48、规定一句话中以空格作为分词符。输入一句话,求一句话中最长单词的长度。例如:
I love China!
则最长单词是China!,最长单词长度是6
49、读以下程序,猜想程序的运行结果,然后上机验证
#include<stdio.h>
int main()
{
int i;
int lh,rh,le,re,m;
char *lefthand[] = {"╮","o","<","~\\"};
char *righthand[]= {"╭","o",">","/~"};
char *lefteye[] = {"╯","^","-","=",">","@","⊙"};
char *righteye[]= {"╰","^","-","=","<","@","⊙"};
char *mouth[] = {"Д","▽","_","ε","^"};
printf("请选择左手:\n");
for(i=0;i<=3;i++)
{
printf("%d.[%s] ",i+1,lefthand[i]);
}
printf("\n");
scanf("%d",&lh);
lh--;
printf("请选择右手:\n");
printf("推荐:%d.[%s]\n其他:",lh+1,righthand[lh]);
for(i=0;i<=3;i++)
{
if(i==lh)
continue;
printf("%d.[%s] ",i+1,righthand[i]);
}
printf("\n");
scanf("%d",&rh);
rh--;
printf("请选择左眼:\n");
for(i=0;i<=6;i++)
{
printf("%d.[%s] ",i+1,lefteye[i]);
}
printf("\n");
scanf("%d",&le);
le--;
printf("请选择右眼:\n");
printf("推荐:%d.[%s]\n其他:",le+1,righteye[le]);
for(i=0;i<=6;i++)
{
if(i==le)
continue;
printf("%d.[%s] ",i+1,righteye[i]);
}
printf("\n");
scanf("%d",&re);
re--;
printf("请选择嘴:\n");
for(i=0;i<=4;i++)
{
printf("%d.[%s] ",i+1,mouth[i]);
}
printf("\n");
scanf("%d",&m);
m--;
printf("%s(%s%s%s)%s\n",lefthand[lh],lefteye[le],mouth[m],righteye[re],righthand[rh]);
return 0;
}
50、围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。
问:兔子可能藏身于哪(几)个洞中?
提高题:
1、编写程序,随机生成一个1~10内的数,让对方猜3次。如果3次内能猜中则输出“恭喜你”;若3次内猜不中则输出正确答案。
C语言中提供生成随机数的函数rand()
用法:
①所需头文件:
#include<math.h>
#include<time.h>
②生成随机数种子:
srand(time(0));
③生成某范围内的随机数。例如生成1~100内的随机数
int a = rand()%100+1;//将这个数取余100,会得到一个0~99之间的数,将这个数+1即可得到1~100之间的数
2、在上一题基础上,编写一个彩票程序。
彩票程序在后台随机生成1~35内的7个各不相同的数字。用户会输入一组7个数字,中奖规则:
猜中
7个500万
6个100万
5个1万
4个5000
3个500
0,1,2个没中奖
输出是否中奖及奖金。
3、判断一个矩阵中是否存在鞍点,若存在输出鞍点。鞍点是这样一个数字:在该行最大,在该列最小。例如:
1 2 6 4
5 6 7 8
9 10 11 12
则数字6(a[0][2])是鞍点。一个矩阵可能没有鞍点,可能拥有不止一个鞍点。
4、使用1、2、3、4四个数字能组成多少个无重复数字的三位数?输出这些三位数。
5、输入一个日期(年、月、日),计算该日期是这一年的第几天。注意判断闰年。
6、输出9*9乘法口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
……
7、输入2个正整数,求它们的最大公约数和最小公倍数
8、楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编程序计算n阶台阶共有多少种不同的走法
9、协助破案。假设已经查清,有A、B、C、D、E五个犯罪嫌疑人可能参与作案,但是不知道哪(几)个是真正的案犯。不过有证据表明:
⒈如果A参与了作案,则B一定也参与
⒉B和C两人中只有一人参与了作案
⒊C和D要么都参与作案,要么都没有参与
⒋D和E两个人中至少有一人参与了作案
⒌如果E作案,则A和D必定协助作案。
编程找出谁是真正的案犯(可能不止一人)
10、给定一个5位数,判断这个数字是否是回文数。例如12321是回文数,而12345就不是回文数。
11、自定义一个5*5矩阵,将这个矩阵转置。
12、约瑟夫环问题:
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?
13、假设你收到了一行使用凯撒密码加密过的单词但不知道秘钥(偏移字母数),请破译这段密文。
密文:PELCGBTENCUL
提示:凯撒密码加密是一种字母替换加密算法,其加密原则是:将26个字母连接成环,明文的所有字母被后n位的字母替换得到密文。例如当n=3的时候替换规则是:
A--->D
B--->E
C--->F
……
X--->A
Y--->B
Z--->C
明文HELLO----->密文KHOOR
14、棋子移动问题
有2n(n>=4)个棋子排成一行,其中黑棋B有n个,白棋W有n个,并留有两个空格。例如,当n=4时排列如下所示:(W为白棋,B为黑棋,0为空格)
W W W W B B B B 0 0
当n=5时排列如下所示:(W为白棋,B为黑棋,0为空格)
W W W W W B B B B B 0 0
现在需要移动棋子,移动规则如下:
⒈每次必须同时移动相邻的两个棋子
⒉每次移动必须跳过若干棋子
⒊不能随意调换任意两个棋子的位置
目标:将所有的棋子移动为黑白棋相间的形式,中间不能有空格。
例如:当n=4时移动步骤如下:
起始: W W W W B B B B 0 0
第一步:W W W 0 0 B B B W B
第二步:W W W B W B B 0 0 B
第三步:W 0 0 B W B B W W B
第四步:W B W B W B 0 0 W B
第五步:0 0 W B W B W B W B(完成)
编程实现:从键盘输入n(n>=4),求每一步的棋子移动
15、以下是对“快速排序算法”的算法描述,请读懂这段文字,编写出快速排序算法函数QSort。
提示:函数的原型是:void QSort(int A[], int left, int right)
快速排序由C. A. R. Hoare在1962年提出,是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法的文字描述是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j;此时令循环结束。将key值赋值到i(或j)的位置。
6)递归操作数组A[]在key值左的左半部分。
7)递归操作数组A[]在key值右的右半部分。