中国石油大学C语言上机题答案(2013版)答案 最全最详细

更新时间:2023-12-17 15:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中国石油大学c语言上机题答案大全(2013版)

最全最详细

1.1 Hello world.

让我们用C语言向世界问好。 最早的程序基本是这个样子的: 程序一:

#include void main() {

printf(\}

程序二:

#include int main() {

printf(\ return 0; }

上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。 输入:无

输出:Hello world. #include int main() {

printf(\}

1.2 Welcome to Beijing.

让我们来练习如何显示多行文字。 输入:无

输出:就是下面的那段文字。 #include void main()

{printf(\printf(\

printf(\}

1.3 练习最简单的printf和scanf

printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。 输入:整型变量x的值。

输出:输出整型变量x对应的十进制、八进制和十六进制形式。 认真观察-1的八进制和十六进制输出,请想想是为什么。

#include int main() {int x;

scanf(\printf(\printf(\printf(\return 0; }

1.4 练习两个整数之间的运算 背景:基本练习。

输入:接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444 输出:分别输出进行+、-、*、/、*之后的运行结果。 #include int main() {int x,y;

scanf(\

printf(\ printf(\ printf(\ printf(\ printf(\ return 0; }

1.5 学习打印你的第一个图形

背景:我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。 程序如下:

#include int main() {

printf(\ printf(\ printf(\ printf(\ return 0; }

要求:按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。 输入:无。

输出:指定图形。 #include int main() {

printf(\ *\\n\ printf(\ ***\\n\ printf(\ printf(\ return 0; }

2.1 整型数的表示范围

编写一个循环程序,输入 N 值,输出 N 的阶乘。关于循环程序怎么编写,可以参考教材第3章P66页的例题4.2和第5章P82的例题5.1的内容。注意整型数的表示范围,如果当输入的 N 比较大时,例如 N 等于 20 时,输出怎么是负数了?自己想明白吧! #include void main() {int N,i; int sum=1; N>=2;

scanf(\if(N<=16)

{for (i=1;i<=N;i++) sum=sum*i;

printf(\}

if(N>=17)

printf(\}

2.2 求正弦函数值

已知求正弦 sin(x) 的近似值的多项式公式为:

sin(x) = x - x3/3! + x5/5! - x7/7!+ …… + (-1)n x2n+1/(2n+1)! + …

编写程序,要求输入 x (单位是弧度)和ε,按上述公式计算 sin(x) 的近似值,要求计算的误差小于给定的ε。

此题当然要用到循环语句,到第5章去找个猫来照着画吧,循环的终止条件就是本次计算出来的正弦函数值和上次计算的值的差小于给定的ε。求两个值的差时,要求出其绝对值,使用库函数fabs(),头文件在math.h里。

友情提示:给定的误差值ε越小,计算的精度越高,但是要注意喽,给的精度太高,你的程序会成为死循环。如果出现死循环的情况,可以用+键退出程序。 #include #include int main()

{ float x,eps,s,y=0,y0,t; int n,j;

scanf(\ n=t=j=1; s=x; do { y0=y;

if (n%2==0) y=y-s/t; else y=y+s/t; s*=x*x;

t*=(j+1)*(j+2); j+=2; n++;

} while(fabs(y0-y)>eps); printf(\system(\ return 0; }

2.3 判断输入的字符的类型

我们将字符分为五类:大写字母、小写字母、数字、控制字符、其他字符。 编写程序,从键盘输入一个字符,输出字符所属的类型:大写字母时输出capital letters,小写字母时输出small letters,数字是输出figures,其他字符时输出 others。 #include void main() {

char c;

c = getchar ( ); if (c < 0x20)

printf (\ else if (c >= '0' && c <= '9') printf (\ else if (c >= 'A' && c <= 'Z')

printf (\ else if (c >= 'a' && c <= 'z')

printf (\ else

printf (\}

3.1 找零钱

假定有 5 角、 1 角、 5 分、 2 分和 1 分共 5 种硬币,在给顾客找硬币时,一般都会尽可能地选用硬币个数最小的方法。例如,当要给某顾客找 7 角 2 分钱时,会给他一个 5 角, 2 个 1 角和 1 个 2 分的硬币。试编写一个程序,输入的是要找给顾客的零钱(以分为单位),输出的是应该找回的各种硬币数目,并保证找回的硬币数最少。 #include int main() {

int x1,x2,x3,x4,x5; int x;

scanf(\ x1=x/50; x2=xP/10;

x3=xP/5; x4=xP%5/2; x5=xP%5%2/1; printf(\ printf(\ printf(\ printf(\ printf(\ return 0; }

3.2 计算时钟的夹角

背景:钟面上的时针和分针之间的夹角总是在 0 度~ 359 度之间。举例来说,在十二点的时候两针之间的夹角为 0 度,而在六点的时候夹角为 180 度,在三点的时候为 90 度。本题要解决的是计算 0:00 到 12:00之间任意一个时间的夹角。

输入:每组测试数据包含两个数字:第一个数字代表小时 ( 大于等于 0 小于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。 输出:对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。

友情提示:以表中心到12点的连线为基准,分针每走1分钟是6度,时针与基准的夹角每个小时也是30度,从整点开始,每过1分钟时针再增加0.5度。

提示:时钟夹角计算公式|5.5m-30h|,h为时针,m为分针。求浮点型绝对值的函数为fabs,需要包含math.h头文件 #include \#include \int main() { int h,m; double angle; scanf(\ angle=fabs(5.5*m-30*h); if(angle>180) angle=360-angle; printf(\}

3.3 照猫画猫:计算圆柱的侧面积及体积

如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2πrh ,体积 v=π r 2 h 。其中π=3.1415926 输入第一行输入圆柱的底面半径 r 第二行输入圆柱的高 h

输出 s=<圆柱的侧面积>,v=<圆柱的体积> 要求 1. 所有变量都定义为双精度类型 2. 结果精确到小数点后两位 #include \ #define n 3.1415926

int main() {

float r,h,s,v; printf;

scanf(\ s=2*n*r*h; v=n*r*r*h;

printf(\ }

3.4 分离整数

任意从键盘上输入一个三位正整数,要求正确地分离出它的个位、十位和百位,并分别在屏幕上输出。

比如输入的三位正整数 #include \int main() { int x,hundreds,tens,units; printf; scanf(\ hundreds=x/100; tens=x0/10; units=x0; printf(\}

3.5 鸡兔同笼

已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只? 输入:头和脚的数目 输出:兔子和鸡的数目(输出语句为:printf(\) Sample

输入:10 20

输出:rabbit=0,chicken=10 #include \int main() { int chicken,rabbit,f,h; scanf(\ rabbit=(f-2*h)/2; chicken=(4*h-f)/2; printf(\}

4.1 温度转换

背景:经常出国旅行的驴友都知道,需要时时了解当地的气温状况,但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(F),有些使用摄氏温度(C)。现在,请你根据温度转换公式设计一个温度转换程序,可以进行温度转换。如果输入摄氏温度,

显示转换的华氏温度;如果输入华氏温度,显示转换的摄氏温度。

温度转换的公式为:F=(C×9/5)+32 ;C=(F-32)×5/9 ;式中F--华氏温度,C--摄氏温度。

输入:第一个数据(1 或 2 )确定转换的类型:华氏转摄氏(1);摄氏转华氏(2); 第二个数据是相应需要转换的温度值。

输出:相应的转换后的温度值(保留小数点后 2 位)。 #include void main() {

int lx;

double f,c;

scanf(\ if(lx==1){

scanf(\ c=(f-32)*5/9;

printf(\ } else{

scanf(\ f=(c*9/5)+32;

printf(\ } }

4.2 分段函数 有一分段函数,y=f(x)。当x小于6时,y=x-12;当x大于等于6且小于15时,y=3x-1;当x大于等于15时,y=5x+9.从键盘上输入一个整数x,输出对应的y值。 #include void main() { int x,y; scanf(\ if(x<6) y=x-12; else if(x<15) y=3*x-1; else y=5*x+9; printf(\ return 0; }

4.3 整数位数判断

输入一个不多于5位的正整数,要求: (1)求它是几位数;(2)逆序打印出各位数字。 #include #include

#define SIZE 5 int

main(void) {

int bit_count;//位数

long int input_num;//输入数

int result[SIZE];//存放各个位的数 inti;

scanf(\

if (input_num < 0 || input_num > 99999) { printf(\ exit(1); }

for( bit_count = 0; input_num; ++bit_count) { result[bit_count] = input_num % 10; input_num /= 10; }

printf(\ for(i = 0; i < bit_count; ++i) printf(\ printf(\ exit(0); }

4.4 四位数拆分

输入一个四位数,判断千位、百位、十位和个位数字之和是否为偶数,如果是,输出Yes,如果不是,输出No;如果不是四位数,输出Invalid data。 #include void main() {

int x,a,b,c,d,e; scanf(\

if(x/1000<1||x/10000>=1) printf(\ else { a=x/1000;

b=x00/100; c=x000/10; d=x000; e=(a+b+c+d)%2; if(e==0) printf(\ else printf(\ }

}

4.5 磨磨你的砍柴刀:判断三角形的形状

要求:输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。 输入:三角型的3条边的长度(int型)。 输出:等边三角形:equilateral triangle. 等腰三角形:isoceles triangle. 不构成三角形:non-triangle. 一般三角形:triangle. #include void main() {

float a,b,c;

scanf(\ if(a+b4.6 字符加密输出

从键盘上输入一个字符,进行加密以后再输出在屏幕上。加密规律是:输入小写英文字母时,输入a 输出Z、输入b输出Y、输入c输出X、...、输入z输出A。输入大写英文字母时,将该字母ASCII码值再加上该值的1/2后输出所对应的字符,例如数字A的ASCII码值是65,加上其值的1/2后是98(小数四舍五入),则输出字符‘b’。输入数字时,将该数字原ASCII码值再加上该值十进制的十位上的数后输出,例如数字9的ASCII码值是57,加上十位上的数5后是62,则输出字符‘>’。输入其他字符时原样输出。友情提示:整数之间运算的结果要取整,例如5/2的结果是2,而5.0/2.0对小数四舍五入的结果就是3.0了。所以输入大写英文字母时的输出要仔细考虑。 #include int main() { char ch; int a;

ch=getchar();

if(ch>=97&&ch<=122)

{ch=187-ch;putchar(ch);} else if(ch>=65&&ch<=90) {a=ch%2;

if (a==1) (char)a=(ch+1)/2+ch; else (char)a=ch/2+ch; putchar(a);}

else if(ch>=48&&ch<=57)

{ch=ch/10+ch; putchar(ch);} else putchar(ch); printf(\ }

4.7 判断某年某月的天数

一年有365天,有的月份有31天,有的有30天,2月份闰年的时候是29天,非闰年的时候是28天。现在要求从键盘上输入一个年份和月份,输出其对应的天数。 #include main()

{ int year,month,days;

scanf(\ switch(month) { case 1: case 3: case 5: case 7: case 8: case 10:

case 12: days=31;break; case 4: case 6: case 9:

case 11:days=30;break;

case 2:if((year % 4 ==0) && (year % 100 !=0) ||(year % 400==0)) days=29; else days=28; }

printf(\}

4.8 花多少钱买衣服

周末商场促销呢,某品牌服装既可以买套装,也可以买单件。若买的不少于50套,每套80元;不足50套的每套90元,只买上衣每件60元,只买裤子每条45元。编写程序,输入计划购买的上衣数量 a 和裤子的数量 b ,计算并输出应该付的款 m 。 #include void main() {

int a,b,y;

scanf(\ if(b<=a&&b<50) y=90*b+(a-b)*60; if(b<=a&&b>=50) y=80*b+(a-b)*60; if(a

y=90*a+(b-a)*45; if(a=50) y=80*a+(b-a)*45; printf(\}

4.9 到邮局去寄包裹

你去邮局给朋友寄礼物。发现邮局对邮寄包裹的费用是这样规定的:如果包裹长宽高任意一个尺寸超过1米,或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收手续费 0.2 元,不同重量的邮资按下表计算:重量(千克) 收费标准(元) 小于10 0 . 80

大于等于10但不超过20 0 . 75

大于等于20但不超过30 0 . 70

编写程序,输入包裹的长、宽、高尺寸和重量,输出所需的邮资(输出结果中包含两位小数即可),超出尺寸或重量的输出 \” . #include void main() {

float a,b,c,m,y;

scanf(\ if(a>1||b>1||c>1||m>30) printf(\ else { if(m<10) y=0.80*m+0.2; else if(m<20) y=0.75*m+0.2; else y=0.70*m+0.2; printf(\ } }

4.10 输出星期几的英文表示

输入用数字(1--7)表示的星期几,输出星期几的英文表示,输入的数字有误,输出单词\回车)\。 #include void main() {

int a;

scanf(\ switch((int)(a))

{

case 1:printf(\ case 2:printf(\ case 3:printf(\ case 4:printf(\ case 5:printf(\ case 6:printf(\ case 7:printf(\ default:printf(\ } }

5.1输出一行星号 问题描述

编写程序在一行中输出 N 个星号。 输入

星号个数值N 输出

一行中N个星号 #include int main() { int N,i; scanf(\ for(i=1;i<=N;i++) { printf(\ } printf(\}

5.2 打印平行四边形 问题描述

输入图形的高 n ,输出如下例( n=5 ***** ***** ***** ***** ***** 输入

整数n例如 5 输出

由*组成的高为5的平行四边形 #include int main() { int N,i,j;

. )所示的图形 scanf(\ for(i=1;i<=N;i++) { for(j=1;j

5.3 编程计算 问题描述

编写程序,输入n的值,求 :1-1/2+1/3-1/4+1/5-1/6+1/7-...+1/n (保留四位小数) 输入 n的值 输出

上述算式的求和结果(结果保留四位小数) 输入样例 1

输出样例 sum=1.0000

#include int main() { int n,i,j,sign=-1;double f, sum=0; scanf(\ for(i=1;i<=n;i++) { f=1.0/i; sign=-sign; sum=sum+sign*f; }

printf(\ }

5.4 分数序列 问题描述

有一个分数序列:的和。 输入 整数n

,输入整数n,求出其前n项

输出

上述分数序列的前n项之和

提示:输出语句格式为 printf(\ 输入样例 1

输出样例

sum= 2.0000000000

#include int main() { int i,n,k;double f,sum=0,a=1.0,b=1.0; scanf(\ for(i=1;i<=n;i++) { k=a; a=b; b=a+k; f=b/a; sum=sum+f; }

printf(\ }

5.5 求e的值 问题描述

编写程序,从键盘输入整数 n , 求 e 的值。e=1+1/1!+1/2!+1/3!+..+1/n! double 型数据计算。 输入 整数n 输出 e的值

提示:输出语句printf(\ 输入样例 2

输出样例

e= 2.5000000000

#include void main() { int n,i,j;double k,f,sum=1; scanf(\ for(i=1;i<=n;i++) {

注意:用 for(j=1,k=1;j<=i;j++) k=k*j; f=1.0/k; sum=sum+f; }

printf(\ }

5.6 最大公约数 问题描述

输入两个正整数m和n,求它们的最大公约数和最小公倍数 输入

两个正整数m和n 输出

m和n的最大公约数和最小公倍数 输入样例 2 8 输出样例

the greatest common divisor is 2 the least common multiple is 8

#include int main() {

int m,n,r,t,M,N,a,b,c; scanf(\ if(m

while((r=m%n)!=0) { m=n; n=r;}

printf(\ M=a/n; N=b/n; c=M*N*n;

printf(\ return 0; }

5.7 水仙花数 问题描述

输出所有的水仙花数。所谓的水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33 输入 无 输出

所有的水仙花数 提示:输出语句printf(\

#include void main() { int i,a,b,c,d;

for(i=100;i<=999;i++) { a=i/100; b=(i0)/10; c=i; d=a*a*a+b*b*b+c*c*c; if(i==d) printf(\ } }

5.8 完数 问题描述

一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,且6=1+2+3,因此6是完数。 输入

一个正整数n 输出

判断n是否为完数。如果是,则输出Yes和它的所有因子;否则,输出No 输入样例 6

输出样例

Yes,its factors are 1 2 3

#include int main() { int a,i,sum=0; scanf(\ for(i=1;i

printf(\ for(i=1;i

5.9 素数 问题描述

输入两个正整数m和n,求出[m,n]区间的所有素数 输入

两个整数m和n 输出

[m,n]区间的所有素数 输入样例 2 10 输出样例 2 3 5 7

#include int main() { int m,n,i,j; scanf(\ for(i=m;i<=n;i++) { for(j=2;j

5.10 回文数 问题描述

输入一个正整数,判断是否为回文数。 输入

一个正整数n 输出

如果是,输出Yes,否则输出No 输入样例 12321

输出样例 Yes

#include int main() { int a,b,c; scanf(\ c=a; b=0; while(c>0) { b=b*10+(int)c; c=c/10; } if(a==b) printf(\ else printf(\}

5.11 贪吃的猴子 问题描述

有一只猴子,第一天摘了若干个桃子,当即吃了一半,但还觉得不过瘾,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。 输入 天数n 输出

第一天的桃子个数。提示:输出语句为

printf(\ 输入样例 5

输出样例

The monkey got 114 peachs in first day. 提示:

问题分析: 总共 t0 日吃掉剩余

1 t0/2+1 t0-(t0/2+1)=t0/2-1 t1=t0/2-1 =>t0=(t1+1)*2 2 t1/2+2 t1-(t1/2+2)=t1/2-2 t2=t1/2-2 =>t1=(t2+2)*2 ....

n-1 tn-2/2+(n-1) tn-2-(tn-2/2+(n-1))=tn-2/2-(n-1) tn-1=tn-2/2-(n-1) =>tn-2= (tn-1+n-1)*2 n 1 0 tn-1=1

#include

int main() { int n,i;double sum; scanf(\ i=n,sum=1; for(;i>1;i--) sum=(sum+(i-1))*2;

printf(\ return 0; }

5.12 马戏团观众人数

问题描述

一个马戏团表演, n 个座位全满,全部门票收入是 120 元,现在知道,男人每人 5 元,女人每人 2 元,小孩每人 1 角。根据总人数,计算出男人、女人和小孩各多少人。 输入

总人数 n 输出

男人、女人和小孩人数,若 n 人无法满足条件,则输出“No output\\n”

#include int main() { int n,x,y,z,tag=0; scanf(\ for(x=0;x<=n;x++) for(y=0;y<=n;y++) for(z=0;z<=n;z++) if(x+y+z==n&&50*x+20*y+1*z==1200) { tag=1; printf(\ } if(tag==0) printf(\ return 0; }

5.13 迭代法 问题描述 用迭代法求

。求平方根的迭代公式为:

要求前后两次求出的x的差的绝对值小于10-5。

输入 a 输出

的值

输入样例 4

输出样例

The square root of 4.00 is 2.00000

#include #include int main() { double i,a,sq,d; scanf(\ d=a; for(sq=1;;) { i=sq; sq=(sq+a/sq)/2; if(fabs(sq-i)<=0.00001) { printf(\ break; } } }

5.14 cos(x)-x=0

利用以下所示的简单迭代方法求方程:cos(x)-x=0的一个实根。 xn+1=cos(xn) 迭代步骤如下: (1)输入数据给x1;

(2)x0=x1,把x1的值赋给x0; (3)x1=cos(x0),求出一个新的x1;

(4)若x0-x1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2);

(5)所求x1就是方程cos(x)-x=0的一个实根,输出x1,输出语句为printf(\。 提示:本题x0和x1定义为double类型 #include #include int main()

{ double a,b,i; scanf(\ for(i=1;;) { a=b; b=cos(a); if(fabs(a-b)<=0.000001) { printf(\ break; } } }

5.15 求一个三位数,其值等于其各位阶乘之和 问题描述

编写程序,求某三位数,该数值的大小正好是组成这个数的三个位上的数字阶乘之和。 输入 无 输出

满足上述条件的三位数。提示:输出格式为printf(\

#include void main() { int a,b,c,d,i,j,k,l,x,y,z; for(i=100;i<1000;i++) { a=i/100;b=(i0)/10;c=i; for(j=1,x=1;j<=a;j++) x=x*j; for(k=1,y=1;k<=b;k++) y=y*k; for(l=1,z=1;l<=c;l++) z=z*l; if(x+y+z==i) printf(\ } }

6.1 谁能出线 背景:

电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。按规定,每10名学生为一个预赛小组,评委打出分数(0~100分),各小组第一名可以进入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。 输入:

按顺序给出一个小组10个人的最后得分(int)。

输出:

能够出线的学生序号(0~9)。 #include #define N 10 int main() { int i,max=0,j;int a[N]; for(i=0;i=max) max=a[i]; } for(j=0;j

6.2 统计素数的个数

求出 2 到 m 之间 ( 含 m,m<=1000) 所有素数并放在数组 a 中。 输入:正整数m

输出:从小到大的所有素数,及个数(素数输出的时候用M来控制) 如:

输入:10 输出:2 3 5 7 4

#include #define N 10 int main() { int i,j,m,count=0;int a[N]; scanf(\ for(i=2;i<=m;i++) { for(j=2;j

6.3 冒泡法排序

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。 编写程序,对输入的十个数按照从小到大排序 #include #define N 10 int main() { int i,j,t;int a[N]; for(j=0;j6.4 插入法排序

如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。

定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。 #include int main() { int i,j,n,m;int a[11]; for(i=0;i<10;i++) scanf(\ scanf(\ a[10]=n;

for(i=10;i>0;i--) if(a[i]

for(i=0;i<11;i++) { printf(\ } printf(\ return 0; }

6.5 求各位数字组成的最大数

任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。 输入:自然数 n

输出:各位数字组成的最大数

#include int main() { int i,j,n,count=0,t,m;int a[100]; scanf(\ for(i=0;n>0;i++) { m=n; a[i]=m; count++; n=n/10; } for(i=0;ia[j-1]) {

t=a[j-1]; a[j-1]=a[j]; a[j]=t; } for(i=0;i

printf(\ return 0; }

6.6 数组逆序输出 问题描述

从键盘上输入一个数组(10个元素),将原数组逆序重新排列后输出。要求输出每个元素时以一个空格隔开。 提示:

用第一个与最后一个交换。 #include #define N 10 int main() { int j;int a[N]; for(j=0;j

6.7 求最大值 问题描述

要求从键盘输入10个整型数据,找出其中的最大值并显示出来。 输入范例

3 0 54 -710 27 32767 10 1 500 2 输出范例 32767 提示

先假定第一个元素时最大值,然后和其他的元素一个一个的进行比较,直到找到最大值。 #include #define N 10 int main() { int j,t;int a[N]; for(j=0;j t=a[j]; a[j]=a[j+1]; a[j+1]=t; }

输入:

有n+1行(2 ≤n≤10),第一行是一个整数n,代表矩阵为n行n列。后面n行表示矩阵的取值 输出:

转置后的矩阵

#include int main() { int i,j,n;int a[100][100],b[100][100]; scanf(\ for(i=0;i

6.15求一系列整数中出现最多的数字

给定一系列整数,对每个整数的每一位数字统计0~9各个数字的出现次数,求出现次数最多的数字。 输入:

有两行,第一行是整数n(1<=n<=100),表示有n个整数;第二行是n个整数值 输出:

出现次数最多的数字d(如果d不唯一,要列出全部)及其出现的次数 输入样例: 1 1233

输出样例:

出现次数最多2次的数字是 3 #include int main() { int i,n,max;int a[100],b[10]={0}; scanf(\ for(i=0;i

scanf(\

while(a[i]>0) {

b[a[i]]++; a[i]=a[i]/10; } } max=b[0]; for(i=1;i<10;i++) if(max

printf(\出现次数最多%d次的数字是\ for(i=0;i<10;i++) if(max==b[i]) printf(\ printf(\ return 0; }

6.16 装箱问题

假设有n项物品,大小分别为s1,s2,...,sn,其中si是整数且满足:1<=si<=100。要把这些物品装入到容量为100的一批箱子(序号1~n)中。装箱方法是:对每项物品si,依次扫描所有这些箱子,把si放入足以能够容下它的第一个箱子中(first-fit策略)。写一个程序来模拟这个装箱的过程。 输入: 有两行。第一行是整数n(n<=1000),表示物品的个数;第二行是n个整数si(si<=100),分别表示n个物品的大小 输出:

每个物品所在的箱子序号,并输出所需的箱子数目 输入样例: 8

60 70 80 90 30 40 10 20 输出样例: 60 1 70 2 80 3 90 4 30 1 40 5 10 1 20 2

所需的箱子数目为5

#include int main()

{int u,s[1000]={0},b[1000]={0},i=0,j;

scanf(\ for(;i<=u-1;i++) scanf(\ for(i=0;i<=u-1;i++) { for(j=0;j<=1000;j++) { if(s[i]+b[j]<=100) { b[j]=s[i]+b[j]; printf(\ break; } else continue; } }

printf(\所需的箱子数目为\ for(i=0;i<=1000;i++) if(b[i]==0) { printf(\ break; }

return 0; }

7.1 数的合并

请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a的十位和个位依次存放在c数的十位和千位上,b的十位和个位依次存放在c数的个位和百位上。

例如:当a=45,b=12,调用该函数后,c=5241。 #include

void fun(int x,int y,int *p) { *p=(x)*1000+(y)*100+(x/10)*10+y/10; }

int main() {

int a,b,c;

scanf(\fun(a,b,&c);

printf(\}

7.2 数组中奇偶数

请编一个函数 fun(int *a,int n,int *odd,int *even) ,函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参 n 给了数组中数据的个数:利用指针 odd 返回奇数之和,利用指针 even 返回偶数之和。

例如:数组中的值依次为: 1 , 8 , 2 , 3 , 11 , 6 ;则利用指针 odd 返回奇数之和 15 ;利用指针 even 返回偶数之和 16 。 #include #define N 20

void fun(int a[],int n,int *odd,int *even) { int i; *odd=0;*even=0; for(i=0;i

int main() {

int a[N],i,n,odd,even; scanf(\ for(i=0;i

printf(\ printf(\ return 0; }

7.3 浮点数四舍五入

请编一个函数 void fun(double a,double *h) ,函数的功能是对变量 h 中的值保留 2 位小数,并对第三位进行四舍五入(规定 h 中的值为正数)。 例如: h 值为 8.32433 ,则函数返回 8.32 ; h 值为 8.32533 ,则函数返回 8.33 #include void fun(double a,double *h) { double i; i=(int)(a*100+0.5); *h=(i/100); }

int main( ) {

double a,h;

scanf(\ fun(a,&h);

printf(\ return 0;

}

7.4 字符移动

请编一个函数void fun(char *s) ,函数的功能是把字符串中所有的字符前移一个位置,串中的第一个字符移到最后。 例如:原有的字符串为: Mn.123xyZ ,则调用该函数后,串中的内容为: n.123xyZM 。 #include #define N 81 #include void fun(char *p) { int i,count=0;char j; j=p[0]; for(i=0;*(p+i)!='\\0';i++) { *(p+i)=*(p+i+1); count++; } *(p+count-1)=j; }

int main( ) {

char a[N]; gets(a);

fun(a);

printf(\ }

7.5 生成新数

给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。 例如,输入一个数:27638496,新的数:为739。 #include #include #include void fun(int *p) { int i,j,a,b,c[20],count=0,flag=-1; for(i=0;*p!=0;i++) { c[i]=*p;

*p=*p/10; count++; } *p=0; for(j=0;j

int main( ) {

int n=-1; while(n>99999999||n<0) {

scanf(\ } fun(&n);

printf(\ return 0; }

7.6 字符串转换成整数

请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数。例如,若输入字符串\则函数把它转换为整数值 -1234。函数fun中给出的语句仅供参考。 #include #include #include int fun(char *p) { int y; y=atof(p); return y; }

int main() {

char s[10]; int n; gets(s); n = fun(s); printf(\ return 0;

}

7.7 二维数组按列优先存放

请编写函数fun, 函数的功能是: 将M行N列的二维数组中的字符数据, 按列的顺序依次放到一个字符串中。

例如, 二维数组中的数据为: W W W W S S S S H H H H

则字符串中的内容应是: WSHWSHWSHWSH。 #include #define M 3 #define N 4

void fun(char p[][N],char q[]) { int i,j,count=0; for(j=0;j

for(i=0;i

int main() {

char a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}}; fun(w,a); puts(a); return 0; }

7.8 删除字符串中指定的星号

假定输入的字符串中只包含字母和 * 号。请编写函数 fun ,它的功能是:除了尾部的 * 号之外 , 将字符串中其它 * 号全部删除。在编写函数时,不得使用 C 语言提供的字符串函数。

例如,字符串中的内容为: ****A*BC*DEF*G******* ,删除后 , 字符串中的内容应当是: ABCDEFG******* 。 #include

void fun(char *s,char *p) { int i,count=0; for(i=0;s+i<=p;i++) if(*(s+i)!='*') { *(s+count)=*(s+i); count++;

}

for(s+i==p; *(s+i)!='\\0';i++) *(s+count++)=*(s+i); *(s+count)='\\0'; }

int main()

{ char s[81],*t; gets(s); t=s;

while(*t) t++; t--;

while(*t=='*') t--; fun( s , t ); puts(s); return 0; }

7.9 统计数字字符

请编写函数 fun ,它的功能是:统计形参 s 所指字符串中数字字符出现的次数,并存放在形参 t 所指的变量中,最后在主函数中输出。例如,字符串s为: abcdef35adgh3kjsdf7 。输出结果为: 4 。 #include void fun(char *p,int *q) { int i,count=0; for(i=0;*(p+i)!='\\0';i++) if(*(p+i)>='0'&&*(p+i)<='9') count++; *q=count; }

int main()

{ char s[80]=\ int t; gets(s); fun(s,&t);

printf(\ return 0; }

7.10 将两个串按要求形成一个新串 给定程序的函数 fun 的功能是:逐个比较 p 、 q 所指两个字符串对应位置中的字符,把 ASCII 值大或相等的字符依次存放到 c 所指数组中,形成一个新的字符串。

例如,若主函数中 a 字符串为: aBCDeFgH ,主函数中 b 字符串为:ABcd ,则 c 中的字符串应为: aBcdeFgH 。 #include

#include

void fun(char *p,char *q,char *c) { int i,count=0;char max; for(i=0;*(p+i)!='\\0';i++) { max=*(p+i); if(*(p+i)<*(q+i)) max=*(q+i); *(c+count)=max; count++; } if(strlen(q)>strlen(p)) for(i=count;*(q+i)!='\\0';i++) { *(c+count)=*(q+count); count++; } *(c+count)='\\0'; }

int main()

{ char a[10], b[10], c[80]; gets(a); gets(b); fun(a,b,c); puts(c); return 0; }

7.11 统计子串的个数

请编写函数 fun ,它的功能是:统计 substr 所指子字符串在 str 所指字符串中出现的次数。例如,若str中的字符串为 aaas lkaaas ,子字符串为 as ,则应输出 2 。 #include

void fun(char*str,char*substr,int*count) {

int i=0; *count=0;

for(;*str!=0;str++) {

for(i=0;*(substr+i)!=0;i++) if(*(substr+i)!=*(str+i)) break; if(*(substr+i)==0) (*count)++; }

}

int main() {

char str[80],substr[80]; int count; gets(str);

gets(substr);

fun(str,substr,&count); printf(\ return 0; }

7.12 按要求处理字符串

函数 fun 的功能是:将 s 所指字符串中除了下标为奇数、同时 ASCII 值也为奇数的字符之外,其余的所有字符都删除 , 串中剩余字符所形成的一个新串放在 t 所指的数组中。 例如,若 s 所指字符串中的内容为: \其中字符 A 的 ASCII 码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符 1 的 ASCII 码值为奇数,所在数组中的下标也为奇数 , 因此不应当删除,其它依此类推。最后 t 所指的数组中的内容应是: \。 #include #include void fun(char *s,char *t) {

int i,count=0;

for(i=0;*(s+i)!='\\0';i++)

if(i%2!=0&&*(s+i)%2!=0) {

*(t+count)=*(s+i); count++; }

*(t+count)='\\0'; }

int main() { char s[100], t[100]; scanf(\ fun(s, t); printf(\

return 0; }

7.13 求非偶数的除数

请编写函数 fun ,它的功能是:求出能整除形参 x 且不是偶数的各整数 , 并按从小到大的顺序放在 pp 所指的数组中 , 这些除数的个数通过形参 n 返回。 例如,若 x 中的值为 : 35 ,则有 4 个数符合要求,它们是 : 1, 5, 7, 35 。 #include

void fun(int x,int *aa,int *y) {

int i; *y=0;

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

if(x%i==0&&i%2!=0) {

*aa=i; aa++; (*y)++; } }

void main( )

{ int x, aa[1000], n, i ; scanf(\ fun(x, aa, &n ) ;

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

printf(\ printf(\}

7.14 求最大值及其下标 请编写函数 fun ,其功能是求出数组的最大元素在数组中的下标并存放在 k 所指的存储单元中。

例如 , 输入如下整数 : 876 675 896 101 301 401 980 431 451 777 则输出结果为 : 6, 980 #include

void fun(int *a,int m,int *k) {

int i; *k=0;

for(i=1;i

if(*(a+i)>*(a+*k)) *k=i; } }

void main( ) {

int a[10], k ,i;

for(i=0;i<10;i++) scanf(\ fun(a, 10, &k) ;

printf(\}

8.1 字符转换 描述

提取一个字符串中的所有数字字符(?0?...?9?)将其转换为一个整数输出。 输入

一个以回车符为结束标志的字符串(少于80个字符)。 输出

把字符串中的所有数字字符(?0?...?9?)转换为一个整数并输出。 # include int main() { char a[100]; int i,m=0,b[100],n=0; gets(a); for(i=0;a[i]!='\\0';i++) if(a[i]>='0'&&a[i]<='9') { b[n]=a[i]-'0'; n++;}

for(i=0;i

8.2合并字符串

输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。 输入:

两个已经排好顺序(升序)的两个字符串 输出:

一个合并在一起的有序(升序)的字符串 #include #include int main() {

char a[100],b[100];int i,j,k,t; gets(a); gets(b); strcat(a,b); k=strlen(a); for(j=1;j

for(i=0;i=a[i+1]) {

t=a[i];

a[i]=a[i+1]; a[i+1]=t; } puts(a); }

8.3 删除重复字符 背景:

输入一个长度不超过 100 的字符串,删除串中的重复字符。 输入:

输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。 输出:

删除重复字符后的字符串。例如:abced #include void main() {

char a[100]; int i,j,flag; gets(a);

for(i=1;a[i]!='\\0';i++) {

flag=1;

for(j=0;j

for(i=0;a[i]!='\\0';i++) if(a[i]!='0')

printf(\ printf(\ }

8.4 删除字符串中指定字符

输入两个字符串 s1 和 s2 ,在 s1 中删除任何 s2 中有的字符。例如, s1 :“ abc123ad ”, s2 :“ a1 ” ,则输出“bc23d ”。 输入:两个字符串 s1 和 s2 输出:删除后的字符串 s1 #include #include int main() { char s1[100],s2[100];int i,j,k,t; gets(s1); gets(s2); for(j=0;s1[j]!='\\0';j++) for(i=0;s2[i]!='\\0';i++) if(s1[j]==s2[i]) s1[j]='0'; for(i=0;s1[i]!='\\0';i++) if(s1[i]!='0') printf(\ printf(\}

8.5 单词有多少

用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词 \时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。 输入:多个字符串 输出:单词的数量 #include #include int main() { char str[100];int i,count=0; for(i=0;;i++) { scanf(\ count++; if(strcmp(str,\ break; } printf(\}

8.6 在指定位置插入字符串

输入两个字符串 s1 、 s2 和 s1 中任意字符 k ,在 s1 中的指定字符 k 第一次出现的位置处插入字符串 s2 并输出。

输入:两个字符串 s1 、 s2 和 s1 中任意字符 k 输出:插入后的字符串 s1

#include #include int main() { char k,s1[100],s2[100],s3[100],s4[100];int i,m,n,c=-1; gets(s1); gets(s2); scanf(\ for(i=0;s1[i]!='\\0';i++) { c++; if(s1[i]==k) break; } m=strlen(s2); n=strlen(s1);

for(i=0; i

for(i=c; i

for(i=c+m; i<=m+n; i++) s3[i]=s1[i-m]; puts(s3); }

8.7 Your Ride Is Here

It is a well-known fact that behind every good comet is a UFO. These UFOs often come to collect loyal supporters from here on Earth. Unfortunately, they only have room to pick up one group of followers on each trip. They do, however, let the groups know ahead of time which will be picked up for each comet by a clever scheme: they pick a name for the comet which, along with the name of the group, can be used to determine if it is a particular group's turn to go (who do you think names the

comets?). The details of the matching scheme are given below; your job is to write a program which takes the names of a group and a comet and then determines whether the group should go with the UFO behind that comet.

Both the name of the group and the name of the comet are converted into a number in the following manner: the final number is just the product of all the letters in the name, where \* 1 * 3 * 15 = 17955. If the group's number mod 47 is the same as the comet's number mod 47, then you need to tell the group to get ready! (Remember that \the remainder left over after dividing a by b; 34 mod 10 is 4.)

Write a program which reads in the name of the comet and the name of the group and figures out whether according to the above scheme the names are a match, printing \

comets will be a string of capital letters with no spaces or punctuation, up to 6 characters long. INPUT FORMAT

Line 1: An upper case character string of length 1..6 that is the name of the comet. Line 2: An upper case character string of length 1..6 that is the name of the group.

OUTPUT FORMAT

A single line containing either the word \#include #include int main() { char s1[7],s2[7];int i,j=1,k=1; gets(s1); gets(s2);

for(i=0;s1[i]!='\\0';i++) { s1[i]=s1[i]-'A'+1; j=s1[i]*j; }

for(i=0;s2[i]!='\\0';i++) {

s2[i]=s2[i]-'A'+1; k=k*s2[i]; } if(jG==kG) printf(\ else printf(\}

8.8大数相加 问题描述:

编写C程序,它能以字符串形式读入两个无符号正整数m和n,计算并输出这两个整数之和

输入格式:

输入由两行组成,第一行为无符号整数m,第二行为无符号整数n,且m和n的值最长25位 输出格式:

输出为一行,即两个无符号整数m和n之和 输入样例: 9999888888 355729288 输出样例: 10355618176

#include #include #include int main() {

int i,j,k,t,a[27]={0},b[27]={0},c[27]={0}; char m[26],n[26]; gets(m); gets(n);

i=strlen(m); j=strlen(n);

for(k=i-1,t=0;k>=0;k--,t++) a[t]=m[k]-'0';

for(k=j-1,t=0;k>=0;k--,t++) b[t]=n[k]-'0'; for(k=0;k<=26;k++) {

c[k]=c[k]+a[k]+b[k]; if(c[k]>=10) {

c[k]=c[k]-10; c[k+1]=1; } }

for(k=26;k>=0;k--) if(c[k]>0)break; for(k=k;k>=0;k--) printf(\ printf(\ return 0; }

8.9 字符串重排列

判断一个字符串是否可以由另一个字符串通过重排字符而得到。注意,此处区分字符大小写! 输入

输入只有一行,为两个字符串,字符串之间以一个空格分隔。 输出

如果两个字符串由同一组字符组成(且每一个字符出现次数相同),则输出“YES”; 否则输出“NO”。注意YES和NO都是大写字母! #include int main() { int i,j,flag=0,count=0;char a[10],b[10];

}

scanf(\for(i=0;a[i]!='\\0';i++) count++;

for(i=0;a[i]!='\\0';i++) for(j=0;b[j]!='\\0';j++) if(a[i]==b[j]||a[i]==b[j]+'a'-'A'||a[i]+'a'-'A'==b[j]) { flag++; b[j]='0'; break; }

if(flag==count) printf(\else printf(\

8.10上课啦!要点名啊!

小凡的老师每次上课前都要点名,但是这样就浪费了老师的上课时间。所以老师让小凡来完成点名,让小凡在早自习的时候就点好名。老师给了小凡名单,小凡只要照着名单点名就好了是不是很简单啊。 输入

输入有多组数据,直到文件结束。每组测试数据有三行,第一行为两个整数m, n(50 >= m >= n)。第二行有m个名字,名字之间用空格隔开,是小凡班上同学的名单。后面有n个名字是来上课的同学。名字间用空格隔开。名字的长度不超过20个字符。 输出

按照第一行的名单,每个人对应输出是否到了。到的人输出Yes,没到的人输出No。 #include int main() {

int m,n,i,j;

char a[51][21],b[51][21]; scanf(\ for(i=0;i

scanf(\ for(i=0;i

for(j=0;j

if(strcmp(a[i],b[j])==0) {

printf(\ break;

} }

if(j==n)printf(\ } }

8.11找第一个只出现一次的字符 问题描述:

给定t个字符串,这个字符串只可能由26个小写字母组成,请你找到第一个仅出现一次的字符,如果没有符合要求的字符,就输出no。 输入:

第一行是t,接下来是t个字符串,每个字符串长度小于100 输出:

你的输出需要由t行组成。

对于每个字符串,输出第一个仅出现一次的字符,没有输出NO。 输入样例: 2 aabb abcdab 输出样例: NO c

#include #include int main() {

int i,j,t,k,l;

char a[1000][100],c; scanf(\ for(i=0;i

scanf(\ for(i=0;i

k=strlen(a[i]); a[i][k]='0'; a[i][k+1]='\\0'; for(j=0;j

for(l=0;l

if(l==j)

l++;

if(a[i][j]==a[i][l])break; }

if(l==k+1) {

c=a[i][j]; putchar(c); putchar('\\n'); break; } }

if(j==k+1)printf(\ } }

8.12 提取数据

输入一个字符串,长度不超过30,内有数字字符和非数字字符,统计其中包含了多少个非负整数,并输出这样的非负整数。 关于输入

一个字符串,最大长度为30 关于输出

输出字符串中包含的数据,一个数据一行. (不用输出总数) #include #include int main() {

int i,j,k,b[30]={0},c[30]={0}; char d[31]; gets(d); j=strlen(d);

for(i=0;d[i]!='\\0';i++) {

if(d[i]<='9'&&d[i]>='0') {

b[i]=1; k=d[i]-'0'; c[i]=k; }

if(d[i]=='-')b[i]=2; } i=0;

if(b[0]==1) {

for(;b[i]!=0&&b[i]!=2;i++) printf(\printf(\}

for(;i

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

Top