中国石油大学中国石油大学(华东)C语言编程练习题及答案全集
1.1 Hello world.
让我们用C语言向世界问好。
最早的程序基本是这个样子的:
程序一:
#include
void main()
{
printf("Hello world.\n");
}
程序二:
#include
int main()
{
printf("Hello world.\n");
return 0;
}
上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。
输...
中国石油大学(华东)C语言编程练习
及答案全集
1.1 Hello world.
让我们用C语言向世界问好。
最早的程序基本是这个样子的:
程序一:
#include
void main()
{
printf("Hello world.\n");
}
程序二:
#include
int main()
{
printf("Hello world.\n");
return 0;
}
上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。
输入:无
输出:Hello world.
#include
int main()
{
printf("Hello world.\n");
}
1.2 Welcome to Beijing.
让我们来练习如何显示多行文字。
输入:无
输出:就是下面的那段文字。
#include
void main()
{printf("Welcome\n");
printf("to\n");
printf("Beijing.\n");
}
1.3 练习最简单的printf和scanf
printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。
输入:整型变量x的值。
输出:输出整型变量x对应的十进制、八进制和十六进制形式。
认真观察-1的八进制和十六进制输出,请想想是为什么。
#include
int main()
{int x;
scanf("%d",&x);
printf("x=%d,",x);
printf("x=%o,",x);
printf("x=%x\n",x);
return 0;
}
1.4 练习两个整数之间的运算
背景:基本练习。
输入:接受两个整数,每个数之间使用空格分隔。例如输入格式为:123 444
输出:分别输出进行+、-、*、/、*之后的运行结果。
#include
int main()
{int x,y;
scanf("%d%d",&x,&y);
printf("%d+%d=%d\n",x,y,x+y);
printf("%d-%d=%d\n",x,y,x-y);
printf("%d*%d=%d\n",x,y,x*y);
printf("%d/%d=%d\n",x,y,x/y);
printf("%d%%%d=%d\n",x,y,x%y);
return 0;
}
1.5 学习打印你的第一个图形
背景:我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。
程序如下:
#include
int main()
{
printf("****\n");
printf("****\n");
printf("****\n");
printf("****\n");
return 0;
}
要求:按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。
输入:无。
输出:指定图形。
#include
int main()
{
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
printf("*******\n");
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("%d",&N);
if(N<=16)
{for (i=1;i<=N;i++)
sum=sum*i;
printf("%d\n",sum);
}
if(N>=17)
printf("N is too big!\n");
}
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("%f%f",&x,&eps);
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("%f\n",sin(x));
system("PAUSE");
return 0;
}
2.3 判断输入的字符的类型
我们将字符分为五类:大写字母、小写字母、数字、控制字符、其他字符。
编写程序,从键盘输入一个字符,输出字符所属的类型:大写字母时输出capital letters, 小写字母时输出small letters,数字是输出figures,其他字符时输出 others。
#include
void main()
{
char c;
c = getchar ( );
if (c < 0x20)
printf ("The character is a control character\n");
else if (c >= '0' && c <= '9')
printf ("figures\n");
else if (c >= 'A' && c <= 'Z')
printf ("capital letters\n");
else if (c >= 'a' && c <= 'z')
printf ("small letters\n");
else
printf ("others\n");
}
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("%d",&x);
x1=x/50;
x2=x%50/10;
x3=x%50%10/5;
x4=x%50%10%5/2;
x5=x%50%10%5%2/1;
printf("%d\n",x1);
printf("%d\n",x2);
printf("%d\n",x3);
printf("%d\n",x4);
printf("%d\n",x5);
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 "stdio.h"
#include "math.h"
int main()
{
int h,m;
double angle;
scanf("%d%d",&h,&m);
angle=fabs(5.5*m-30*h);
if(angle>180)
angle=360-angle;
printf("At %d:%02d the angle is %.1f degrees.\n",h,m,angle);
}
3.3 照猫画猫:计算圆柱的侧面积及体积
如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2πrh ,体积 v=π r 2 h 。其中 π=3.1415926
输入 第一行输入圆柱的底面半径 r
第二行输入圆柱的高 h
输出 s=< 圆柱的侧面积 >,v=< 圆柱的体积 >
要求 1. 所有变量都定义为双精度类型
2. 结果精确到小数点后两位
#include "stdio.h"
#define n 3.1415926
int main()
{
float r,h,s,v;
printf;
scanf("%f%f",&r,&h);
s=2*n*r*h;
v=n*r*r*h;
printf("s=%6.2f,v=%6.2f\n",s,v);
}
3.4 分离整数
任意从键盘上输入一个三位正整数,要求正确地分离出它的个位、十位和百位,并分别在屏幕上输出。
比如输入的三位正整数
#include "stdio.h"
int main()
{
int x,hundreds,tens,units;
printf;
scanf("%d",&x);
hundreds=x/100;
tens=x%100/10;
units=x%100%10;
printf("units=%d,tens=%d,hndreds=%d\n",units,tens,hundreds);
}
3.5 鸡兔同笼
已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只?
输入:头和脚的数目
输出:兔子和鸡的数目(输出语句为:printf("rabbit=%d,chicken=%d",rabbit,chicken);)
Sample
输入:10 20
输出:rabbit=0,chicken=10
#include "stdio.h"
int main()
{
int chicken,rabbit,f,h;
scanf("%d%d",&h,&f);
rabbit=(f-2*h)/2;
chicken=(4*h-f)/2;
printf("rabbit=%d,chicken=%d\n",rabbit,chicken);
}
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("%d",&lx);
if(lx==1){
scanf("%lf",&f);
c=(f-32)*5/9;
printf("The Centigrade is %.2f\n",c);
}
else{
scanf("%lf",&c);
f=(c*9/5)+32;
printf("The Fahrenheit is %.2f\n",f);
}
}
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("%d",&x);
if(x<6)
y=x-12;
else if(x<15)
y=3*x-1;
else
y=5*x+9;
printf("%d\n",y);
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];//存放各个位的数
int i;
scanf("%ld", &input_num);
if (input_num < 0 || input_num > 99999) {
printf("Invalid input\n");
exit(1);
}
for( bit_count = 0; input_num; ++bit_count) {
result[bit_count] = input_num % 10;
input_num /= 10;
}
printf("%d\n",bit_count);
for(i = 0; i < bit_count; ++i)
printf("%d",result[i]);
printf("\n");
exit(0);
}
4.4 四位数拆分
输入一个四位数,判断千位、百位、十位和个位数字之和是否为数,如果是,输出Yes,如果不是,输出No;如果不是四位数,输出Invalid data。
#include
void main()
{
int x,a,b,c,d,e;
scanf("%d",&x);
if(x/1000<1||x/10000>=1)
printf("Invalid data\n");
else {
a=x/1000;
b=x%1000/100;
c=x%1000%100/10;
d=x%1000%100%10;
e=(a+b+c+d)%2;
if(e==0)
printf("Yes\n");
else
printf("No\n");
}
}
4.5 磨磨你的砍柴刀:判断三角形的形状
要求:输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。
输入:三角型的3条边的长度(int型)。
输出:等边三角形:equilateral triangle.
等腰三角形:isoceles triangle.
不构成三角形:non-triangle.
一般三角形:triangle.
#include
void main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
if(a+b’。输入其他字符时原样输出。 友情提示:整数之间运算的结果要取整,例如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("\n");
}
4.7 判断某年某月的天数
一年有365天,有的月份有31天,有的有30天,2月份闰年的时候是2天,非闰年的时候是28天。现在要求从键盘上输入一个年份和月份,输出其对应的天数。
#include
main()
{ int year,month,days;
scanf("%d %d", &year,&month);
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("%d\n",days);
}
4.8 花多少钱买衣服
周末商场促销呢,某品牌服装既可以买套装,也可以买单件。若买的不少于50套,每套80元;不足50套的每套90元,只买上衣每件60元,只买裤子每条45元。编写程序,输入计划购买的上衣数量 a 和裤子的数量 b ,计算并输出应该付的款 m 。
#include
void main()
{
int a,b,y;
scanf("%d%d",&a,&b);
if(b<=a&&b<50)
y=90*b+(a-b)*60;
if(b<=a&&b>=50)
y=80*b+(a-b)*60;
if(a=50)
y=80*a+(b-a)*45;
printf("%d\n",y);
}
4.9 到邮局去寄包裹
你去邮局给朋友寄礼物。发现邮局对邮寄包裹的费用是这样规定的:果包裹长宽高任意一个尺寸超过1米,或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收手续费 0.2 元,不同重量的邮资按下表计算: 重量(千克)
收费标准(元)
小于10
0 . 80
大于等于10但不超过20
0 . 75
大于等于20但不超过30
0 . 70
编写程序,输入包裹的长、宽、高尺寸和重量,输出所需的邮资(输出结果中包含两位小数即可),超出尺寸或重量的输出 "Error” .
#include
void main()
{
float a,b,c,m,y;
scanf("%f,%f,%f,%f",&a,&b,&c,&m);
if(a>1||b>1||c>1||m>30)
printf("Error\n");
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("%.2f\n",y);
}
}
4.10 输出星期几的英文表示
输入用数字(1--7)表示的星期几,输出星期几的英文表示,输入的数字有误,输出单词"Error(回车)"。
#include
void main()
{
int a;
scanf("%d",&a);
switch((int)(a))
{
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");break;
default:printf("Error\n");
}
}
5.1 输出一行星号
编写程序在一行中输出 N 个星号。
输入: N值
输出: 一行中N个星号
#include
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i
void main()
{ int n,m,i,d;
char p,t;
scanf("%d,%c",&n,&p);
for(m=0;m0)。
输出:打印相应的空心倒三角形。图样参见测试用例
#include
#include
int main()
{int h,i,j,k,m,n;
scanf("%d",&h);
if((h>1)&&(h%2!=0))
{
for(i=1; i<=(2*h-1); i++)
{
printf("*");
}
printf("\n");
for(j=1; j<=(h-2); j++)
{
for(k=1; k<=j; k++)
{
printf(" ");
}
printf("*");
for(m=1; m<=(2*h-3-2*j); m++;
{
printf(" ");
}
printf("*");
printf("\n");
}
for(n=1;n<=(h-1);n++)
{
printf(" ");
}
printf("*\n");
}
else
printf("Invalid input\n");
return 0;
}
选做 5.4 打印实心正方形
5.1题中你已经打印了一行*号,这次在屏幕上输出一个由星号组成的 n 行 n 列的正方形。
程序输入 n 值,输出如下例( n=4 )所示的高和上底均为 n 的正方形:
****
****
****
****
#include
#include
int main()
{
int a=1,n,b;
scanf("%d",&n);
while(a<=n)
{
b=1;
do
{
printf("*");
b++;
}
while(b<=n);
printf("\n");
a++;
}
return 0;
}
选做 5.5 空心字符菱形
输入:菱型起始字母和菱形的高度。
输出:参看测试用例,打印空心的由字符组成的菱形。
#include
#include
int main()
{
char ch;
int n,a=1,b,c;
scanf("%c %d",&ch,&n);
while(a<=n)
{
b=1;
while(b<=n-a)
{
printf(" ");
b++;
}
printf("%c",ch);
c=1;
if(a>=2)
{
while(c<=2*a-3)
{
printf(" ");
c++;
}
printf("%c",ch);
}
ch=ch+1;
printf("\n");
a++;
}
a=1; ch=ch-2;
while(a<=n-1)
{
b=1;
while(b<=a)
{
printf(" ");
b++;
}
printf("%c",ch);
c=1;
if(a<=n-2)
{
while(c<=2*n-2*a-3)
{
printf(" ");
c++;
}
printf("%c",ch);
}
ch=ch-1;
printf("\n");
a++;
}
return 0;
}
选做 5.6 输出一个字母K吧!
输入一个整数n,输出图形K。如n=4时,输出如下图形
* *
* *
* *
*
* *
* *
* *
#include
#include
int main()
{
int n,i=1,j;
scanf("%d",&n);
while(i<=n-1)
{
j=1;
printf("*");
while(j<=n-i)
{
printf(" ");
j++;
}
printf("*\n");
i++;
}
rintf("*\n");
i=1;
while(i<=n-1)
{
j=1;
printf("*");
while(j<=i)
{
printf(" ");
j++;
}
printf("*\n");
i++;
}
return 0;
}
选做 5.7 输出X图形
输入 n 值,输出下例( n=3 )所示的图形:
* *
* *
*
* *
* *
输入:整数n(例如3)
输出:如上图所示X 形图形
#include
#include
int main()
{
int n,i=1,j,k;
scanf("%d",&n);
while(i<=n-1)
{
j=1;
while(j<=i-1)
{
printf(" ");
j++;
}
printf("*");
k=1;
while(k<=2*n-2*i-1)
{
printf(" ");
k++;
}
printf("*");
j=1;
while(j<=i-1)
{
printf(" ");
j++;
}
printf("\n");
i++;
}
i=1;
while(i<=n-1)
{
printf(" ");
i++;
}
printf("*");
i=1;
while(i<=n-1)
{
printf(" ");
i++;
}
printf("\n");
i=1;
while(i<=n-1)
{
j=1;
while(j<=n-i-1)
{
printf(" ");
j++;
}
printf("*");
k=1;
while(k<=2*i-1)
{
printf(" ");
k++;
}
printf("*");
j=1;
while(j<=n-i-1)
{
printf(" ");
j++;
}
printf("\n");
i++;
}
return 0;
}
选做 5.8 输出图形
编程,输入 n 值,输出下例( n=5 )所示的高为 n 的图形 :
#include
#include
int main()
{
int n,i=1,j,k,l;
scanf("%d",&n);
while(i<=n-1)
{
j=1;
while(j<=i)
{
printf("*");
j++;
}
k=1;
while(k<=2*n-2*i-1)
{
printf(" ");
k++;
}
l=1;
while(l<=i)
{
printf("*");
l++;
}
printf("\n");
i++;
}
i=1;
while(i<=2*n-1)
{
printf("*");
i++;
}
printf("\n");
return 0;
}
选做 5.9 画个空心的梯形吧
编程,输入 n ,输出如下例( n=5 )所示的 高和上底均为 n 的等腰空心梯形。
#include
#include
int main()
{
int n,i=1,j,k;
scanf("%d",&n);
while(i<=n)
{
j=1;
while(j<=n-i)
{
printf(" ");
j++;
}
printf("*");
if(i==1)
{
for(k=1; k<=n-2; k++)
printf("*");
}
else if(i==n)
{
for(k=1; k<=3*n-4; k++)
printf("*");
}
else
{
for(k=1; k<=n+2*i-4; k++)
printf(" ");
}
printf("*");
j=1;
while(j<=n-i)
{
printf(" ");
j++;
}
printf("\n");
i++;
}
return 0;
}
选做 5.10 输出菱形图案
输入 n ,输出如下例( n=3 )所示的菱形:
*
***
*****
***
*
#include
#include
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
for(j=1; j<=n-i; j++)
{
printf(" ");
}
for(k=1; k<=2*i-1; k++)
{
printf("*");
}
printf("\n");
}
for(i=1; i<=n-1; i++)
{
for(j=1; j<=i; j++)
{
printf(" ");
}
for(k=1; k<=2*n-2*i-1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
5.11 最大公约数
输入两个正整数m和n,求它们的最大公约数和最小公倍数
比如,输入m和n的值分别为14和21,则最大公约数为7,最小公倍数为42。
#include
void main()
{
int m,n,i,j;
scanf("%d%d",&m,&n);
for(i=m;i>=1;i--)
{
if (n%i==0&&m%i==0)
{printf("the greatest common divisor is %d\n",i); break;
}
}
for (j=m;;j++)
{
if (j%m==0&&j%n==0)
{printf("the least common multiple is %d\n",j); break;
}
}
}
5.12 水仙花数
输出所有的水仙花数。所谓的水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33
输出语句:printf("%d\n",n);
#include
void main()
{
int n, i, j, k;
for(n=100; n<=999; n=n+1)
{
i = n/100; // 取出n的百位数
j = (n/10)%10; // 取数n的十位数
k = n%10; // 取出n的个位数
if(n==i*i*i+j*j*j+k*k*k)
printf("%d\n",n);
}
}
5.13 完数
一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,且6=1+2+3,因此6是完数,从键盘上输入一个正整数,判断其是否为完数。如果是,则按照如下格式输出。比如,输入6,则输出Yes,its factors are 1 2 3;如果输入8,则输出No
#include
#include
int main()
{
int n,i,c,sum=0;
scanf("%d",&n);
for(i=1;i
#include
void main()
{int m,n,i,j,k;
scanf("%d%d",&m,&n);
for(i=m;ik)
printf(" %d",i);
}
printf("\n");
}
5.15 找出最大素数
素数是指一个只能被1和它本身整除的数,在数论中占有重要的研究地位,在当代密码学中也被广泛应用。
输入:取值范围
输出:该范围内的最大素数
#include
int main()
{
int a,i,j;
scanf("%d",&a);
for(i=a;i>1;i--)
{
for(j=2;j
本文档为【中国石油大学】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。