资源描述
习题1
1-1 简述什么是一般意义上的程序?什么是计算机程序?
答:通常指完成某项工作的一整套活动过程及活动方式。
计算机程序就是为使计算机执行一个或多个操作,或执行某一任务,按序设计的计算机指令的集合。
1-2 简述程序设计的步骤与方法。
答:
(1)问题分析:一般来说程序要解决的是一个具体的问题,所以程序设计人员需要具体问题具体分析,在把任务交给计算机处理之前必须对问题做出明确的分析与定义,确定问题的条件及期望的结果,找出解决问题的规律。
(2)算法设计:算法是解决问题的步骤及其描述,是程序设计的核心内容。算法是根据问题分析中的具体要求而设计的,是对问题处理过程的进一步细化。
(3)程序编码:编码就是使用计算机编程语言编写源程序代码的过程。
(4)调试运行:指在计算机上调试程序。调试运行程序有两个目的:一是消除由于疏忽而引起的语法错误或逻辑错误等;二是用各种可能的输入数据对程序进行测试,验证程序是否对各种合理的数据都能得到正确的结果,而对不合理的数据也能做适当的处理。
(5)文档编制:指整理并写出文字材料。文档包括程序说明文件和用户操作手册。
1-3 简述结构化程序的主要特点。
答:
①只有一个入口;
②只有一个出口;
③不包含死循环(永远都执行不完的循环);
④不包含死语句(永远也执行不到的语句)。
⑤自顶向下,逐步求精,模块化设计,结构化编码。
1-4 简述结构化程序设计思想。
答:(1)结构化编码
为了使程序具有良好的设计风格,编程时应使用以下三种控制结构进行编程:
①顺序结构:顺序结构用来控制一个操作序列,从开始到结束顺序执行;
②选择结构:根据条件判定的结果去执行不同分支中的语句。选择结构也称为分支结构,其为程序按不同情况自动选择步骤提供控制手段;
③循环结构:根据条件判定的结果决定是否重复多次执行或者一次也不执行同一组步骤。循环结构也被称为重复结构,其为程序描述重复操作提供了控制手段。
(2)结构化程序的特点
①只有一个入口;
②只有一个出口;
③不包含死循环(永远都执行不完的循环);
④不包含死语句(永远也执行不到的语句)。
(3)结构化程序的分析方法
结构化程序设计对问题采取所谓的“自顶向下,逐步求精”的方法进行分析。
(4)模块化设计
模块化设计采取分治策略,将一个复杂的任务划分成若干基本模块,然后再对每一个模块进行具体化,逐步细化出一个个功能独立的模块。最下层模块完成最具体的功能。每一个模块都遵循高聚合性、低耦合性的分解原则。
1-5 简述算法的概念以及特点。
答:算法是指为解决某个特定问题而采取的方法和步骤。这里所说的算法一般是指用计算机解决问题的方法和步骤,即计算机算法。
一个算法的设计具备如下特点:
(1)有穷性。它包含两个方面:一方面是指一个算法应在有限的操作步骤内完成;另一方面是指算法操作应在有限的时间范围内完成;
(2)确定性。算法中的每一个步骤都是确定的,即不能有二义性,这样才能确保对于同一个算法,相同的输入必然得出相同的执行结果;
(3)有零个或多个输入。输入是指算法所需要的外部信息。在计算机上实现的算法,是用来处理数据对象的,在大多数情况下这些数据对象需要通过输入来得到;
(4)有一个或多个输出。算法是有目的的操作,算法的目的是为了求解,这些解只有通过输出才能得到。没有输出的算法是没有意义的;
(5)有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。
1-6 算法的描述方法有哪些?
答:对算法的描述有自然语言、流程图、N-S图、伪代码等表示方法。
(1)自然语言
自然语言即人们日常生活中使用的语言。使用自然语言描述算法,通俗易懂,初学者容易掌握。
(2)流程图
流程图是一种被广泛使用的算法描述方法,它用一些图框和流程线来表示各种类型的操作。
(3)N-S图
这种流程图中完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。
(4)伪代码
伪代码是一种近似高级语言但又不受语法约束的一种语言描述方式,它用一种介于自然语言和程序设计语言之间的文字和符号来描述算法,用一行或几行表示一个基本操作。它书写方便,格式紧凑,便于编码实现。
1-7 用流程图表示求解n!。
开始始
答:
输入n
i=1,p=1
i<=n
N
p=p*i
i=i+1
y
输出p
结 束
1-8 用N-S图表示求解1~100的累加和。
答:
i=1 sum=0
i≤100
sum=sum+i
i=i+1
输出sum
1-9 一个C语言程序的基本结构是什么?
答:
(1)函数是C语言程序的基本单位
C程序是由函数构成的,一个C语言程序必须有且仅有一个用main作为名字的函数,这个函数通常被称为主函数。
(2)函数由函数首部和函数体两部分组成
1) 函数首部就是每个函数在定义或声明时的第一行,它包括函数名、函数类型、形参名、形参类型的说明。
2) 函数体由函数首部下面最外层的一对大花括号中的内容组成,它可以包括变量声明和所调用函数的声明,还可以包括若干执行语句,声明部分可以看作是对函数中“对象”的描述,执行语句是对函数所要实现的“动作”的描述。
1-10 C语言程序的执行过程是什么?
答:
(1) 编辑:编辑是用户把编写好的C语言源程序输入计算机,并以文本文件的形式存放在磁盘上。其标识为:“文件名.c”。
(2) 编译:编译是把C语言源程序翻译成用机器语言表示的目标文件。目标程序的文件标识是:“文件名.obj”。
(3)连接:程序连接过程是用系统提供的连接程序(也称链接程序或装配程序)将目标程序、库函数或其他目标程序连接装配成可执行的目标程序。可执行程序的文件名为:“文件名.exe”,扩展名“exe”是可执行程序的文件类型标识。
(4)执行:执行程序是指将可执行的目标程序投入运行,以获取程序处理的结果。如果程序运行结果不正确,可重新回到第一步,重新对程序进行编辑修改、编译和运行。
1-11 编写一个程序,在屏幕上输出以下图形。
**********
**********
**********
**********
答:
int main()
{
printf(“**********”);
printf(“**********”);
printf(“**********”);
printf(“**********”);
return 0;
}
1-12 编程在屏幕上输出以下信息。
******************************
* A wonderful C program! *
******************************
答:
int main()
{
printf(“******************************”);
printf(“* A wonderful C program! *”);
printf(“******************************”);
return 0;
}
1-13上机运行本章的例1-6、例1-7,熟悉所用系统的上机方法和步骤。
答:答案略
2-1为什么C语言的字符型数据可以进行数值运算?
答:在C语言中,字符型数据在内存中是以二进制形式存放的,并不是真正的把一个字符存进内存里。在对字符型数据进行相加减运算的时候,系统首先将char型数据转化成int型数据再进行相加减运算。由字符型数据在内存的存储方式来看,字符型数据是可以进行数值运算的,对字符型数据做数值运算实际上就是对字符本身对应的ASSIC码进行相应的数值运算。
2-2简述字符'a'的特点。
答:'a'是字符常量。(1)字符常量由单引号括起来。(2)字符常量只能是单个字符。(3) 可以把一个字符常量赋予一个字符变量。(4)字符常量占一个字节的内存空间。
2-3标识符在命名时,应注意哪几个方面?
答:(1)在标识符中,大小写字母是有区别的。(2)ANSI C 标准没有规定标示符的长度,,但是各个版本的C语言编译系统都有自己的规定。(3)标识符虽然可以由程序员随意定义,但标识符是用于标识某个量的符号。(4)C语言规定,用户选取的标识符不能是C语言规定的保留字。
2-4 程序中int m=12; m=15;为什么整型变量m的值在运算后不是当初的12,而是15?
答:语句int m=12;在程序编译后,m的值是12。语句m=15;中“=”是赋值号,将新的值15赋给了m,新的值15把旧的值12覆盖了,所以m的值是15。
2-5已知:int i,a;执行语句“i=(a=2*3,a*5),a+6;”后,变量i的值是多少?
答:变量i的值是30。
2-6 已知:int x,a;执行语句“a=(x=1,x++,x+2);”后,变量a、x的值分别是多少?
答:a的值是4,x的值是2。
2-7 求下面算术表达式的值。
(1)x+a%3*(int)(x+y)%2/4 (设x=2.5,a=7,y=4.7) 答:2.5
(2)(float)(a+b)/2+(int)x%(int)y (设a=2,b=3,x=3.5,y=2.5) 答:3.5
2-8 代数表达式的C语言算术表达式如何写?
答:#define PI 3.14159
sqrt((sin(PI/180*30)+1)/cos(x))
第3章习题答案
3-1
顺序结构、选择结构和循环结构
3-2
表达式语句、复合语句、空语句、程序控制语句及函数调用语句
3-3
有符号的十进制形式整型数据,无符号的十进制形式整型数据,无符号的八进制形式整型数据,无符号的十六进制形式整型数据,单个字符数据,字符串数据,实型数据。
3-4
scanf(),getchar()等。
3-5
#include <stdio.h>
int main()
{
float p,k;
printf("请输入单位为磅的重量数:\n");
scanf("%f",&p);
k=0.4535924*p;
printf("对应的千克数为:%.3f\n",k);
return 0;
}
3-6
#include <stdio.h>
int main()
{
float a,b,c,sum,average;
printf("请输入高数成绩:\n");
scanf("%f",&a);
printf("请输入英语成绩:\n");
scanf("%f",&b);
printf("请输入计算机成绩:\n");
scanf("%f",&c);
sum=a+b+c;
printf("总成绩为sum=%f\n",sum);
average=sum/3;
printf("平均成绩为average=%.2f\n",average);
return 0;
}
3-7
#include <stdio.h>
#define PI 3.1415926
int main()
{
float r,S,V;
printf("请输入球的半径(厘米):\n");
scanf("%f",&r);
S=4*PI*r*r;
printf("球的表面积是S=%.2f平方厘米\n",S);
V=PI*r*r*r*4/3;
printf("球的体积是V=%.2f立方厘米\n",V);
return 0;
}
3-8
#include <stdio.h>
#include <math.h>
int main()
{
int y;
float p;
printf("请输入2016年后的某一年:");
scanf("%d",&y);
p=1500*pow((1+0.1),(y-2016));
printf("生产总值是:%f万元\n",p);
return 0;
}
3-9
#include <stdio.h>
int main()
{
char ch1,ch2,ch3,ch4,t;
printf("请任意输入4个字母:\n");
scanf("%c,%c,%c,%c",&ch1,&ch2,&ch3,&ch4);
printf("依次输出字母:%c,%c,%c,%c\n",ch1,ch2,ch3,ch4);
{t=ch1;ch1=ch3;ch3=t;
t=ch2;ch2=ch4;ch4=t;}
printf("字母调换后输出:%c,%c,%c,%c\n",ch1,ch2,ch3,ch4);
return 0;
}
3-10
#include <stdio.h>
#include <math.h>
int main()
{
float a1=2,a2=5,t1=60,t2,s,v;
s=0.5*a1*t1*t1;
printf("乙物体的位移是:%f\n",s);
t2=sqrt(2*s/a2);
printf("乙物体所需的时间为:%f\n",t2);
v=a2*t2;
printf("乙物体当时的速度是:%f\n",v);
return 0;
}
习 题 四(参考答案)
4-1 C语言中的关系运算符有哪些?它们的优先顺序是怎样的?
答:
运算符
含 义
优先级
<
小于
优先级相同(高)
<=
小于或等于
>
大于
>=
大于或等于
= =
等于
优先级相同(低)
!=
不等于
4-2 C语言中的逻辑运算符有哪些?它们的优先顺序是怎样的?
答:
运算符
含 义
举例
说明
优先级
!
逻辑非
!x
如果x为真,则!x为假;如果x为假,则!x为真
高
&&
逻辑与
x&&y
如果x和y同时为真,则结果为真,否则结果为假
中
||
逻辑或
x||y
如果x和y同时为假,则结果为假,否则结果为真
低
4-3 C语言中如何表示“真”和“假”?又是如何判断一个表达式的“真”和“假”的?
答:C语言中,以数值1代表“真”,以数值0代表“假”。判断表达式的值时,任何非零值均代表“真”(1),零值代表“假”(0)。
4-4 条件表达式的形式是怎样的?“输入两个数,求最小值”如何用条件表达式实现?
答:
条件表达式的一般形式为:
表达式1? 表达式2: 表达式3
#include<stdio.h>
int main()
{
int a,b,min;
scanf("%d,%d",&a,&b);
min=a<b?a:b;
printf("min=%d\n",min);
return 0;
}
4-5 简述嵌套的if语句常用的两种形式。
答:
(1)if(表达式1)
内嵌的if语句
if(表达式2) 语句1
else 语句2
else
内嵌的if语句
if(表达式3) 语句3
else 语句4
(2)if(表达式1)
语句1
else if(表达式2)
语句2
else if(表达式3)
语句3
…
else if(表达式n)
语句n
else
语句n+1
4-6 break语句在switch语句中的作用是什么?
答:
break语句的作用是跳出switch语句结构,即终止switch语句的执行。
4-7 求下面表达式的值。设a=1,b=2,c=3。
(1) (!a==1)&&(!b==0)&&(!c==0) 答:原式=0
(2) a++==1&&(++b==3||c++==3) 答:原式=1
(3) !a&&!b||!c 答:原式=0
(4) a>b||b>c 答:原式=0
(5) !(a+b+c)==0 答:原式=1
4-8 编写程序,输入3个整数,输出其中最小的数。
#include <stdio.h>
int main()
{ int a,b,c,t;
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
{ t=a; a=b; b=t; }
if(a>c)
{ t=a; a=c; c=t; }
if(b>c)
{ t=b; b=c; c=t; }
printf("%d\n",a);
return 0;
}
4-9 编写程序,输入一个非零实数,判断其正负性,若为正数,求其平方,若为负数,求其立方。
#include <stdio.h>
int main()
{ float a;
scanf("%f",&a);
if(a>0)
printf("%5.2f\n",a*a);
else
printf("%5.2f\n",a*a*a);
return 0;
}
4-10 编写程序,输入一个整数,判断其能否同时被2和3整除。若能则输出该整数,若不能,则输出“该数不能被2和3整除”。
#include <stdio.h>
int main()
{ int a;
scanf("%d",&a);
if(a%2==0&& a%3==0)
printf("%d\n",a);
else
printf("该数不能被2和3整除”);
return 0;
}
4-11 编写程序,输入一个字符,判断其是否为小写字母,若是则将它转换成大写字母,否则不转换,原样输出该字符。
#include <stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch=(ch>='A' && ch<='Z‘)?(ch+32):ch;
printf("%c\n",ch);
return 0;
}
4-12 编写程序,输入整数x,实现下面的分段函数:
#include<stdio.h>
int main()
{
int x,y;
scanf("%d",&x);
if(x<0)
y=2*x-9;
else if(x==0)
y=0;
else if(x<10)
y=x+1;
else
y=2*x+9;
printf("y=%d\n",y);
return 0;
}
4-13 某超市对啤酒进行促销,每瓶原价5元,每人每次限购100瓶,活动如下:
10瓶内无优惠,10-29瓶每瓶优惠5%,30-49瓶每瓶优惠8%,50瓶以上每瓶优惠10%。
编写程序,输入购买瓶数,计算购买所需金额。设n为购买啤酒的瓶数,d为折扣,则购买啤酒的金额p的计算公式为:p=5*n*(1-d)。
#include<stdio.h>
int main()
{
int n;
float p,d;
printf("input a number: ");
scanf("%d",&n);
if(n>0&&n<10)
{
d=0;
printf("The price is %f\n", p=5*n*(1-d));}
else if(n>=10&&n<30)
{
d=0.05;
printf("The price is %f\n", p=5*n*(1-d));}
else if(n>=30&&n<50)
{
d=0.08;
printf("The price is %f\n", p=5*n*(1-d));}
else if(n>=50&&n<=100)
{
d=0.1;
printf("The price is %f\n", p=5*n*(1-d));}
else
printf("Sorry, error!\n");
return 0;
}
4-14 编写程序,输入一个1~12的数字,输出其相应的英文月份单词。
#include<stdio.h>
int main()
{ int x;
printf("请输入一个1~12的数字:");
scanf("%d",&x);
switch(x)
{ case 1:printf("January\n");break;
case 2:printf("February\n");break;
case 3:printf("March\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("May\n");break;
case 6:printf("June\n");break;
case 7:printf("July\n");break;
case 8:printf("August\n");break;
case 9:printf("September\n");break;
case10:printf("October\n");break;
case 11:printf("November\n");break;
case 12:printf("December\n");break;
default:printf("输入有误\n");
}
return 0;
}
4-15 某小学5年级6班班级周一到周五每天的课外活动如下:
周一 科技活动
周二 社会活动
周三 艺术活动
周四 文艺活动
周五 劳技活动
编写程序,输入代表星期几的数字,得出相应的活动内容(设周一到周五用1-5数字表示)。
#include<stdio.h>
int main()
{ int x;
printf("请输入星期几:");
scanf("%d",&x);
switch(x)
{ case 1:printf("周一 科技活动\n");break;
case 2:printf("周二 社会活动\n");break;
case 3:printf("周三 艺术活动\n");break;
case 4:printf("周四 文艺活动\n");break;
case 5:printf("周五 劳技活动\n");break;
default:printf("输入有误\n");
}
return 0;
}
4-16 用字符’c’、’x’、’q’、’d’代表“春季”(3~5月),“夏季”(6~8月),“秋季”(9~11月),“冬季”(12-2)月,设每月的时令水果为:
月份
时令水果
月份
时令水果
月份
时令水果
1月
猕猴桃
5月
草莓
9月
葡萄
2月
甘蔗
6 月
樱桃
10月
梨子
3月
菠萝
7月
桃子
11月
苹果
4月
芒果
8月
西瓜
12月
桔子
编写程序,从键盘输入一个字符和数字,得出当季当月的时令水果。
#include<stdio.h>
int main()
{ int x;
char c;
printf("请输入字符和数字:"); scanf("%c,%d",&c,&x);
switch(c)
{ case 'c':printf("季节为春季\n");
switch(x)
{ case 3:printf("月份:3月 时令水果:菠萝\n");break;
case 4:printf("月份:4月 时令水果:芒果\n");break;
case 5:printf("月份:5月 时令水果:草莓\n");break;
default:printf("数字输入有误\n");
}
break;
case 'x':printf("季节为夏季\n");
switch(x)
{ case 6:printf("月份:6月 时令水果:樱桃\n");break;
case 7:printf("月份:7月 时令水果:桃子\n");break;
case 8:printf("月份:8月 时令水果:西瓜\n");break;
default:printf("数字输入有误\n");
}
break;
case 'q':printf("季节为秋季\n");
switch(x)
{ case 9:printf("月份:9月 时令水果:葡萄\n");break;
case 10:printf("月份:10月 时令水果:梨子\n");break;
case 11:printf("月份:11月 时令水果:苹果\n");break;
default:printf("数字输入有误\n");
}
break;
case 'd':printf("季节为冬季\n");
switch(x)
{ case 12:printf("月份:12月 时令水果:桔子\n");break;
case 1:printf("月份:1月 时令水果:猕猴桃\n");break;
case 2:printf("月份:2月 时令水果:甘蔗\n");break;
default:printf("数字输入有误\n");
}
break;
default:printf("字符输入有误\n");
}
return 0;
}
习 题 五
5-1 输出200以内所有能被7整除的数。
#include <stdio.h>
int main()
{
int i;
printf("200以内能被7整除的数有:\n");
for (i = 1;i<=200;i++)
{
if (( i % 7 ) == 0 ) //取200以内能整除7的数
printf( "%5d",i); //输出
}
return 0;
}
5-2 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include<stdio.h>
int main()
{
char c;
int letters=0,space=0,digit=0,other=0;
printf("请?输º?入¨?一°?段?字Á?符¤?\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letters++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digit++;
else
other++;
}
printf("字Á?母?数ºy:%d\n空?格?数ºy:%d\n数ºy字Á?数ºy:%d\n其?他?字Á?符¤?数ºy:%d\n",letters,space,digit,other);
return 0;
}
5-3 求1~1000之间各位数字之和为15的数。
#include <stdio.h>
int main()
{
int i,j,sum;
for(i=1;i<1000;i++)
{
sum=0;
j=i;
do{
sum+=j%10;
j/=10;
}while(j>0);
if(sum==15)
{
printf("%5d",i);
}
}
return 0;
}
5-4 打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和正好等于该数本身。例如153是一个“水仙花数”,因为153=13+53+33。
#include <stdio.h>
int main()
{
int i,j,k,n;
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)
printf("%5d",n);
}
return 0;
}
5-5 找到所有这样的三位数,该三位数等于其每位数字的阶乘之和,即abc=a!+b!+c!。(如:145=1!+4!+5!)
#include <stdio.h>
int fun(int i);
int main()
{
int n, a, b, c;
printf("The number satisfied condition:\n");
for (n = 100; n < 1000; n++)
{
a = n / 100;
b = (n / 10) % 10;
c = n % 10;
if (n == fun(a) + fun(b) + fun(c))
{
printf("%4d = %d! + %d! + %d!\n",n,a,b,c);
}
}
return 0;
}
int fun(int i)
{
int n = 1;
int s = 1;
while (n <= i) /*求¨®阶¡Á乘?的Ì?算?法¤¡§*/
{
s *= n;
n += 1;
}
return s; /*返¤¦Ì回?所¨´求¨®的Ì?阶¡Á乘?值¦Ì*/
}
5-6 每行5个数,分行输出100以内所有的素数。
#include <stdio.h>
int main()
{
int i,n,t=1;
printf(" 2");//单Ì£¤独¨¤处ä|理¤¨ª2
for(i=3;i<100;i+=2)
{
for(n=3;n*n<=i;n+=2)
if(i%n==0)
break;
if(i<n*n)
{
t++;
printf("%5d",i);
if(t%5==0)
printf("\n");
}
}
return 0;
}
5-7 从键盘上输入两个正整数,求这两个数的最大公约数与最小公倍数。
#include <stdio.h>
int main()
{
int p,r,n,m,temp;
printf("请?输º?入¨?两¢?个?正y整?数ºyn,m:");
scanf("%d%d",&n,&m);
if(n<m)
{
temp=n;
n=m;
m=temp;
}
p=n*m;
while(m!=0)
{
r=n%m;
n=m;
m=r;
}
printf("它¨¹们?的Ì?最Á?大䨮公?约?数ºy为a:%d\n",n);
printf("它¨¹们?的Ì?最Á?小?公?倍À?数ºy为a:%d\n",p/n);
return 0;
}
5-8 键盘输入整数 n,输出 1+3+5+7+…前 n 项的值(n≤100)。
#include <stdio.h>
int main()
{
int n,i,sum;
scanf("%d",&n);
for(i=1,sum=0;i<=n;i++)
sum+=2*i-1;
printf("%d\n",sum);
return 0;
}
5-9 键盘输入整数 n,输出s=1+(1+2)+(1+2+3)+ …+(1+2+3+…+n)的值。
#include <stdio.h>
int main()
{
int i,j,n,sum=0;
scanf("%d",&n);
for (i = 0; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
sum += j;
}
}
printf("sum=%d\n",sum);
return 0;
}
5-10 键盘输入整数m,输出1+1/2+1/3+1/4+…+1/m的值。
#include <stdio.h>
int main()
{
int m,k=1;
double sum=0.0;
printf("please input m:");
scanf("%d",&m);
do
{
sum=sum+1.0/k;
k++;
}while(k<=m);
printf("%f",sum);
return 0;
}
5-11 用公式求π的近似值:π/4≈1-1/3+1/5-1/7+…,直到最后一项的绝对值小于10-6为止。
#include <stdio.h>
#include <math.h>
展开阅读全文