资源描述
C语言题目解析
2016年5月25日上午
NightCat
以下所有代码均在编译环境下通过
使用Visual Studio的同学请自行验证
1-假如我国国民生产总值的年增长率为9% ,计算10年后我国国民生产总值与现在 相比增长多少百分比,编写程序。计算公式p=(l+r)*(l+r),由于r是按百分比输 入,所以要变成小数r*100%o
其中P为增长百分比总数,r为增长率,n为增长年数解析:这题可以用两种方法计算,第一种是用for循环计算指数,第二种是用math.h中的pow() 函数计算指数。H
第一种方法:(使用for循环计算指数)第二种方法:(使用pow函数)
最编出结果:累积10年的9%增长率为236.736435%
易格点,
曰'祐式符%.2f表示保留两位小数;注意r和p在输入时都是百分数,输入9(%)即表示0.09
2. 从键盘输入一个4位数x编程计算x的每一位数字相加之和(忽视整数前的正负号)。 例如,输入x为1234,则由1234分离出其千位1 ,百位2 ,十位3 ,个位4 ,然 后计算1+2+3+4=10 ,并输出10。
解析:该题有两种方法,第一种是将数字分别除和取余,用单独的变量存储每位数字并相加;第 二种是嵌套循环(关于嵌套循环的细节请查阅课本第124页),使用4个变量进行嵌套遍历,当 4个变量等于原数字时,则将4个数字相加。
第一种:(对输入数进行除法和取余)第二种:(嵌套循环法)
最终输出结果(当输入1234 ): 10
易错点,
戈寸于使用嵌套循环,尽量使用花括号(}分清层次
3. 三色球问题,若一个口袋中放有12个球,其中有3个红球,3个白球,6个黑球, 从中任意取8个球,问共有多少种不同的颜色搭配?
解析:方法与第2题的第2个方法雷同,定义3层嵌套循环,循环条件值为红白黑各种球类的 数量。
例如,可以定义for循环语句:遍历当有0、1、2、3个红球时......
for( Red = 0 ; Red < = 3 ; Red + + )(
最终输出结果:
易错点:
钱意调整每层循环的最大球数【嵌套循环的细节请查阅课本第124页】
4. 编写一个单科学生成绩处理程序,具体要求如下:
1)学生个数定义成符号常量2)学生成绩定义成一维数组进行处理,并有键盘逐个输入
3)要求统计出平均成绩,各个等级的人数及百分比4)数据输入和输出要有提示信息
解析:对于一维数组存储成绩,可使用循环语句进行输入;统计出平均成绩、找各等级的人数时, 可使用循环取出数组所有元素累加并除以学生个数,在循环体内使用条件控制分等级。
最终输出结果:
易错点.
1. 该嫌'习代码段较长,注意各变量拼写;我将"每个分数等级的人数"变量设定为float是有原因的(人数总不可能是小数吧,怎 么会有2.5个人这样的数量),这样在编写代码的时候可以减少显式转换类型的过程。我将 总成绩设定为float类型,那么在赋值等号后的算术运算中,"被除数"变量必须是与承载
"商"变量同一类型,例如:
此时输出B=2.00000 ,这显然不是我们想要的值。因为A和B的类型不一致以下写法是正确的:
或者保持A的int类型,在运算时加入显式转换类型:
5. 编写一个程序用于实现函数strcpy()的功能解析:strcpy()函数的功能、参数和返回值详见这里。该方法主要考察字符数组和指针应用。在 这里分两种方法:第一种、将字符串数组使再而循环执行复制字符一直到0字符或数组末尾时 完成strcpy ;第二种、将字符串指针传入函数中处理,返回第一个参数的指针地址。
第一种:(直接使用字符数组)第二种:(使用指针作为函数返回值)
易错点(难点):
(1) .sizeof()是计算指定对象的数据类型所占的字节数
(2) .gets()和 scanf()的区别
在以上代码我没有使用scanf ,是因为该函数在读取输入的时遇到空格、Tab、换行符 即停止输入,只有gets在遇到换行符时才会停止输入,如下例:
(3) .指针函数返回值
在C中函数的返回值如果需要返回一个字符数组,那么,以下代码在C中是不合法的 所以函数返回值必须使用指针作为返回值,使用return语句时,可返回指针类型,也 可以返回数组
(4) .在使用指针前,养成良好的习惯,先判断指针是否为空指针;如果程序未经判断使 用了空指针,在调试和运行阶段可能会发生不可预料的错误。
淤啰嗦一句:在C中使用指针是一种不安全的、也是不可或缺的代码行为,不留神检 查使用指针的代码可能会造成灾难性的后果,轻者会使程序崩溃数据丢失,严重会影响计算 机系统的运行。就目前阶段来说,未涉及malloc申请内存地址等高级指针应用,这些也不 在本文的讨论范围之内,但还是需要注意指针的使用和编译器的错误或警告,养成良好的代 码习惯。
(5) .注意运算符的优先级
首先,指针取值符号和"++"自增运算符属于第2级运算符,是同级运算符。在 一堆同级运算符中没有圆括号的时候顺序是从右到左。请注意:++a和a ++是有区别的, ++a是执行表达式前就进行自增1, a++是执行表达式后自增1。所以先对指针target和 source进行取值(* ),然后进行赋值(=)运算,即*target二*source。用一对圆括号将这 条赋值语句括起,表示先进行取值,后执行赋值,再判断刚才"target被赋予的值是否不等 于"\0"(零字符,表示字符串末尾),如果是,则还没到字符串末尾,循环继续;如果否, 则循环终止。康后,target和source自谱1。以上红色彳年码与下向等技:
6. 建立一个学生类型的结构体,用结构体实现求10位学生中学习成绩最好的学生信 息。
解析:按照题目要求,新建一个Studentinfo学生信息结构体:包括学生姓名Name.学号ID 以及成绩Score。在主函数中使用结构体数组,再另新建一个Studentinfo的结构体BestStudent 用于存储成绩最好的学生,然后循环遍历这个结构体数组中的Score,如果当前遍历的学生成绩 化BestStudent ,就将该学生的信息存储到BestStudent中。
输出结果 易错点(难点):
(l).sizeof()不仅可以获得指定对象占用的字节数,还可以获得指定数据类型的字节长度。 当然,也可以获取数组中某一个元素的数据类型长度
那么,求数组元素总数就很简单了。
数组所有元素所占字节=数组元素总数x数组元素数据类型长度
那么,数组元素总数=数组所有元素所占字节《数组中单个元素所占字节
类似的,对于sizeof(结构体数组),可做以下示例:
注意到了上例画波浪线的注释吗?按照结构体内成员累加计算那本来不是20+10+4=34 字节的吗?怎么是36字节呢?这涉及到结构体数据类型的数据对齐,整个结构体所占字节 是按照其成员中最宽字节元素的数据类型长度作为整数倍,当长度不足则凑够整数倍。例如 上例中Studentinfo结构体中最宽字节元素的数据类型是float,占4个字节,而char只 占1个字节,所以使用4作为这个结构体长度的整数倍。34字节是明显不能被4整除的, 只能与36字节对齐。如果将结构体内的float类型改成double(8字节),那么,这个结构 体长度的整数倍就是8,单个结构体的数据长度就是40。
(2).typedef的使用,关于typedef的细节详见课本第326页,我在代码中用于结构体是为 了简洁化代码。如下例:
7. 从键盘任意输入10个整数,用函数编程实现计算最大值和最小值,以及他们所在 数组中的位置。
解析:本题实际考察函数和指针的应用,这里注意的是函数的参数不单是可以传入,作为指针也 可以得到值。详见代码:
输出结果 易错点(难点):
(1)函数的参数指定为指针时,可以获得数值,就像使用scanf( "%d" ,&a);将用户输入的数字 存储到a中一样,需要定义函数参数为指针在调用这个函数的时候,如果需要从*receive获得值,我们就需要使用取址符号(& )
8. 建立一个工人类型的结构体,用结构体实现将10位工人按年龄排序解析:本题主要考察数组+结构体的应用,加入了排序算法。首先要做的是建立工人结构体,然 后在主函数中建立工人结构体的数组,在主函数中使用排序算法对工人结构体中的年龄进行排序。 在这里,我就演示2种流行的排序方法:选择排序、冒泡排序。选择排序算法详见课本第196 页(例7.12 ),冒泡排序算法详见课本第147页(例6.3 X
第一种:(选择排序)第二种:(冒泡排序)
输出结果
展开阅读全文