山科大 C语言程序设计编程精选44例

时间:2019-05-15 01:00:10下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《山科大 C语言程序设计编程精选44例》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《山科大 C语言程序设计编程精选44例》。

第一篇:山科大 C语言程序设计编程精选44例

问题 1: 三个数比较大小

题目描述

从键盘上输入0~100之间的三个数,按从小到大的顺序输出。

输入

输入只有一行,为三个整数。

输出

按从小到大输出这三个数。

样例输入 10 20 样例输出 15 20 提示

用if语句判断各种情况可以解决这个问题。

解答:

#include int main(){

int a,b,c;

scanf(“%d%d%d”,&a,&b,&c);

if(a>=b)

{

if(b>=c)

printf(“%d %d %d”,c,b,a);

else

{

if(a>=c)

printf(“%d %d %d”,b,c,a);

else

printf(“%d %d %d”,b,a,c);

}

}

else

{

if(b

printf(“%d %d %d”,a,b,c);

else

{

if(a

printf(“%d %d %d”,a,c,b);

else

printf(“%d %d %d”,c,a,b);

}

} } 问题 2: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数

题目描述

输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n

输入

输入三个整数,依次为k、m、n。

输出

从小到大输出符合题意的所有整数,两数之间用一个空格分开。

样例输入 2 3 样例输出 3 4 8 9 10 14 15 提示 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。

解答:

#include int main(){ int k,m,n,i,a;scanf(“%d%d%d”,&k,&m,&n);if(m>=n)

a=n;else

a=m;printf(“%d”,a);for(i=a+1;i<=k;i++)

if(i%m==0||i%n==0)

{

if(i%m==0&&i%n==0)

printf(“");

else

printf(” %d“,i);

} }

问题 3: A+B Problem 题目描述

计算a+b,0<=a,b<1000。

输入

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

输出

每行输出一个a+b的值,顺序与输入对应。

样例输入 2 10 20 样例输出 3 30 提示

OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。

解答:

#include int main(){ int a,b;for(;scanf(”%d%d“,&a,&b)!=EOF;)

printf(”%dn“,a+b);} 问题 4: A+B Problem(II): Input/Output Pratice 题目描述

计算a+b,0<=a,b<1000。

输入

输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。

输出

每行输出一个a+b的和,顺序与输入对应。

样例输入 1 2 10 20 样例输出 3 30 提示

N给出了测试样例数,用for循环处理方便。

解答:

#include int main(){ int n,a,b,i;scanf(”%d“,&n);for(i=1;i<=n;i++){

scanf(”%d%d“,&a,&b);

printf(”%dn“,a+b);} } 问题 5: A+B Problem(III): Input/Output Pratice 题目描述

计算a+b,0<=a,b<1000。

输入

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。

输出

每行输出一个a+b的值,顺序与输入对应。

样例输入 2 10 20 0 0 样例输出 30 提示

练习break的使用。

解答:

#include int main(){ int a,b;for(;scanf(”%d%d“,&a,&b);){

if(a==0&&b==0)

break;

printf(”%dn“,a+b);} } 问题 6: A+B Problem(IV): Input/Output Pratice 题目描述

计算a+b,0<=a,b<1000。

输入

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

输出

每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。

样例输入 2 10 20 15 35 样例输出 30 50 提示

由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。

解答:

#include int main(){ int i,a,b;i=1;scanf(”%d%d“,&a,&b);printf(”%dn“,a+b);i++;for(;scanf(”%d%d“,&a,&b)!=-1;)

printf(”n%dn“,a+b);} 问题 7: n个数的最大值和最小值

问题描述

找出n个数中最大的数和最小的数,并将它们的值输出出来。

输入

输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。输出

输出为两行,格式见sample。

样例输入 0 1-1 样例输出

The maximum number is 1.The minimum number is-1.提示

分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。

解答:

#include int main(){ int a,n,i,min,max;scanf(”%d“,&n);scanf(”%d“,&a);min=a;max=a;for(i=1;i

scanf(”%d“,&a);

if(a>max)

max=a;

if(a

min=a;} printf(”The maximum number is %d.n“,max);printf(”The minimum number is %d.“,min);}

问题 8: 成绩的等级

题目描述 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。

输入

输入多行,每行一个整数。

输出

输入所对应的成绩等级。

样例输入

-1 81 92 35 68 72 100 样例输出

Error Good Excellent Failing Pass Average Excellent 提示

用switch语句解决这个问题比较方便。

解答:

#include int main(){ int a;for(;scanf(”%d“,&a)!=-1;)

if(a<0||a>100)

printf(”Errorn“);

else

{

switch(a/10)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:printf(”Failingn“);break;

case 6:printf(”Passn“);break;

case 7:printf(”Averagen“);break;

case 8:printf(”Goodn“);break;

case 9:

case 10:printf(”Excellentn“);break;

}

} } 问题 9: 只有一个二元运算符的表达式运算 题目描述

编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。

输入

每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。输入以a和b为0,且用一个空格分开结束。输出

每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。

样例输入

33+5 8*9 2.2 1-6 17/3 9%3 0 0 样例输出

invalid op-5 5 0 提示

教材上有非常相似的例题可以参考。#include #include void main(){ int i,a,b;char c;for(i=0;i<=100;i++){for(;scanf(”%d%c%d“,&a,&c,&b)!=EOF;)

if(a==0&&c==' '&&b==0)

goto loop;

else

switch(c){ case'+':

printf(”%dn“,a+b);

break;case'-':

printf(”%dn“,a-b);

break;case'*':

printf(”%dn“,a*b);

break;case'/':

printf(”%dn“,a/b);

break;case'%':

printf(”%dn“,a%b);

break;default:

printf(”invalid opn“);

} } loop: i=101;} 问题 10: 求100以内的素数

题目描述

素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。

输入

输入为两个整数m和n,满足0<=m<=n<=100。

输出

从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。

输出的所有数在两行“=====”之间。

样例输入 12 样例输出

===== 11 7 5 3 2 ===== 提示

利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。

解答:

#include int main(){ int a,b,i,q,j;scanf(”%d%d“,&a,&b);printf(”=====n“);for(j=b;j>=a;j--){

q=0;

for(i=2;i

{

if(j%i!=0)

q++;

}

if(q==j-2)

printf(”%dn“,j);} printf(”=====“);} 问题 11: 摄氏——华氏温度转换表

题目描述

已知华氏温度F,转换为摄氏温度C的公式为C=(F-32)*5/9。

输出给定范围(从low到high)和步长(step)的摄氏——华氏温度转换表

输入

第1行若为“C->F”表示输出:摄氏——华氏温度转换表,若为“F->C”表示输出:华氏——摄氏温度转换表。

第2、3行为两个整数:high和low,其值在-100到200之间。第4行为step,step精确到小数点后1位。

输出

输出第一行为C和F,分别表示摄氏和华氏,与小数点对齐。若输出摄氏——华氏温度转换表,则C在前、F在后;反之,则输出华氏——摄氏温度转换表。

从输出的第2行开始为从温度low到温度high(包括low和high)的转换表,温度输出精确到小数点后1位,表格被“->”分为两个宽度相同的部分,其它的测试样例也不会给出超出宽度的数据,格式详见sample。

样例输入

C->F-10 40 2.5 样例输出

C-> F-10.0-> 14.0-7.5-> 18.5-5.0-> 23.0-2.5-> 27.5 0.0-> 32.0 2.5-> 36.5 5.0-> 41.0 7.5-> 45.5 10.0-> 50.0 12.5-> 54.5 15.0-> 59.0 17.5-> 63.5 20.0-> 68.0 22.5-> 72.5 25.0-> 77.0 27.5-> 81.5 30.0-> 86.0 32.5-> 90.5 35.0-> 95.0 37.5-> 99.5 40.0-> 104.0 提示

输出格式可以通过sample分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是step是浮点数,某些浮点数是无法精确存储的,因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。

解答:

#include int main(){

double low,high;

double step,c,f;

char ch1,ch2;

scanf(”%c->%c“,&ch1,&ch2);

if(ch1=='C'&&ch2=='F')

{

scanf(”%lf%lf%lf“,&low,&high,&step);

f=(double)9/5*low+32;

if(low==-100||f<=-100)

{

printf(”

C->

F“);

while(low<=high+0.01)

{

f=low*9.0/5.0+32;

printf(”n%6.1lf-> %6.1lf“,low,f);

low+=step;

}

return 0;

}

printf(”

C->

F“);

while(low<=high+0.01)

{

f=low*9.0/5.0+32;

printf(”n%5.1lf-> %5.1lf“,low,f);

low+=step;

}

return 0;

}

else if(ch1=='F'&&ch2=='C')

{

scanf(”%lf%lf%lf“,&low,&high,&step);

c=(low-32)*((double)5/9);

if(low==-100||c<=-100)

{

printf(”

F->

C“);

while(low<=high+0.01)

{

c=(low-32)*5/9.0;

printf(”n%6.1lf-> %6.1lf“,low,c);

low+=step;

}

return 0;

}

printf(”

F->

C“);

while(low<=high+0.01)

{

c=(low-32)*5/9.0;

printf(”n%5.1lf-> %5.1lf“,low,c);

low+=step;

}

return 0;

} } 问题 12: 1!+2!+…+k!=?

题目描述

求1!+2!+…+k!=?,并判断是否溢出。

输入

输入为一个正整数k。

输出

若1!+2!+…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。

样例输入 样例输出

153 提示

如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?

解答: #include int main(){

int i,j;

unsigned int s,b,a;s=0;

scanf(”%d“,&j);

b=1;

for(i=1;i<=j;i++)

{

a=b;

b=b*i;

if((double)b/a

{ printf(”overflown“);

return 0;

}

s=s+b;

}

printf(”%un“,s);

return 0;} 问题 13: 输出整数的最低两位

题目描述

把一个整数的最低两位打印出来,不输出整数的符号。

输入

输入为一个整数n,不会超出int类型的数据范围。

输出

输出n的最低两位数字。但是,输入的数字本身不足两位时,不应当补0。如,输入为“1”,则输出为“1”。

样例输入

-102 样例输出

02 提示

printf函数可以完成补0的操作。

解答:

#include int main(){ int a,b,c;scanf(”%d“,&a);if(a<0){

c=-a;

if(c<100)

printf(”%d“,c);

else

{

b=c-100*(c/100);

printf(”%.2d“,b);

} } else {

if(a<100)

printf(”%d“,a);

else

{

b=a-100*(a/100);

printf(”%.2d“,b);

} } } 问题 14: 产生等差序列之一

题目描述

根据给出的初始数、公差和序列长度求等差序列。

输入

输入为一行,格式见sample。其中,start为初始数,step为公差,times为序列长度。满足,times>0,step不为0。

输出 把这个等差序列输出在一行里,序列两数之间用一个空格分隔。

样例输入

start = 1, step = 2, times = 100 样例输出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 解答:

#include int main(){ int st,s,t,i;scanf(”start = %d, step = %d, times = %d“,&st,&s,&t);printf(”%d“,st);for(i=1;i

st=st+s;

printf(” %d“,st);

} } 问题 15: 产生等差序列之二

题目描述

根据给出的初始数、公差和终止条件求等差序列。

输入

输入为一行,格式见sample。其中,start为初始数,step为公差,end为终止条件。满足,step不为0,并且start和end的大小关系与step的方向一致。end不一定是序列的最后一个数。

输出 把这个等差序列输出在一行里,序列两数之间用一个空格分隔。

样例输入

start = 1, step = 2, end = 200 样例输出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 提示

根据start和step的大小关系,判断序列终止的条件可能不同。

解答:

#include int main(){ int st,s,end;scanf(”start = %d, step = %d, end = %d“,&st,&s,&end);printf(”%d“,st);if(s>0){

for(st=st+s;st<=end;st=st+s)

printf(” %d“,st);

} else {

for(st=st+s;st>=end;st=st+s)

printf(” %d“,st);} }

问题 16: 辗转相除法

题目描述

辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147:

1071 = 2 × 462 + 147.然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21:

462 = 3 × 147 + 21.再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数:

= 7 × 21 + 0.此时,余数是0,所以1071和462的最大公约数是21。

输入

输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。

输出

每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。

样例输入 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36 样例输出 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72 提示

按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。

解答:

#include int main(){ int a,b,i,c;for(;scanf(”%d%d“,&a,&b)!=-1;){

c=a*b;

if(a==0&&b!=0)

printf(”%d %dn“,b,a);

else if(a!=0&&b==0)

printf(”%d %dn“,a,b);

else

{

while(a!=b)

{

if(a>b)

a=a-b;

if(a

b=b-a;

}

printf(”%d %dn“,a,c/a);

} } }

问题 17: Sum Problem 题目描述

计算若干整数的和,这些整数都是小于1000的非负整数。

输入 输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。

输出

每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。

样例输入 1 2 3 5 10 15 20 30 50 样例输出 125 提示

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

解答:

#include int main(){ int n,a,i,s;for(;scanf(”%d“,&n)!=-1;){

s=0;

for(i=1;i<=n;i++)

{

scanf(”%d“,&a);

s=s+a;

}

printf(”%dn“,s);} } 问题 18: Sum Problem(II): Input/Output Pratice 题目描述 计算若干整数的和,这些整数都是小于1000的非负整数。

输入

输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。

输出

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。

样例输入 3 1 2 3 5 10 15 20 30 50 样例输出 125 提示

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

解答:

#include int main(){ int m,n,a,i,j,s;scanf(”%d“,&m);for(j=1;j<=m;j++){

scanf(”%d“,&n);{

s=0;

for(i=1;i<=n;i++)

{

scanf(”%d“,&a);

s=s+a;

}

} } } printf(”%dn“,s);问题 19: Sum Problem(III): Input/Output

Pratice 题目描述

计算若干整数的和,这些整数都是小于1000的非负整数。

输入

输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。

输出

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。

样例输入 1 2 3 5 10 15 20 30 50 0 样例输出 125 提示

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

解答:

#include int main(){ int n,a,i,s;for(;scanf(”%d“,&n);)

{

if(n==0)

break;

else

{

s=0;

for(i=1;i<=n;i++)

{

scanf(”%d“,&a);

s=s+a;

}

printf(”%dn“,s);

} } } 问题 20: Sum Problem(IV): Input/Output Pratice 题目描述

计算若干整数的和,这些整数都是小于1000的非负整数。

输入

输入的第一行是一个整数M,后面有M个测试用例。每个测试用例以一个整数N开始,后面接着是N个整数。

输出

每组测试用例对应一行输出,为所给的N个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。

样例输入 3 1 2 3 5 10 15 20 30 50 样例输出 6 125 提示

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

解答:

#include int main(){ int m,n,a,i,j,s;scanf(”%d“,&m);

scanf(”%d“,&n);{

s=0;

for(i=1;i<=n;i++)

{

scanf(”%d“,&a);

s=s+a;

}

printf(”%dn“,s);} for(j=2;j<=m;j++){

scanf(”%d“,&n);{

s=0;

for(i=1;i<=n;i++)

{

scanf(”%d“,&a);

s=s+a;

}

printf(”n%dn“,s);} } }

问题 21: 序数的后缀

题目描述

英文中经常用阿拉伯数字加上字母后缀表示“第几“这样的序数词。比如,”第10次会面“通常写成”10th meeting“。

后缀来源于英文的序数词:第1的英文是first,写成”1st‘;第2的英文是second,写成“2nd”;第3的英文是third,写成“3rd”,第4是fourth,写成“4th”,以后的数字都加“th”。在这里规定,所有后缀为1的数字都写成“st”结尾,后缀为2的数字写成“nd”结尾,后缀为3的英文写成“rd”结尾,其他的写成“th”结尾。

输入

输入为多个很小的正整数,当输入为0时表示输入结束。

输出

输出为多行,每行对应一个输入数字的序数表示。

样例输入 2 3 4 5 10 11 12 13 14 0

样例输出

1st 2nd 3rd 4th 5th 10th 11st 12nd 13rd 14th

提示

用if语句似乎更容易些。

解答:

#include int main(){ int a;for(;scanf(”%d“,&a);){

if(a==0)

break;

else

{

if(a%10==1)

printf(”%dstn“,a);

if(a%10==2)

printf(”%dndn“,a);

if(a%10==3)

printf(”%drdn“,a);

}

}

} if(a%10==4||a%10==5||a%10==6||a%10==7||a%10==8||a%10==9||a%10==0)printf(”%dthn“,a);问题 22: Sequence Problem : Array Pratice 题目描述

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。

输入

输入为多行,直到文件末尾结束。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。

输出

对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。

样例输入 1 2 3 5 10 15 20 30 50 4 100 200 300 400 样例输出 11 17 23 30 50 100 200 300 400 提示

这里最少要用到一个数组来存数整数序列或整数序列的和。

解答:

#include int main(){ int a[1000]={0},b[1000]={0};int m,i,j=0,p,k;while(scanf(”%d“,&m)!=EOF){

j++;

if(j%2!=0)

{

for(i=0;i

scanf(”%d“,&a[i]);

}

else

{

for(p=0;p

scanf(”%d“,&b[p]);

}

if(j%2!=1)

{

if(i<=p)

{

for(k=0;k

{

if(k==0)

{

printf(”%d“,a[k]+b[k]);

a[k]=0;

b[k]=0;

}

else

{

printf(” %d“,a[k]+b[k]);

a[k]=0;

b[k]=0;

}

}

printf(”n“);

}

else

{

for(k=0;k

{

if(k==0)

{

printf(”%d“,a[k]+b[k]);

a[k]=0;

b[k]=0;

}

else

{

printf(” %d“,a[k]+b[k]);

a[k]=0;

b[k]=0;

}

}

printf(”n“);

}

} } if(m!=0&&j%2==1)

{

for(i=0;i

{

if(i==0)

printf(”%d“,a[i]);

else

printf(” %d“,a[i]);

}

printf(”n“);

}

if(m==0&&j%2==1)

printf(”n“);} 问题 23: Sequence Problem(II): Array Pratice 题目描述

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。

输入 输入的第一行为一个整数M(M>0),后面有M行输入。每行输入为不超过1000个整数的整数序列,每个整数序列的输入均以0结束。

输出

对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。

样例输入 1 2 3 0 10 15 20 30 50 0 100 200 300 400 0 样例输出 17 23 30 50 100 200 300 400 提示

这里最少要用到一个数组来存数整数序列或整数序列的和。一个省事的做法是把数组定义的稍微大一点,因为有时你的程序可能会边界处理的不是太好。

解答:

#include int main(){

int i,j,x,y,q;y=0;

scanf(”%d“,&x);

if(x%2==0)

{

for(q=0;q

{

int a[2000]={0},b[2000]={0},c[2000]={0};

for(j=0;scanf(”%d“,&a[j]);j++)

{

if(a[j]==0)

break;

}

for(i=0;scanf(”%d“,&b[i]);i++)

{

if(b[i]==0)

break;

}

if(i>j)

j=i;

i=0;

while(i

{

if(i==0)

printf(”%d“,a[0]+b[0]);

else

printf(” %d“,a[i]+b[i]);

i++;

}

printf(”n“);

} } else { for(q=0;q<(x+1)/2;q++)

{

int a[2000]={0},b[2000]={0},c[2000]={0};

j=0;

y=y+2;

if(x+2-y>1)

{

for(j;scanf(”%d“,&a[j]);j++)

{

if(a[j]==0)

break;

}

for(i=0;scanf(”%d“,&b[i]);i++)

{

if(b[i]==0)

break;

}

if(i>j)

j=i;

i=0;

while(i

{

if(i==0)

printf(”%d“,a[0]+b[0]);

else

printf(” %d“,a[i]+b[i]);

i++;

}

printf(”n“);

}

}

}

} else { for(j=0;scanf(”%d“,&a[j]);j++){ if(a[j]==0)

break;} i=0;while(i

printf(”%d“,a[0]);else

printf(” %d“,a[i]);i++;}

printf(”n“);}

问题 24: Sequence Problem(III): Array Pratice 题目描述

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。

输入

输入的第一行为一个整数M(M>0),后面有M行输入。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。

输出

对输入的整数序列两两相加:第1行和第2行相加、第2行和第3行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若最后序列不足两个,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。样例输入 3 1 2 3 5 10 15 20 30 50 4 100 200 300 400 样例输出 17 23 30 50 110 215 320 430 50 100 200 300 400 提示

这里最少要用到两个数组来存储整数序列。

解答:

#include int main(){ int i,j,y,p,q,x,a[1001]={0},b[1001]={0};scanf(”%d“,&q);for(i=1;i<=q;i++){

if(i%2!=0)

{

scanf(”%d“,&y);

for(j=0;j

scanf(”%d“,&a[j]);

if(i!=1)

{

if(y>p)

x=y;

else

x=p;

if(x==0)

printf(”n“);

else

{

j=0;

while(j

{

if(j==0)

printf(”%d“,a[j]+b[j]);

else

printf(” %d“,a[j]+b[j]);

b[j]=0;

j++;

}

printf(”n“);

}

}

if(q==1&&q!=1)

{

if(y==0)

printf(”n“);

else

{

for(j=0;j

{

if(j==0)

printf(”%d“,a[j]);

else

printf(” %d“,a[j]);

}

}

}

if(i==q)

{

for(j=0;j

{

if(j==0)

printf(”%d“,a[j]);

else

printf(” %d“,a[j]);

}

printf(”n“);

}

}

else

{

scanf(”%d“,&p);

for(j=0;j

scanf(”%d“,&b[j]);

if(y>p)

x=y;

else

x=p;

if(x==0)

printf(”n“);

else

{

j=0;

while(j

{

if(j==0)

printf(”%d“,a[j]+b[j]);

else

printf(” %d“,a[j]+b[j]);

a[j]=0;

j++;

}

printf(”n“);

}

} } if(i==q){

j=0;

while(j

{

if(j==0)

printf(”%d“,b[j]);

else

printf(” %d“,b[j]);

j++;

}

printf(”n“);} } 问题 25: Matrix Problem : Array Pratice 题目描述

求一个m×n阶矩阵A的转置矩阵AT。矩阵A的每个元素都在int类型的范围之内。

输入

输入的第一行为一个整数M(M>0),后面有M组输入数据。每组数据以两个正整数m和n开始,满足0

输出

输出为多组,每组输出A的转置矩阵AT。矩阵的输出为:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。每两组输出之间用一个空行分隔开。

样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 6 9 提示

二维数组存储矩阵。

解答:

#include int main(){ int M,m,n,i,j,k;int a[100][100];scanf(”%d“,&M);

scanf(”%d%d“,&m,&n);for(i=0;i

for(j=0;j

scanf(”%d“,&a[i][j]);for(i=0;i

for(j=0;j

printf(”%d “,a[j][i]);

printf(”%d“,a[m-1][i]);

printf(”n“);} for(k=1;k

scanf(”%d%d“,&m,&n);

for(i=0;i

for(j=0;j

scanf(”%d“,&a[i][j]);

printf(”n“);

for(i=0;i

{

for(j=0;j

printf(”%d “,a[j][i]);

printf(”%d“,a[m-1][i]);

printf(”n“);

} } } 问题 26: Matrix Problem(II): Array Pratice 题目描述

求两个矩阵A、B的和。根据矩阵加法的定义,只有同阶的矩阵才能相加。可以确保所有运算结果都在int类型的范围之内。

输入

输入数据为多个矩阵,每个矩阵以两个正整数m和n开始,满足0

输出

对输入的矩阵两两相加:第1个和第2个相加、第3个和第4个相加……按顺序输出矩阵相加的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。

若输入的矩阵不为偶数个,最后剩余的矩阵不产生任何输出。

不满足矩阵加法定义的数据输出“Not satisfied the definition of matrix addition!” 每两组输出之间用一个空行分隔开。

样例输入 3 1 2 3 4 5 6 7 8 9 3 3 9 8 7 6 5 4 3 2 1 3 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 样例输出 10 10 10 10 10 10 10 10

Not satisfied the definition of matrix addition!提示

矩阵的加法就是对应位置上的元素相加。

解答:

#include int main(){ int m,n,e,f,i,j,k,x=1,y=1;

for(i=0;;i++)

{

int a[200][200]={0},b[200][200]={0};

scanf(”%d%d“,&m,&n);

if(m==0&&n==0)

break;

else

{

for(j=0;j

for(k=0;k

scanf(”%d“,&a[j][k]);

}

for(;scanf(”%d%d“,&e,&f)!=EOF;)

{

x=2;

y=y+1;

for(j=0;j

for(k=0;k

scanf(”%d“,&b[j][k]);

break;

}

if(e==0&&f==0)

break;

if(y!=2)

printf(”n“);

}

} if(x==2){ if(m!=e||n!=f){

printf(”Not satisfied the definition of matrix addition!“);

printf(”n“);} else { j=0;while(j

k=0;

while(k

{

if(k==0)

printf(”%d“,a[j][k]+b[j][k]);

else

printf(” %d“,a[j][k]+b[j][k]);

k++;

}

if(j

printf(”n“);

j++;} printf(”n“);} }

问题 27: Matrix Problem(III): Array Pratice 题目描述

求两个矩阵A、B的乘积C=AB。根据矩阵乘法的定义,只有A的列数和B的行数相同才能相乘。可以确保所有运算结果都在int类型的范围之内。

输入

输入数据为多个矩阵(最少2个),每个矩阵以两个正整数m和n开始,满足0

输出

对输入的矩阵两两相乘:第1个和第2个相乘、第1个和第2个相乘的结果和第3个相乘……按顺序输出矩阵相乘的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。

若前k个矩阵相乘的结果和第k+1个矩阵无法相乘(即不满足矩阵乘法定义),则输出“Not satisfied the definition of matrix multiplication!”。然后用第k+1个矩阵去和第k+2个矩阵相乘。最后一个矩阵只做乘数。

每两组输出之间用一个空行分隔开。

样例输入 3 1 1 1 1 1 1 3 3 1 2 3 4 5 6 7 8 9 3 1 0 0 0 0 0 样例输出 15 18 12 15 18 0 0 提示

矩阵的乘法就是一行乘以一列加起来做一个元素。

解答:

#include int main(){

int m,n,i,j,p,k,c,d,o,q;

int a[100][100]={0},b[100][100]={0},e[100][100]={0};

for(k=1;;k++)

{

if(k==1&&k%2==1)

{

scanf(”%d“,&m);

scanf(”%d“,&n);

}

else if(k%2==0)

{

scanf(”%d“,&m);

scanf(”%d“,&n);

}

if(m==0&&n==0)

return 0;

else

{

if(k==1)

{

i=0;

while(i

{

j=0;

while(j

{

scanf(”%d“,&a[i][j]);

j++;

}

i++;

}

}

else if((k>1)&&(k%2!=0))

{

for(i=0;i

for(j=0;j

a[i][j]=e[i][j];

}

else

{

for(p=0;p

for(q=0;q

scanf(”%d“,&b[p][q]);

if(j==p)

{

for(c=0;c

{

d=0;

while(d

{

e[c][d]=0;

for(o=0;o

e[c][d]+=a[c][o]*b[o][d];

d++;

}

}

for(c=0;c

{

for(d=0;d

{

if(d==0)

printf(”%d“,e[c][d]);

else

printf(” %d“,e[c][d]);

}

printf(”n“);

}

}

else

{

printf(”Not satisfied the definition of matrix multiplication!n“);

for(c=0;c

for(d=0;d

e[c][d]=b[c][d];

}

}

}

if(k%2==0)

printf(”n“);

} } 问题 28: 十进制整数转二进制

题目描述

给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。

输入

输入为多行,每行一个整数x,至读入EOF结束。

输出

每行输出x对应的二进制数值。

样例输入

0 1 3 33 65535 样例输出

0 1 11 100001 ***1 提示

本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。

解答:

#include int main(){ int x,i,j,y;for(;scanf(”%d“,&x)!=-1;){

if(x==0)

printf(”%dn“,x);

else

{

i=0;

int a[100]={0};

for(;x!=0;)

{

y=x%2;

x=x/2;

a[i]=y;

i++;

}

for(j=i-1;j>=0;j--)

printf(”%d“,a[j]);

printf(”n“);

} } }

问题 29: 魔方阵

题目描述

所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的规律如下: 从1~N*N的 各个数依次如下规则存放:(1)1在第一行中间一列;

(2)每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列);

(3)如果上一个数在第一行,则下一个数在最后一行,列数加一;(4)如果上一个数在最后一列,则下一个数在第一列,行数减一;

(5)如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。

输入

输入包含多组数据,每组为一个小于100的正奇数。

输出

对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。

样例输入 样例输出 1 6 3 5 7 4 9 2 解答:

#include int main(){ int i,j,k,n,row=1,col,temp_row,temp_col;int sqrt[100][100]={0};scanf(”%d“,&n);col=(n+1)/2;for(i=1;i<=n*n;i++){

sqrt[row][col]=i;

temp_row=row;

temp_col=col;

if(row==1&&col==n)

row++;

else

{

row--;

col++;

if(row==0)

row=n;

if(col>n)

col=1;

if(sqrt[row][col]!=0)

{

row=temp_row+1;

col=temp_col;

if(row>n)

row=1;

}

} } j=1;while(j<=n){ k=1;

while(k<=n)

{

if(k%n==0)

printf(”%dn“,sqrt[j][k]);

else

printf(”%d “,sqrt[j][k]);k++;

}

j++;} for(;scanf(”%d“,&n)!=-1;){ printf(”n“);int sqrt[100][100]={0};col=(n+1)/2;for(i=1;i<=n*n;i++){

sqrt[row][col]=i;

temp_row=row;

temp_col=col;

if(row==1&&col==n)

{

row++;

}

else

{

row--;

col++;

if(row==0)

row=n;

if(col>n)

col=1;

if(sqrt[row][col]!=0)

{

row=temp_row+1;

col=temp_col;

if(row>n)

row=1;

}

} } j=1;while(j<=n){ k=1;

while(k<=n)

{

if(k%n==0)

printf(”%dn“,sqrt[j][k]);

else

printf(”%d “,sqrt[j][k]);k++;

}

j++;} } } 问题 30: 兔子的繁殖问题

题目描述

假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?

这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。

输入

输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。

输出

输出为n行,每行为第m个月后的兔子总数。

样例输入 1 2 3 4 5 10 样例输出 2 3 5 8 89 提示

可以先计算出菲波那契序列并存储下来,然后查询出每月兔子数。

解答:

#include int main(){ int a[50],b[50];int i,x,n;a[0]=1;a[1]=1;i=2;while(i<50){

a[i]=a[i-1]+a[i-2];

i++;}

scanf(”%d“,&x);

for(i=1;i<=x;i++){

scanf(”%d“,&n);

b[i]=a[n];} for(i=1;i<=x;i++)

printf(”%dn“,b[i]);} 问题 31: 简单的整数排序

题目描述

对给出的若干整数按从小到大排序。

输入 输入的第一个数为n(n<=1000),后接n个整数。

输出

按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。

样例输入 3 9 1 5 2 8 5 6 7 3 样例输出 2 3 3 5 5 6 7 8 9 提示

排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。

解答:

/*本题使用插入排序*/ #include int main(){ int a[1000];int m,n,p,i,j;scanf(”%d“,&n);for(i=0;i

scanf(”%d",&a[i]);for(j=1;j

p=0;

while(p

{

if(a[p]>a[j])

break;

else

p++;

}

m=a[j];

for(i=j;i>p;i--)

a[i]=a[i-1];

a[p]=m;

}

第二篇:C语言程序设计习题试题(编程题)

C语言程序设计习题(编程类)

1、从键盘输入任意的字符,按下列规则进行分类计数。

第一类 '0','1','2','3','4','5','6','7','8','9'

第二类 '+','-','*','/','%','='

第三类 其它字符

当输入字符''时先计数,然后停止接收输入,打印计数的结果。参考答案:

#include void main(){ int class1, class2, class3; char ch;

class1=class2=class3=0; /* 初始化分类计数器 */ do { ch=getch(); switch(ch){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class1++; break; /* 对分类1计数 */ case '+': case '-': case '*': case '/': case '%': case '=': class2++; break; /* 对分类2计数 */ default: class3++; break; /* 对分类3计数 */ } }while(ch!= ''); /* 字符''在C程序中要使用转义符'' */ printf(“class1=%d, class2=%d, class3=%dn”, class1, class2, class3); }

2、从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。参考答案: void main(){ int i,j,num,a[10]; for(i=0;i<10;i++){ printf(“Enter No.%d:”, i+1); scanf(“%d”,&num);

for(j=i-1;j>=0&&a[j]>num;j--)a[j+1]=a[j]; a[j+1]=num; } for(i=0;i<10;i++)printf(“No.%d=%dn”, i+1, a[i]); }

3、输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。参考答案: void main(){ int n;

printf(“Please enter n:”); scanf(“%d”,&n); while(n>0){ printf(“%d”,n%10); n=n/10; } }

4、编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。参考答案: void main(){ int i,n;

long s1=0,s2=0;

printf(“Please enter N:”); scanf(“%d”,&n); if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i; else for(i=n;i>=2*n;i--)s1=s1+i; i=n; if(i>=0)while(i<=2*n)s2=s2+i++; else while(i>=2*n)s2=s2+i--;

printf(“Result1=%ld result2=%ldn”,s1,s2); }

5、一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,•所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。参考答案: void main(){ int i,n,a;

for(i=0; ;i++){ if(i%8==1){ n=i/8; if(n%8==1){ n=n/8;

if(n%8==7)a=n/8; } } if(i%17==4){ n=i/17;

if(n%17==15)n=n/17; } if(2*a==n){ printf(“result=%dn”,i); break; } } }

6、编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。参考答案: void main(){ int f1,f2,f5,count=0; for(f5=0;f5<=20;f5++)for(f2=0;f2<=(100-f5*5)/2;f2++){ f1=100-f5*5-f2*2; if(f5*5+f2*2+f1==100)printf(“No.%2d >> 5: %4d 2: %2d 1: %2dn”,++count,f5,f2,f1); } }

7、将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。参考答案: void main(){ int i,j,n,k,a[16]={0}; for(i=1;i<=1993;i++){ n=i;k=0;

while(n>0)/* 将十进制数转变为二进制数 */ { a[k++]=n%2; n=n/2; } for(j=0;j=k){ printf(“ %d: ”,i); for(j=0;j

8、十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14 块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖? 参考答案: void main(){ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20}; while(1){ for(i=1;i<=10;i++)a[i-1]=a[i-1]/2+a[i]/2; a[10]=a[10]/2+a[0]; for(i=1;i<=10;i++)if(a[i]%2==1)a[i]++; for(i=1;i<10;i++)if(a[i]!=a[i+1])break; if(i==10)break; else { a[0]=0; count++; } } printf(“count=%d number=%dn”,count,a[1]); }

9、输入5×5的数组,编写程序实现:(1)求出对角线上各元素的和;

(2)求出对角线上行、列下标均为偶数的各元素的积;(3)找出对角线上其值最大的元素和它在数组中的位置。参考答案: void main(){ int i,j,s1=0,s2=1,a[5][5]; for(i=0;i<5;i++)for(j=0;j<5;j++){ printf(“%d %d: ”,i,j); scanf(“%d”,&a[i][j]); } for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[i][j]); printf(“n”); } j=0;

for(i=0;i<5;i++){ s1=s1+a[i][i];

if(i%2==0)s2=s2*a[i][i]; if(a[i][i]>a[j][j])j=i; } printf(“SUN=%dnACCOM=%dna[%d]=%dn”,s1,s2,j,a[j][j]); }

10、编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。参考答案:

#include “stdio.h” void main(){ int i,n=0,a[4]={0};

printf(“Please enter a digit:”);

for(i=0;i<4 &&(a[i]=getchar())!='n';i++); for(i=0;i<4;i++)if(a[i]>=48&&a[i]<=57)a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=69)a[i]=a[i]-55; else if(a[i]>=97&&a[i]<=102)a[i]=a[i]-87; else printf(“input Error!”); for(i=0;i<4;i++)n=n*16+a[i]; printf(“%d”,n); }

11、编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。参考答案: void main(){ int i,n,k=16,a[16]={0}; printf(“Please enter a digit:”); scanf(“%d”,&n);

while(n>0)/* 将十进制数转变为二进制数 */ { a[--k]=n%2; n=n/2; } for(i=0;i<16;i++)printf(“%2d”,a[i]); }

12、对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6)则输出为:(3,1,2,5,1,3,4)参考答案: void main(){ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf(“Please enter n:”); scanf(“%d”,&n); for(i=0;i

for(j=i;j

13、求这样一个三位数,该三位数等于其每位数字的阶乘之和。

即: abc = a!+ b!+ c!参考答案: void main(){ int a[5],i,t,k;

for(i=100;i<1000;i++){ for(t=0,k=1000;k>=10;t++){ a[t]=(i%k)/(k/10); k/=10; } if(f(a[0])+f(a[1])+f(a[2])==i)printf(“%d ”,i); } } f(m)int m;

{ int i=0,t=1;

while(++i<=m)t*=i; return(t); }

14、编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。参考答案:

#include “string.h” strcmbn(a,b,c)/* 数组合并函数:将数组a、b合并到 */ char a[],b[],c[]; { char tmp; int i,j,k,m,n; m=strlen(a); n=strlen(b);

for(i=0;i

tmp=a[i]; a[i]=a[k]; a[k]=tmp; } for(i=0;i

tmp=b[i]; b[i]=b[k]; b[k]=tmp; } i=0;j=0;k=0;

while(ib[j])c[k++]=b[j++]; /* 将a[i]、b[j]中的小者存入c[k] */ else { c[k++]=a[i++]; if(a[i-1]==b[j])j++; /* 如果a、b当前元素相等,删掉一个 */ } while(i

15、编写函数,采用递归方法实现将输入的字符串按反序输出。参考答案:

#include “stdio.h” strout(s)char *s; { if(*s!=''){ strout(s+1); /* 递归调用strout函数,字符串首地址前移一个字符 */ putch(*s); /* 输出字符串首地址所指向的字符 */ } else return; /* 遇到字符串结束标志结束递归调用 */ }

16、编写函数,采用递归方法将任一整数转换为二进制形式。参考答案: turn(n,a,k)int n,a[ ],k; { if(n>0){ a[k]=n%2; turn(n/2,a,k-1); } else return; } void main(){ int i,n,a[16]={0};

printf(“nPlease enter n:”); scanf(“%d”,&n); turn(n,a,15);

for(i=0;i<16;i++)printf(“%d”,a[i]); }

17、将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。

参考答案:

smmt(char s[ ])/* 指针s指向字符串的第一个字符 */ { char *p; p=s; while(*p!='')p++;

p--; /* 指针p指向字符串的最后一个字符 */ if(p==s)return(1); /* 两个指针指向同一个字符表示字符串对称 */ else { if(*s!=*p)

return(0); /* 两个指针指向字符不等表示字符串不对称 */ else { *p='';

smmt(s+1); /* 取掉首尾比较过的字符继续比较 */ } } }

18、编写程序,读入一个以符号“.”结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:

读入句子:MADAM I'M ADAM.它是回文,所以输出:YES 读入句子:ABCDBA).它不是回文,所以输出:NO 参考答案:

#include “stdio.h” void main(){ char s[21],*p,*q; gets(s); p=s; q=s;

while(*q!='')q++; q-=2;

while(p=q)printf(“YESn”); }

19、编写程序,其中包括一个函数,此函数的功能是:对一个长度为N 的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。例如输入字符串“We are poor students.”,利用此函数进行删除“poor”的处理,输出处理后的字符串是“We are students.”。参考答案: strcut(s,m,k)char s[ ]; int m,k; { char *p; int i;

p=s+m; /* 指针p指向要被删除的字符 */ while((*p=*(p+k))!='')/* p+k指向要前移的字符 */ p++; }

20、编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。

参考答案: insert(s1,s2,ch)char s1[],s2[],ch; { char *p,*q; p=s1;

while(*p++!=ch); while(*s2!=''){ q=p;

while(*q!='')q++; while(q>=p)*(q+1)=*q--; *++q=*s2++; p++; } }

21、编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。参考答案: strcnb(s1,s2)char s1[],s2[]; { char *p; int i=1; p=s1;

while(*p!='')p++;

while((*p++=*s2++)!=''); /* 将s2接于s1后面 */ p=s1;

while(*p!='')/* 扫描整个字符串 */ { if(*p==' ')/* 当前字符是空格进行移位 */ { while(*(p+i)==' ')i++; /* 寻找当前字符后面的第一个非空格 */ if(*(p+i)!=''){ *p=*(p+i); /* 将非空格移于当前字符处 */ *(p+i)=' '; /* 被移字符处换为空格 */ } else break; /* 寻找非空格时到字符串尾,移位过程结束 */ } p++; } }

22、编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串: abcedabcdcd 则输出:a=2 b=2 c=3 d=3 e=1。参考答案:

#include “stdio.h” struct strnum { int i; char ch; } void main(){ char c; int i=0,k=0;

struct strnum s[100]={0,NULL}; while((c=getchar())!='n'){ for(i=0;s[i].i!=0;i++){ if(c==s[i].ch){ s[i].i++; break; } } if(s[i].i==0){ s[k].ch=c; s[k++].i=1; } } i=0;

while(s[i].i>0){ printf(“%c=%d ”,s[i].ch,s[i].i); i++; } }

23、编写程序,读入磁盘上C语言源程序文件“test8.c”,删去程序中的注释后显示。参考答案:

#include “stdio.h” FILE *fp; void main(){ int c, d;

if((fp = fopen(“d: c est8.c”,“r”))== NULL)exit(0); while((c=fgetc(fp))!= EOF)if(c=='/')/* 如果是字符注释的起始字符'/' */ if((d=fgetc(fp))== '*')/* 则判断下一个字符是否为'*' */ in_comment(); /* 调用函数处理(删除)注释 */ else /* 否则原样输出读入的两个字符 */ { putchar(c); putchar(d); } else if(c==''' || c=='“')/* 判断是否是字符'或” */ echo_quote(c); /* 调用函数处理字符'或“包含的字符 */ else putchar(c); } in_comment(){ int c, d; c=fgetc(fp); d=fgetc(fp);

while(c!='*' || d!='/'){ /* 连续的两个字符不是 * 和 / 则继续处理注释 */ c = d;

d = fgetc(fp); } } echo_quote(c)int c; /* c中存放的是定界符'或” */ { int d; putchar(c);

while((d=fgetc(fp))!=c)/* 读入下一个字符判断是否是定界符c */ { putchar(c); /* 当不是定界符c时继续循环 */ if(d=='')/* 若出现转义字符 */ putchar(fgetc(fp)); /* 则下一个字符不论是何均原样输出 */ } putchar(d); } 12

第三篇:C语言编程

#include(stdio.h)

main()

{ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};

char again='y';

while(again=='y'){ srand((int)time(0));

while(i4){ k=(int)rand()%10;

for(j=0;ji;j++)if(k==question[j]){ k=-1;break;}

if(k==-1)continue;question[i]=k;i++;}/*while i*/

for(i=8;i0;i--)/*还有8次机会*/

{ A=0;B=0;printf(“n你还剩下%d次机会。”,i);

printf(“n请输入四个0-9之间的数字,中间用空格隔开n”);for(j=0;j4;j++)scanf(“%d”,&answer[j]);

for(j=0;j4;j++)

for(k=0;k4;k++)

{ if(answer[j]==question[k]){ if(j==k)A++;else B++;} }/*for*/

if(A==4){ again='0';

printf(“n你赢了,还继续猜吗?(y/n)”);

while(again!='y'&&again!='n')

scanf(“...%c”,&again);break;}/*if*/

printf(“n%dA%dB”,A,B);if(i==1){ again='0';

printf(“n你输了,正确答案是”);

for(j=0;j4;j++)

printf(“%dt”,question[j]);

printf(“n还继续吗?(y/n)”);

while(again!='y'&&again!='n')scanf(“%c”,&again);

printf(“%c”,again);break;}/*if*/ }/*for changce*/ }/*while again*/ printf(“感谢您玩这个游戏。”);}

第四篇:C语言程序设计

1.Problem A: Hello world!Description Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放学回家,父母分别跟他们打招呼。

Input 无

Output 请输出: Hello Da_min, Hello Er_min, Hello Xiao_ming!

Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming!

HINT 请注意换行符

Append Code #include int main(){

printf(“Hello Da_min,n”);

printf(“Hello Er_min,n”);

printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。

Input 输入一个浮点型数据,有效数字不会超过十进制的6位。

Output 输出为两行。

第一行为圆的面积,第二行为圆的周长,格式见sample。

Sample Input 3

Sample Output Area: 28.260000 Perimeter: 18.840000

HINT 了解浮点类型的输入、输出和算术运算符

Append Code 法一

#include int main(){ double r,p,s;scanf(“%lf”,&r);p=2*3.14*r;s=3.14*r*r;printf(“Area: %lfn”,s);printf(“Perimeter: %lfn”,p);} 法二

#include #define pi 3.14 int main(){

double r;

scanf(“%d”,&r);

printf(“Area: %lfn”,pi*r*r);

printf(“Perimeter: %lfn”,2*pi*r);

}

3.Problem C:平均值 Description 求3个数的平均值。

Input 输入只有一行,为3个较小的整数。

Output 输出为这3个整数的平均值,保留3位小数。

Sample Input 1 2 3 Sample Output 2.000

HINT 注意除法运算对整型数据和浮点型数据是不一样的。

Append Code #include int main(){ int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“%.3lf”,(a+b+c)/3.0);}

4.Problem D: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。

Input 输入为3个字符。

Output 输出为3行。

每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。

Sample Input 0 A

Sample Output 048 060 030 032 040 020 065 101 041

HINT 了解字符值的存储和整型的关系。

Append Code #include int main(){ char a,b,c;scanf(“%c%c%c”,&a,&b,&c);printf(“%.3d %.3o %.3xn”,a,a,a);printf(“%.3d %.3o %.3xn”,b,b,b);printf(“%.3d %.3o %.3xn”,c,c,c);}

5.Problem A: 最简单的程序 Description 输出一行“Hello world!”。

Input 无

Output Hello world!

Sample Input Sample Output Hello world!

HINT Append Code #include int main(){

printf(“Hello world!”);}

6.Problem B: 算术基本运算 Description 计算两整数x和y(0

Input 输入只有一行,格式见sample。

Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample

Sample Input x = 11, y = 3

Sample Output x + y : 14 xy : %dn“,x-y);

printf(”x * y : %dn“,x*y);

printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y);

printf(”x ^ 2 : %dn“,x*x);

printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自减运算 Description C语言中有自增运算++、自减运算--,并且可以前置和后置。

编写一个程序:对输入的一个整数a,输出a++、a--、++a、--a的值。

Input 一个整数a,a是很小的整数。

Output 输出为5行,第一行为a的值,后面依次为--a、a--、a++、++a的值。

5行输出纵向a要对齐,“:”对齐,“:”前后各一个空格,后面的数值不用对齐。每行行尾都有回车。

Sample Input 0

Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1

HINT Append Code #include int main(){ int a,x;scanf(”%dn“,&x);a=x;printf(” a

: %dn“,a);printf(”--a

: %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a

: %dn“,++a);}

8.Problem F: 绝对值 Description 求整型数据和浮点型数据的绝对值。

Input 输入两个数,第一个是整数,第二个是浮点数。

Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。

Sample Input-1 1

Sample Output 1 1

HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人!

Append Code #include //#include int main(){

int n;

float m;

scanf(”%d%f“,&n,&m);

//n=abs(n);

//m=fabs(m);

if(n<0)

{

n=-n;

}

if(m<0)

{

m=-m;

}

printf(”%dn“,n);

printf(”%g“,m);

return 0;}

9.Problem A: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。

Input 输入只有一行,为一个100以内的正整数。

Output 输出为一行。

若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30

Sample Output even

HINT 用整数运算可以解决,练习“?:”表达式。

Append Code #include int main(){

int n;

scanf(”%d“,&n);

if(n>=0&&n<=100){

if(n%2==0)printf(”evenn“);

else printf(”oddn“);

}

return 0;}

10.Problem B: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。

Input 输入只有一行,三个整数m、n和x,且0

Sample Input 95 300 4

Sample Output 334.40

HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。

Append Code #include int main(){

int m,x,n,a;

float b;

scanf(”%d%d%d“,&m,&n,&x);

0

x

m

a=m*x;

if(a>n)

b=0.88*a;

else

b=a;

printf(”%.2fn“,b);

}

11.Problem C: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。

Input 输入只有一行,为一个10000以内的正整数。

Output 输出为一行。

若输入为闰年偶数则输出“Yes”,否则输出“No”。

Sample Input 2010

Sample Output No

HINT 了解逻辑运算符和关系运算符。

Append Code #include int main(){

int x;

scanf(”%d“,&x);

if(x>0&&x<10000)

{

if(x%4==0&&x%100!=0)

printf(”Yesn“);

else if(x%400==0)

printf(”Yesn“);

else

printf(”Non“);

}

else

printf(”error“);}

12.Problem D: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。

Input 一个整数x,100<=x<=999。

Output x是水仙花数,则输出“YES”,否则为“NO”。

Sample Input 153

Sample Output YES

HINT Append Code #include int main(){

int a,b,c,x;

scanf(”%d“,&x);

a=x/100;

b=x/10%10;

c=x%10;

if(x==a*a*a+b*b*b+c*c*c)

printf(”Yes“);

else

printf(”No“);}

13.Problem E: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。

Input 输入只有一行,为三个整数。

Output 按从小到大输出这三个数。

Sample Input 15 10 20

Sample Output 10 15 20

HINT 用if语句判断各种情况可以解决这个问题。

Append Code #include int main(){

int a,b,c;

scanf(”%d%d%d“,&a,&b,&c);

if(a>=b)

{

if(b>=c)

printf(”%d %d %dn“,c,b,a);

else if(c>=a)

printf(”%d %d %dn“,b,a,c);

else

printf(”%d %d %dn“,b,c,a);

}

else

{

if(a>=c)

printf(”%d %d %dn“,c,a,b);

else if(b>=c)

printf(”%d %d %dn“,a,c,b);

else

printf(”%d %d %dn“,a,b,c);

} }

14.Problem F: 奇怪的求和之一 Description 给定3个正整数a、b和c,按照如下规则求和: 如果这个数字是偶数,则累加到和中;

如果这个数字是奇数,则将大于该数的最小偶数累加到和中。

Input 三个正整数,均在100以内。

Output 一个和。

Sample Input 2 3 5

Sample Output 12

HINT 如果不会使用分支语句,可使用条件运算符判断到底将哪个数累积到和中。

Append Code #include int main(){

int a,b,c;

scanf(”%d%d%d“,&a,&b,&c);

if(a%2!=0)a++;

if(b%2!=0)b++;

if(c%2!=0)c++;

printf(”%dn“,a+b+c);

}

15.Problem G: 你过线了吗? Description 经过四年的学习,你决定报考我国著名的“285”高校之一的北青大学,经过认真的复习,残酷的考试,终于知晓了自己的考试成绩,也知道了北青大学的录取分数线,请你编程判断,自己过线了吗? Input 输入有2行,第一行有4个正整数,分别表示三门课程的分数线以及总分分数线。第二行有3个非负整数,分别表示你考的三门课程的成绩。

Output 如果你的三门课程成绩都不低于相应课程的分数线,且你的考试总分也不低于北青大学的总分分数线要求,则输出“congratulations”,否则输出“sorry”。

Sample Input 70 80 70 240 80 80 82

Sample Output congratulations

HINT 如果你不会使用分支语句,同样可以使用条件运算符实现该程序。

Append Code #include int main(){

int a,b,c,d,e,f,g,h;

scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g);

h=e+f+g;

if(e>=a&&f>=b&&g>=c&&h>=d)

printf(”congratulations“);

else

printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的和,顺序与输入对应。

Sample Input 2 1 2 10 20

Sample Output 3 30

HINT N给出了测试样例数,用for循环处理方便。

Append Code #include int main(){

int n,a,b,i;Scanf(“%d”,&n);For(i=0;i

17.Problem H: A+B Problem Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的值,顺序与输入对应。

Sample Input 1 2 10 20

Sample Output 3 30

HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。Append Code #include int main(){

int a,b;

while(scanf(”%d%d“,&a,&b)!=EOF){

printf(”%dn“,a+b);

}

return 0;}

18.Problem A: 判断是否是元音字母 Description 输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U

Input 输入一个英文字母

Output 是元音字母,输出“yes”,否则输出“no”,行尾没有回车。

Sample Input A

Sample Output yes

HINT Append Code #include void main(){

char ch;

scanf(”%c“,&ch);

if(ch>='A'&&ch<='Z')

ch=ch+32;

if(ch=='a')

printf(”yes“);

else if(ch=='e')

printf(”yes“);

else if(ch=='i')

printf(”yes“);

else if(ch=='o')

printf(”yes“);

else if(ch=='u')

printf(”yes“);

else

printf(”no“);

}

19.Problem B: 按顺序输出三个数 Description 对于输入的3个整数,按照从小到大的顺序输出。

Input 输入3个int类型内的整数,两两之间用一个空格隔开。

Output 按照从小到大的顺序输出上述三个数,两两之间用一个空格隔开。

Sample Input 2 1 3 Sample Output 1 2 3

HINT Append Code #include void main(){

int a,b,c,temp;

scanf(”%d%d%d“,&a,&b,&c);

if(a

{

temp=a;

a=b;

b=temp;

}

if(a

{

temp=a;

a=c;

c=temp;

}

if(b

{

temp=b;

b=c;

c=temp;

}

printf(”%d %d %dn“,c,b,a);}

20.Problem E: Description 判断输入整数的奇偶性。

判断奇偶数 Input 输入为一个整数。

Output 输出只有一行,代表判断结果。如果输入的整数n是一个偶数,输出: n is an even number.否则输出:

n is an odd number.见样例。

Sample Input 12

Sample Output 12 is an even number.HINT Append Code #include int main(){

int a;

scanf(”%d“,&a);

if(a%2==0)

printf(”%d is an even number.“,a);

else

printf(”%d is an odd number.“,a);}

21.Problem A: 判断两个整数的大小关系 Description 输入2个整数a和b,如果a>b,则输出1,否则输出0。

Input 两个整数a和b,均不超过int类型的表示范围。

Output 表示a>b的结果:如果a>b,则输出1,否则输出0。

Sample Input 3 4

Sample Output 0

HINT

Append Code #include int main(){ int a,b;scanf(”%d %d“,&a,&b);if(a>b)

printf(”1“);

else

printf(”0“);return 0;} 22.Problem D: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing

不在0~100之间的输入是非法数据,输出“Error”。

Input 输入多行,每行一个整数。

Output 输入所对应的成绩等级。

Sample Input-1 81 92 35 68 72 100

Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。

Append Code #include int main(){

int score;

while(scanf(”%d“,&score)!=EOF)

{

if(score<0||score>100)

printf(”Errorn“);

else

{

switch(score/10)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:printf(”Failingn“);break;

case 6:printf(”Passn“);break;

case 7:printf(”Averagen“);break;

case 8:printf(”Goodn“);break;

case 9:

case 10:printf(”Excellentn“);break;

}

}

}

return 0;}

23.Problem E: 输出是m的倍数或n的倍数、但不是

m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n

Input 输入三个整数,依次为k、m、n。

Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。

Sample Input 15 2 3

Sample Output 2 3 4 8 9 10 14 15

HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。

Append Code #include int main(){ int k,m,n,a,i=1;scanf(”%d %d %d“,&k,&m,&n);if(m

a=m;else

a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){

}

if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0))

printf(” %d“,i);} return 0;

24.Problem B: 两整数相加减 Description 计算a+b和a-b。

Input 输入为一对整数a和b。a,b用空格分开。

Output 输出a+b和a-b的计算结果,各占一行。

Sample Input 1 2

Sample Output 3-1

HINT Append Code #include int main(){ int a,b;scanf(”%d %d“,&a,&b);

printf(”%dn“,a+b);

printf(”%dn“,a-b);} 25 Problem C: 它满足条件吗? Description 需要判断给定的一个整数是否同时满足如下三个条件: 1.它是一个完全平方数。2.它是一个偶数。3.它是一个正数。

注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如:

0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一个int范围内的整数。

Output 如果输入的数字满足条件,则输出yes,否则输出no。

Sample Input 100

Sample Output yes

HINT 注意逻辑表达式判断三个条件的顺序。如果你不会使用分支语句,同样可以使用条件运算符实现该程序。

库函数sqrt()可以用于求一个数的平方根。

Append Code #include #include int main(){ int a;scanf(”%d“,&a);

if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0)

printf(”yes“);

else

printf(”no“);}

26.Problem F: 多路分支 Description 编写一个完整的程序,运行时向用户提问”你考试考了多少分?(0-100)“接受输入后判断其等级并显示出来等级: 优:90<=分数<=100 良:80<=分数<90 中:60<=分数<80 差:0<=分数<60

Input 输入任意一个整数分数值,显示等级;再输入任意一个整数分数值,显示等级;....直到测试数据较充分,可输入-1止。

Output 对任意输入的分数值,输出对应的等级,直到输入的数为-1时才退出运行.Sample Input 102 100 90 80 70 60 50 0-80-1

Sample Output grad must between 0 and 100 优

grad must between 0 and 100 grad must between 0 and 100

HINT Append Code #include int main(){

int x;

while(scanf(”%d“,&x)!=EOF)

{

if(x<0||x>100)

printf(”grad must between 0 and 100n“);

else if(x>=90)

printf(”优n“);

else if(x>=80)

printf(”良n“);

else if(x>=60)

printf(”中n“);

else if(x>=0)

printf(”差n“);

}

return 0;} Problem D: 有多少人? Description 学校举行运动会,如果全体学生按照3人一队列队,则多了1个人;如果按照4人一队列队,则多了2个人;如果按照5人一队排队,则多了3个人。请问这个学校有多少学生?

Input 一个int类型的正整数N,是学生人数的上界,即:该校学生数不超过N。

Output 所有可能的学生数,每个数占一行。

Sample Input 200

Sample Output 58 118 178

HINT Append Code #include #include int main(){

int n,i;

scanf(”%d“,&n);

for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3)

printf(”%dn“,i);}

return 0;} Problem C: 正负数各有几个? Description 输入若干个整数,求其中正数、负数的个数。

Input 输入分为2行:第一行是一个数字N>0,表示下面有N个整数。第2行是N个整数,都是int类型的。

Output 输出所输入的N个整数的正数个数和负数个数,并用空格分开2个输出。Sample Input 10 2 3 4 5-1-2-3-4-5

Sample Output 5 5

HINT 貌似还有一种叫做0的数。

Append Code #include int main(){

int n,a,i,num1=0,num2=0;

scanf(”%d“,&n);for(i=0;i

{

scanf(”%d“,&a);

if(a>0)

num1++;

else if(a<0)

num2++;

}

printf(”%d %dn“,num1,num2);

return 0;} Problem A: A+B Problem(III): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。

Output 每行输出一个a+b的值,顺序与输入对应。

Sample Input 1 2 10 20 0 0

Sample Output 3 30

HINT 练习break的使用。

Append Code #include int main(){ int a,b;while(scanf(”%d %d“,&a,&b)!=EOF)

{

if(a!=0||b!=0)

}

printf(”%dn“,a+b);

else

break;

return 0;} 30 Problem B: A+B Problem(IV): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。

Sample Input 1 2 10 20 15 35

Sample Output 3 30 50

HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。

Append Code #include int main(){ int a,b,n=0;while(scanf(”%d %d“,&a,&b)!=EOF){

n++;

if(n==1)

printf(”%dn“,a+b);

else

printf(”n%dn“,a+b);

}

return 0;}

Problem C: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。

Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。

Output 输出为两行,格式见sample。

Sample Input 3 0 1-1

Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。

Append Code #include int main(){

int n,i,max,min;

scanf(”%d“,&n);

int a[n];

for(i=0;i

scanf(”%d“,&a[i]);

max=a[0];

min=a[0];

for(i=0;i

{

if(max

max=a[i];

if(min>a[i])

min=a[i];

}

printf(”The maximum number is %d.n“,max);

printf(”The minimum number is %d.“,min);

return 0;} 32.Problem D: 求100以内的素数 Description 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。

Input 输入为两个整数m和n,满足0<=m<=n<=100。

Output 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。

输出的所有数在两行“=====”之间。

Sample Input 2 12

Sample Output ===== 11 7 5 3 2 =====

HINT 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。

Append Code #include #include int main(){ int m,n,i,j,k,t;scanf(”%d %d“,&m,&n);printf(”=====n“);for(i=n;i>=m;i--){

t=0;

for(j=2;j<=sqrt(i);j++)

if(i%j==0)

t=1;

if(t==0&&i>1)

printf(”%dn“,i);} printf(”=====“);return 0;} 33.Problem E: 是否构成三角形? Description 给出三个整数,代表三条边的长度,判断这三条边的长度是否能构成一个三角形?

Input 第一行是n(1<=n<=100),表示有n组测试数据

接下来有n行,每一行包含三个整数,表示三个边长(1<=边长<=100)

Output 如果三条边能构成三角形,输出YES,否则输出NO

Sample Input 3 1 2 3 2 8 7 20 20 1

Sample Output NO YES YES

HINT Append Code #include int main(){ int a,b,c,n,i;scanf(”%d“,&n);for(i=0;i

{scanf(”%d%d%d“,&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a)

printf(”YESn“);else printf(”NOn“);}

return 0;} 34.Problem C: 简单的整数排序 Description 对给出的若干整数按从小到大排序。

Input 输入的第一个数为n(n<=1000),后接n个整数。

Output 按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。

Sample Input 10 3 9 1 5 2 8 5 6 7 3

Sample Output 1 2 3 3 5 5 6 7 8 9

HINT 排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。

Append Code #include int main(){

int c,i,n,j;

int a[1000];

scanf(”%d“,&n);

for(i=0;i

scanf(”%d“,&a[i]);

for(i=1;i<=n-1;i++)

{

for(j=0;j

{

if(a[j]>a[j+1])

{

c=a[j];

a[j]=a[j+1];

a[j+1]=c;

}

}

}

printf(”%d“,a[0]);

for(i=1;i

printf(” %d“,a[i]);

return 0;}

35.Problem A: Description

购物的路程 Saya和Kudo一起去购物。假定她们逛的街是一条直线,而商铺是这条直线上的一些点。她们将车停在该直线最左端的店铺处,然后从左向右开始逛每一个店铺,然后从最右边的店铺再返回到停车处。你的任务是计算她们走了多少路。

Input 输入有多组。每一组的第一行是N(0

Output 对每组输入,输出她们走的路长。

Sample Input 4 13 89 37 6 7 30 41 14 39 42 0

Sample Output 152 70

HINT Append Code #include int main(){

int n,i,max,min,a[100001];

while(scanf(”%d“,&n)&&n!=0)

{

scanf(”%d“,&a[0]);

min=max=a[0];

for(i=1;i

{

scanf(”%d“,&a[i]);

if(a[i]>max)

max=a[i];

if(a[i]

min=a[i];

}

printf(”%dn“,(max-min)*2);

}

return 0;} 36.Problem B: 求累加和 Description 编程求min~max的累加和(含min和max),其中max>=min>0。部分程序已经给出,请填充其中的空白语句,并提交填充后的完整程序。

Input 输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。

Output 输出为N行,每个测试用例的计算结果占据一行。每行的格式为: case i:sum=s.其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。

Sample Input 3 1 10 1 100 1 1

Sample Output case 1:sum=55.case 2:sum=5050.case 3:sum=1.HINT Append Code #include int main(){

int n,i,j,max,min,sum;

scanf(”%d“,&n);

for(i=0;i

{ sum=0;

scanf(”%d%d“,&min,&max);

if(max==min)

printf(”case %d:sum=%d.n“,i+1,min);

else

{

for(j=min;j<=max;j++)

sum=sum+j;

printf(”case %d:sum=%d.n“,i+1,sum);

}

} return 0;} 37.Problem G: 顺序输出字母 Description 按字母顺序输出两个字母st和ed之间的所有字母,但不包括st和ed。不输出逆序。

Input 两个字母st和ed,都是大写字母,用一个空格分开。

Output 在一行内按顺序输出st和ed之间的所有字母,但不包括st和ed。例如:

输入为A和E,则输出为BCD;

输入为A和B,则什么字母也不输出,只有一个空行; 输入为E和A,也是什么字母也不输出,只有一个空行。最后要输出一行(行尾不回车): ***END***

Sample Input A C

Sample Output B

***END***

HINT Append Code #include int main(){

char st,ed,a;

int i;

scanf(”%c%c%c“,&st,&a,&ed);

{

for(i=st+1;i

printf(”%c“,i);

printf(”n***END***“);

}

return 0;} 38.Problem F: 单字母变换 Description Tom和Jack是密码学爱好者,他们在聊天时经常使用一些暗语。他们使用的一种最简单的暗语是:将要说的每句话里面的英文字母变成这个字母之后的某个字母。现在要求你写一个程序,将一个字母变成它之后的某个字母。

Input 输入有2个:一个大写字母c和一个正整数d(0

Output 输出字母c之后的第d个字母。大小写与c一致。如果c之后的某个字母已经超出'Z',则再从字母'A'开始计数。

如:c='A',d=3,则输出应为:D。若:c='Y',d=3,则输出应为:B。

Sample Input A 3

Sample Output D

HINT Append Code #include int main(){

char c;

int d;

scanf(”%c%d“,&c,&d);

if(c+d<='Z')

printf(”%c“,c+d);

else

printf(”%c“,c+d-26);

return 0;}

39.Problem B: 登录密码验证 Description 编写一个程序,模拟用户登录系统的密码验证过程。系统提供给用户的密码长度最长为20个字符,若密码输入错误可以再次输入。但为了保证用户密码安全,若连续输入密码错误超过5次就会锁定账号一段时间。

Input 输入为若干个串,至EOF结束。输入的第一个串是用户的正确密码,后面的串为模拟用户登录时的输入的密码。

Output 每次输入错误的密码,输出一个“Wrong!”,若输入的密码为正确的,输出一个“Welcome!”,并结束密码测试。若前5次输入的密码都是错误的,则后面的输入中不管是否有正确的密码都输出“Out of limited!”。

Sample Input abcdefg

123456 kkkkkkkk abcdefg

Sample Output Wrong!Wrong!Welcome!

HINT 输入可以用scanf(”%s“)处理,密码比较用字符串的比较可以完成。

Append Code #include #include int main(){

char a[20],b[20];

int i,j=1;

scanf(”%s“,a);

while(scanf(”%s“,b)!=EOF)

{

if(j<=5)

{

if((strcmp(a,b)==0))

{

printf(”Welcome!n“);

break;

}

else

printf(”Wrong!n“);

j++;

}

else printf(”Out of limited!n");

} } 40.Problem C: 兔子的繁殖问题 Description 假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?

这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。

Input 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。

Output 输出为n行,每行为第m个月后的兔子总数。

第五篇:C 语言程序设计

《C 语言程序设计》主要在计算机软件、计算机网络、计算机应用、通信技术、智能电子、电子信息工程、多媒体以及核工程与核技术等专业中开设,是电子信息类、机械类等工科专业的重要专业基础课。

本校从2001至今,每年都开设《C语言程序设计》课程,由于,我校最开始时的特殊情况,主要把重点放在C语言中的各类重点、难点的语法、语义上,使得学生经过比较复杂和痛苦的过程后,对C语言在使用上很难做到自己编写程序。而且很多学生产生了畏惧心理。

2004年,学院成立计算机科学与技术系,为了更好学习和掌握C语言,计算机科学与技术专业和计算机维护专业(计算机应用技术前身)除了开设《C语言程序设计》课程外,在后续一学期还开设了《C语言程序设计课程设计》,使得计算机专业学生编程思想和能力得到了极大提高。

2005年,为了让我院工科学生更好的掌握C语言编程以及通过四川省计算机二级考试,在《C语言程序设计》课程后设置《C语言程序设计课程设计》,极大地提高了学生的动手机会和能力,过级率显著提高!

2007年,依托我校建设精品课程的契机,我们将C语言中的各个知识点进行重新规整,提出适用于三本院校学生的语言设计学习的方法。我们提出,先了解C语言,再学习C语言,再用C语言的思想。即在开始时让学生初步知道C语言,然后引入比较简单的运算符以及基本输入、输出和简单的顺序结构程序设计。通过这样的方式,我们发现,学生在C语言的学习就不会从开始的时候陷入大量难懂的语法、语义和数据结构中。有了以上铺垫再层层进入,最终进入复杂的各类数据结构以及指针等学习。通过以上的内容规整后,教学效果有明显提高。

下载山科大  C语言程序设计编程精选44例word格式文档
下载山科大 C语言程序设计编程精选44例.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    c语言编程练习

    本实验所有题目均要求使用指针。 1.写一函数,将一个3*3的整型矩阵转置。2.将两个按升序排列的数组合并成一个数组,并使合并后的数组也按升序排列。 要求: (1)输入两个数组(按升序);......

    C语言程序设计心得

    C语言教学心得交流 通过本次教师发展在线的C语程培训中,我受益匪浅,几位教授的精彩演讲,让我找到了自己的不足和日后教学中的改革方向和内容。同时,也让我感觉到了,有今天各位教......

    C语言程序设计题

    【第1题】题目:请编写函数fun,对长度为7的字符串,除首、尾字符外,将其余5个字符按将序排列。例如,雨来的字符串为CEAedca,排序后输出为CedcEAa。 Int fun(char *s,int num) { Int......

    C语言程序设计题库

    郑州大学现代远程教育 《C语言程序设计》课程 学习指导书 柳宏川 编 第1章绪论 (一)本章学习目标 掌握结构化程序设计的思想,结构化流程图描述,算法设计基础和良好程序设计风......

    《C语言程序设计》教学大纲

    《C语言程序设计》教学大纲 第一部分 大纲说明 一、课程的目的与任务 本课程将以结构化程序设计思想指导学习者运用C语言进行程序设计,充分利用C语言的结构性好,书写格式自由......

    《C语言程序设计》教学大纲

    《C语言程序设计》教学大纲 课程名称:《程序设计语言( C )》 英文名称:The C Programming Language 课程编码: 学分: 参考学时:64 实验学时:64 适用专业:计算机专业一、 课程目标......

    c语言程序设计复习

    第一章C语言概述 一、选择题: 1、一个C程序的执行是从( A )。 A本程序的main函数开始,到main函数结束 B本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C本程序的ma......

    《C语言程序设计》教学大纲

    《C语言程序设计》教学大纲 [课程名称: ] C语言程序设计 [教学时总数:] 36+36 周学时: 讲授:2 上机实践:2 (共18周) [课程教材: ] 教科书:C语言程序设计(第二版)(谭浩强 著)(清华大学出版......