c语言程序设计

c语言程序设计,第1张

第一章 程序设计的基本概念

第一节 C语言的发展历史与特点

第二节 程序与程序设计

第三节 算法与算法的描述

第四节 C语言的上机 *** 作

思考题与习题

第二章 C语言程序设计基础

第一节 C语言的程序结构

第二节 数据类型

第三节 运算符与表达式

思考题与习题

第三章 C程序控制结构

第一节 C程序的三种基本控制结构

第二节 顺序结构

第三节 选择结构

第四节 循环结构

思考题与习题

第四章 数组

第一节 数组与数组元素的概念

第二节 一维数组

第三节 二维数组及多维数组

第四节 字符串与字符数组

思考题与习题

第五章 指针

第一节 指针与指针变量的概念

第二节 指针变量的定义和引用

第三节 指针变量与数组

思考题与习题

第六章 函数

第一节 函数的定义

第二节 函数的嵌套调用

第三节 数组作为函数参数

第四节 指针与函数

第五节 变量的使用范围与存储类别

第六节 不同文件中的函数使用

思考题与习题

第七章 编译预处理

第一节 宏定义

第二节 文件包含

第三节 条件编译

思考题与题

第八章 结构体与共用体

第一节 结构体基础

第二节 结构体数组

第三节 结构体指针

第四节 链表

第五节 位段

第六节 共用体

第七节 枚举类型与自定义类型

思考题与习题

第九章 文件

第一节 文件概述

第二节 文件的打开与关闭

第三节 文件的读/写

第四节 文件的定位

思考题与习题

第十章 程序设计方法

第一节 程序设计的基本概念

第二节 结构化程序设计方法

第三节 程序效率

第四节 程序设计风格

思考题与习题

附录

附录A C语言实验

附录B 标准ABSII码表

附录C C语言中的关键字

附录D 运算符的优先级与结合性

教了多年《C程序设计》课程,大多学生觉的这门课程难学。其实,按照我们现在的教学大纲和教学要求,只要同学们掌握一些方法,克服心理上畏难、不轻言放弃,是完全可以学好的。

《C程序设计》的内容很丰富,按照我们现在的教学大纲,教学的主要内容是基础知识、四种结构的的程序设计、函数与数组的应用和一些简单的算法。在学习时,同学们应该把主要精力放在这些部分,通过实践(练习和上机调试等熟练掌握。当然,在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺,大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题,回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学的好?

学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。比如:在C语言中最典型的是关于结构化程序设计构思,不管是那种教材,一开始就强调这种方法,这时也许你不能充分体会,但是学到函数时,再回头来仔细体会,温故知新,理解它就没有那么难了。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。

那么,我们如何学好《C程序设计》呢?

一.学好C语言的运算符和运算顺序

这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。

先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。下面我们通过几个例子来说明:

(1) 58/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算5 8=40,然后被4除,结果为10,最后是%(求余数)运算,所以表达式的最终结果为10%10 = 0;

(2)a = 3;b = 5;c =++ a b ;d =a + + b;

对于c=++ab来说,按表中所列顺序,+ +先执行,后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值计算式为45=20而不是35=15了;而对于d=a++b来说,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。 这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20;

(3)(a = 3,b = 5,b+ = a,c = b 5)

例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。

(4)a=5;b=6;c=a>ba:b;

例中的a>ba:b是一个三目运算,它的功能是先做关系运算a>b部分,若结果为真,则取问号后a的值,否则取冒号后b的值,因此c的值应该为6,这个运算可以用来代替if…else…语句的简单应用。

二.学好C语言的四种程序结构

(1)顺序结构

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。

例如;a = 3,b = 5,现交换a,b的值,这个问题就好象交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 314159rr,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。

(2) 分支结构

顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。

学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。

①if(条件)

{

分支体

}

这种分支结构中的分支体可以是一条语句,此时“{ }”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x;

②if(条件)

{分支1}

else

{分支2}

这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根

分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:

d=bb-4ac;

if(d>=0)

{x1=(-b+sqrt(d))/2a;

x1=(-b-sqrt(d))/2a;

printf(“x1=%84f,x2=%84f\n”,x1,x2);

}

else

{r=-b/(2a);

i =sqrt(-d)/(2a);

printf(“x1=%84f+%84fi\n”r, i);

printf(“x2=%84f-%84fi\n”r,i)

}

③嵌套分支语句:其语句格式为:

if(条件1) {分支1};

else if(条件2) {分支2}

else if(条件3) {分支3}

……

else if(条件n) {分支n}

else {分支n+1}

嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。

④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。

(3)循环结构:

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。

在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的 *** 作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。

顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。

(4)模块化程序结构

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因些,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。

三.掌握一些简单的算法

编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义,其中选择法排序和冒泡法排序稍难,但只要明白排序的具体过程,对代码的理解就不难了。如用选择法对10个不同整数排序(从小到大),选择法排序思路:设有10个元素a[1]~a[10],将a[1]与a[2]~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何 *** 作;若a[2]~a[10] 中有一个比a[1]小,则将其中最大的一个(假设为a)与a[1]交换,此时a[1]中存放了10个中最小的数。第二轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a与a[2]交换,此时a[2] 中存放的10个数中第2小的数;依此类推,共进行9轮比较,a[1]到a[10]就已按从小到大的顺序存放。即每一轮都找出剩下数中的最小一个,代码如下:

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

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

if(a>a[j]

{temp=a;

a=a[j];

a[j]=temp;

}

结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学。

参考资料:

>

《C语言程序设计(第3版)pdf: 》

>

选择普通下载就好!

C程序设计(第三版)[谭浩强著]课后题答案!!!(2009-06-04 19:57:53)标签:教育 分类:学习

15请参照本章例题,编写一个C程序,输出以下信息:

Very Good!

解:

mian()

{printf(“”);

printf(“\n”);

printf(“Very Good!\n”);

printf(“\n”);

printf(“”);

}

16 编写一个程序,输入a、b、c三个值,输出其中最大值。

解:

mian()

{int a,b,c,max;

printf(“请输入三个数a,b,c:\n”);

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

max=a;

if(max<b)

max=b;

if(max<c)

max=c;

printf(“最大数为:“%d”,max);

}

第三章

36写出以下程序运行的结果。

main()

{char c1=’a’,c2=’b’,c3=’c’,c4=’\101’,c5=’\116’;

printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3);

printf(“\t\b%c %c”,c4,c5);

}

解:

aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabc

AㄩN

37 要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

解:

#include <stdioh>

main()

{ char c1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;

c1+=4;

c2+=4;

c3+=4;

c4+=4;

c5+=4;

printf("密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5);

}

运行结果:

密码是Glmre

39求下面算术表达式的值。

(1)x+a%3(int)(x+y)%2/4

设x=25,a=7,y=47

(2)(float)(a+b)/2+(int)x%(int)y

设a=2,b=3,x=35,y=25

(1)25

(2)35

310写出程序运行的结果。

main()

{int i,j,m,n;

i=8;

j=10;

m=++i;

n=j++;

printf(“%d,%d,%d,%d”,i,j,m,n);

}

解:

9,11,9,10

312 写出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。

(1)a+=a (2) a-=2 (3) a=2+3 (4)a/=a+a

(5) a%=(n%=2),n的值等于5

(6)a+=a-=a=a

解:

(1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0

第四章

4.4若a=3,b=4,c=5,x=12,y=24,z=-36,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。

a=_3_ _b=_4_ _c=_5

x=1200000,y=2400000,z=-3600000

x+y=_3600_ _y+z=-120_ _z+x=-240

c1=ˊaˊ_or_97(ASCII)

c2=ˊbˊ_or_98(ASCII)

main()

{int a=3,b=4,c=5;

long int u=51274,n=128765;

float x=12,y=24,z=36;

char c1=’a’,c2=’b’;

printf("a=%2d b=%2d c=%2d\n",a,b,c);

printf("x=%f,y=%f,z=%f\n",x,y,z);

printf("x+y=%52f y+z=%52f z+x=%52f\n",x+y,y+z,z+x);

printf("u=%6ld n=%9ld\n",u,n);

printf("%s %s %d%s\n","c1=’a’","or",c1,"(ASCII)");

printf("%s %s %d%s\n","c2=’a’","or",c2,"(ASCII)");

}

4.7用scanf下面的函数输入数据,使a=3,b=7,x=85,y=7182,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入?

main()

{

int a,b;float x,y;char c1c2;

scanf("a=%d_b=%d",&a,&b);

scanf("_x=%f_y=%e",&x,&y);

scanf("_c1=%c_c2=%c",&c1,&c2);

}

a=3_b=7

_x=85_y=7182

_c1=A_c2=a

4.8设圆半径r=15,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。

main()

{float r,h,C1,Sa,Sb,Va,Vb;

scanf("%f,%f",&r,&h);

C1=2314r;

Sa=314rr;

Sb=4Sa;

Va=4314rrr/3;

Vb=Sah;

printf("C1=%2f\n",C1);

printf("Sa=%2f\nSb=%2f\nVa=%2f\nVb=%2f\n",Sa,Sb,Va,Vb);

}

4.9输入一个华氏温度,要求输出摄氏温度。公式为

c=5(F-32)/9

输出要求有文字说明,取位2小数。

main()

{float F,c;

scanf("%f",&F);

c=5(F-32)/9;

printf("c=%2f",c);

}

4.10编程序,用getchar函数读入两个字符给c1、c2,然后分别用函数和函数输出这两个字符。并思考以下问题:(1)变量c1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如:

char c1,c2;

int c1,c2;

是否无条件的等价?

#include"stdioh"

main()

{char c1,c2;

c1=getchar();c2=getchar();

putchar(c1);putchar(’\n’);putchar(c2);putchar(’\n’);

}

#include"stdioh"

main()

{char c1,c2;

c1=getchar();c2=getchar();

printf("c1=%d c2=%d\n",c1,c2);

printf("c1=%c c2=%c\n",c1,c2);

}

第五章

51 什么是算术运算?什么是关系运算?什么是逻辑运算?

解:略。

52 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

解:设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。例如3&&5的值为“真”,系统给出3&&5的值为1。

53 写出下面各逻辑表达式的值。设a=3,b=4,c=5。

(1) a+b>c&&b==c

(2) a||b+c&&b-c

(3) !(a>b)&&!c||1

(4) !(x=a)&&(y=b)&&0

(5) !(a+b)+c-1&&b+c/2

解:

(1) 0

(2) 1

(3) 1

(4) 0

(5) 1

54 有3个整数a、b、c,由键盘输入,输出其中最大的数。

解:

方法一

#include <stdioh>

main()

{ int a,b,c;

printf("请输入3个整数:");

scanf("%d,%d,%d",&a,&b,&c);

if(a<b)

if(b<c) printf("max=%d\n",c);

else printf("max=%d\n",b);

else if(a<c) printf("max=%d\n",c);

else printf("max=%d\n",a);

}

方法二:使用条件表达式,可以使程序更加简明、清晰。

程序如下:

#include <stdioh>

main()

{ int a,b,c,temp,max;

printf("请输入3个整数:");

scanf("%d,%d,%d",&a,&b,&c);

temp=(a>b)a:b;

max=(temp>c)temp:c;

printf("3个整数的最大数是%d\n”,max);

}

55 有一函数:

写一程序,输入x值,输出y值。

解:

#include <stdioh>

main()

{int x,y;

printf("输入x:");

scanf("%d",&x);

if(x<1)

{ y=x;

printf("x=%3d, y=x=%d\n",x,y);

}

else if (x<10)

{ y=2x-1;

printf("x=%3d, y=2x-1=%d\n",x,y);

}

else

{ y=3x-11;

printf("x=%3d, y=3x-11=%d\n",x,y);

}

}

56 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’。

解:

程序如下:

#include <stdioh>

main()

{ float score;

char grade;

case 2:

printf("请输入学生成绩:");

scanf("%f",&score);

while(score>100||(score<0)

{ printf("\n输入有误,请重新输入:");

scanf("%f",&score);

}

switch((int)(score/10))

{ case 10:

case 9: grade=’A’;break;

case 8: grade=’B’;break;

case 7: grade=’C’;break;

case 6: grade=’D’;break;

case 5:

case 4:

case 3:

case 1:

case 0: grade=’E’;

}

printf("成绩是%51f,相应的等级是%c。\n",score,grade);

}

说明:对输入的数据进行检查,如小于0或大于100,要求重新输入。(int)(score/10)的作用是将 (score/10) 的值进行强制类型转换,得到一个整型值。

57 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。

解:

#include <stdioh>

main()

{ long int num;

int indiv,ten,hundred,thousand,ten_thousand,place;

printf("请输入一个整数(0~99999):");

scanf("%ld",&num);

if (num>9999) place=5;

else if(num>999) place=4;

else if(num>99) place=3;

else if(num>9) place=2;

else place=1;

printf("place =%d\n", place);

ten_thousand=num/10000;

thousand=num/1000%10;

hundred=num/100%10;

ten=num%100/10;

indiv=num%10;

switch(place)

{ case 5: printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);

printf("\n反序数字为;");

printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);

break;

case 4: printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);

printf("\n反序数字为:");

printf("%d%d%d%d\n",indiv,ten,hundred,thousand);

break;

case 3: printf("%d,%d,%d",hundred,ten,indiv);

printf("\n反序数字为:");

printf("%d%d%d\n",indiv,ten,hundred);

break;

case 2: printf("%d,%d",ten,indiv);

printf("\n反序数字为:");

printf("%d%d\n",indiv,ten);

break;

case 1: printf("%d",indiv);

printf("\n反序数字为:");

printf("%d\n",indiv);

break;

}

}

58 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000<I≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成75% ;200000<I≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按15%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。

解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按75%提成。

(1) 用if语句编程序。

#include <stdioh>

main()

{ long i;

float bonus,bon1,bon2,bon4,bon6,bon10;

bon1=10000001;

bon2=bon1+1000000075;

bon4=bon2+200000005;

bon6=bon4+200000003;

bon10=bon6+4000000015;

printf("请输入利润i:");

scanf("%ld",&i);

if(i<=100000)

bonus=i01;

else if(i<=200000)

bonus=bon1+(i-100000)0075;

else if(i<=400000)

bonus=bon2+(i-200000)005;

else if(i<=600000)

bonus=bon4+(i-400000)003;

else if(i<=1000000)

bonus=bon6+(i-600000)0015;

else

bonus=bon10+(i-1000000)001;

printf(”奖金是%102f\n",bonus);

}

此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000ⅹ01;②10万元以上部分应得的奖金。即(num-100000)ⅹ0075。同理,20万~40万这个区间的奖金也应由两部分组成:①利润为20万元时应得的奖金,即100000ⅹ01ⅹ10万ⅹ0075;②20万元以上部分应得的奖金,即(num-200000)ⅹ005。程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。

(2) 用switch语句编程序。

输入利润i,确定相应的提成等级branch

根据branch确定奖金值

0 奖金=i01

1 奖金=bon1+(i-105)0075

2 奖金=bon2+(i-2105)005

3

4 奖金=bon4+(i-4105)003

5

6 奖金=bon6+(i-6105)0015

7

8

9

10 奖金=bon10+(i-106)001

输出奖金

#include <stdioh>

main()

{ long i;

float bonus, bon1, bon2, bon4, bon6, bon10;

int c;

bon1=10000001;

bon2=bon1+1000000075;

bon4=bon2+200000005;

bon6=bon4+200000003;

bon10=bon6+4000000015;

printf("请输入利润i:");

scanf("%ld",&i);

c=i/100000;

if(c>10) c=10;

switch(c)

{ case 0: bonus=101;break;

case 1: bonus=bon1+(i-100000)0075;break;

case 2 :

case 3: bonus=bon2+(i-200000)005; break;

case 4:

case 5: bonus=bon4+(i-400000)003;break;

case 6:

case 7:

case 8:

case 9: bonus=bon6+(i-600000)0015;break;

case 10: bonus=bon10+(i-1000000)001;

}

printf("奖金是%102f",bonus);

}

59 输入4个整数,要求按由大到小的顺序输出。

解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。

#include <stdioh>

main()

{ int t,a,b,c,d;

printf("请输入4个整数:");

scanf("%d,%d,%d,%d",&a,&b,&c,&d);

printf("\n a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);

if(a>b) {t=a; a=b; b=t;}

if(a>c) {t=a; a=c; c=t;}

if(a>d) {t=a; a=d; d=t;}

if(b>c) {t=a; b=c; c=t;}

if(b>d) {t=b; b=d; d=t;}

if(c>d) {t=c; c=d; d=t;}

printf("排序结果如下:\n");

printf("%d, %d, %d, %d\n",a,b,c,d);

}

510 有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

程序如下:

#include <stdioh>

main()

{ int h=10;

float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4;

printf("请输入一个点(x,y):");

scanf("%f,%f",&x,&y);

d1=(x-x1)(x-x1)+(y-y1)(y-y1);

d2=(x-x2)(x-x2)+(y+y2)(y+y2);

d3=(x+x3)(x+x3)+(y-y3)(y-y3);

d4=(x+x4)(x-x4)(y+y4)(y+y4);

if(d1>1&&d2>1&&d3>1&&d4>1) h=0;

printf("该点高度为%d\n",h);

}

第六章

第六章 循环控制

61输入两个正整数m和n,求其最大公约数和最小公倍数。

main()

{long m,n,i=1,j,s;

scanf("%ld,%ld",&m,&n);

for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) s=i;}

if(m>=n) j=m;

else j=n;

for(;!(j%m==0&&j%n==0);j++);

printf("s=%ld,j=%ld\n",s,j);

}

62输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

#include"stdioh"

main()

{char c;int i=0,j=0,k=0,l=0;

while((c=getchar())!=’\n’)

{if(c>=65&&c<=90||c>=97&&c<=122) i++;

else if(c>=48&&c<=57) j++;

else if(c==32) k++;

else l++;}

printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);

}

63求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。

#include"mathh"

main()

{int n,sum=0,i=1,s=2;

scanf("%d",&n);

while(i<=n)

{sum=sum+s;s=s+2pow(10,i);

i++;}

printf("sum=%d\n",sum);

}

64 求 ,(即求1!+2!+3!+4!+5!+…+20!)

main()

{int n,i=1;long sum=0,s=1;

scanf("%d",&n);

while(i<=n) {s=si;sum=sum+s;i++;}

printf("sum=%ld\n",sum);

}

65 求

main()

{double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum;

for(;i<=100;i++) s1=s1+i;

for(;j<=50;j++) s2=s2+jj;

for(;k<=10;k++) s3=s3+1/k;

sum=s1+s2+s3;

printf("sum=%f\n",sum);

}

66打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。

#include"mathh"

main()

{int x=100,a,b,c;

while(x>=100&&x<1000) {a=001x;b=10(001x-a);c=x-100a-10b;

if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf("%5d",x);x++;}

}

67一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子:

6 its factors are 1、2、3

main()

{int m,i,j,s;

for(m=6;m<10000;m++)

{s=1;

for(i=2;i<m;i++)

if(m%i==0) s=s+i;

if(m-s==0)

{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)

printf("%d ",j);printf("\n");}

}

}

main()

{int m,i,j,s;

for(m=6;m<1000;m++)

{s=m-1;

for(i=2;i<m;i++)

if(m%i==0) s=s-i;

if(s==0)

{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)

printf("%d ",j);printf("\n");}

}

}

68有一分数序列:

求出这个数列的前20项之和。

main()

{int i=1,n;double t,x=1,y=2,s,sum=0;

scanf("%ld",&n);

while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;}

printf("%f\n",sum);

}

69一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反d多高?

main()

{int i,n;double h=100,s=100;

scanf("%d",&n);

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

{h=05;if(i==1) continue;s=2h+s;}

printf("h=%f,s=%f\n",h,s);

}

610猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

main()

{int i=1,sum=0;

for(;i<=10;sum=2sum+1,i++);

printf("sum=%d\n",sum);

}

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

要求前后两次求出的得差的绝对值少于000001。

#include"mathh"

main()

{float x0,x1,a;

scanf("%f",&a);

x1=a/2;

do

{x0=x1;x1=(x0+a/x0)/2;}

while(fabs(x0-x1)>=000001);

printf("%3f\n",x1);

}

612 用牛顿迭代法求方程在15附近的根。

main()

{double x,y;x=15;

do{y=2xxx-4xx+3x-6;

x=x-y/(6xx-8x+3);}

while(y!=0);

printf("x=%3f\n",x);

}

613用二分法求方程在(-10,10)之间的根

main()

{double x1,x2,y1,y2;x1=-10;x2=10;

do{y1=2x1x1x1-4x1x1+3x1-6;

x1=x1-y1/(6x1x1-8x1+3);}

while(y1!=0);

do

{y2=2x2x2x2-4x2x2+3x2-6;

x2=x2-y2/(6x2x2-8x2+3);}

while(y2!=0);

printf("x1=%3f,x2=%3f\n",x1,x2);

}

614打印以下图案

#include"mathh"

main()

{int i,j,k;

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

{for(j=0;j<=2-i;j++)

printf(" ");

for(k=0;k<=2i;k++)

printf("");

printf("\n");

}

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

{for(j=0;j<=i;j++)

printf(" ");

for(k=0;k<=4-2i;k++)

printf("");

printf("\n");

}

}

第七章

第七章 数组

71 用筛法求之内的素数。

main()

{ int i,j,a[100];

for(i=2;i<100;i++)

{ a[i]=i;

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

{if(j<i)

if(a[i]%j==0)

break;

if(a[i]-j==0)

printf("%5d",a[i]);

}

}

printf("\n");

}

#include"mathh"

main()

{static int i,j,k,a[98];

for(i=2;i<100;i++)

{a[i]=i;k=sqrt(i);

for(j=2;j<=a[i];j++)

if(j<k) if(a[i]%j==0)

break;

if(j>=k+1)

printf("%5d",a[i]);

}

printf("\n");

}

72用选择法对10个整数从小到大排序。

main()

{ int i,j,a[10],t;

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

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

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

for(i=0;i<=9-j;i++)

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

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

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

printf("%5d",a[i]);

}

main()

{static int a[10],i,j,k,t;

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

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

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

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

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

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

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

printf("%d",a[i]);

printf("\n");

}

73求一个3×3矩阵对角线元素之和。

main()

{int i=0,j=0,a[3][3],s1,s2;

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

for(j=0;j<3;j++)

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

s1=a[0][0]+a[1][1]+a[2][2];

s2=a[0][2]+a[1][1]+a[2][0];

printf("s1=%d,s2=%d\n",s1,s2);

}

main()

{

static int i,j,s1,s2,a[3][3];

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

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

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

s1=a[1][1]+a[2][2]+a[3][3];

s2=a[1][3]+a[2][2]+a[3][1];

printf("%d,%d\n",s1,s2);

}

74已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。

main()

{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t;

scanf("%d",&a[9]);

for(i=9;i>0;i--)

if(a[i]<a[i-1])

{t=a[i-1];a[i-1]=a[i];a[i]=t;}

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

printf("%5d",a[i]);printf("\n");

}

main()

{

static int a[5]={1,4,5,6,7};

int i,t,b;

scanf("%d",&b);

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

{if(b<=a[i])

{t=a[i];a[i]=b;b=t;}

printf("%d ",a[i]);}

printf("%d",b);

}

75将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。

main()

{ int i,b[10];

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

scanf("%d",&b[i]);

for(i=9;i>-1;i--)

printf("%5d",b[i]);

printf("\n");}

76打印出以下杨辉三角形(要求打印出10行)。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

main()

{ static int m,n,k,b[15][15];

b[0][1]=1;

for(m=1;m<15;m++)

{for(n=1;n<=m;n++)

{ b[m][n]=b[m-1][n-1]+b[m-1][n];

printf("%-5d",b[m][n]);}printf("\n");

}

}

}

main()

{ int i,j,n,k,a[10][10];

static a[][1]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};

a[1][1]=1;

for(k=2,k<11;k++)

for(i=2;i<=k;i++)

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

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

for(k=1;k<11;k++)

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

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

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

}

77 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

要求打印出由1~n2的自然数构成的魔方阵。

解:

#include <stdioh>

main()

{ int a[16][16],i,i,k,p,m,n;

p=1;

while(p==1)

{ printf("Enter n(n=1~15):");

scanf("%d",&n);

if((n!=0)&&(n<=15)&&(n%2!=0)) p=0;

}

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

for(j=1;j<=n;j++) a[i][j]=0

C语言概述

11C语言出现的历史背景

12C 语言的特点

13简单的C语言程序介绍

14运行C程序的步骤与方法

141运行C程序的步骤

142上机运行C程序的方法

习题

程序的灵魂——算法

21算法的概念

2.2简单算法举例

23算法的特性

24怎样表示一个算法

241用自然语言表示算法

242用流程图表示算法

2433种基本结构和改进的流程图

244用N\|S流程图表示算法

245用伪代码表示算法

246用计算机语言表示算法

25结构化程序设计方法

习题

数据类型、运算符与表达式

31C语言的数据类型

32常量与变量

321常量和符号常量

3.2.2变量

3.3整型数据

3.3.1整型常量的表示方法

332整型变量

333整型常量的类型

3.4浮点型数据

3.4.1浮点型常量的表示方法

3.4.2浮点型变量

343浮点型常量的类型

3.5字符型数据

3.5.1字符常量

3.5.2字符变量

3.5.3字符数据在内存中的存储形式及其使用方法

3.5.4字符串常量

3.6变量赋初值

37各类数值型数据间的混合运算

38算术运算符和算术表达式

3.8.1C语言运算符简介

3.8.2算术运算符和算术表达式

3.9赋值运算符和赋值表达式

3.10逗号运算符和逗号表达式

习题

最简单的C程序设计——顺序程序设计

4.1C语句概述

42赋值语句

43数据输入输出的概念及在C语言中的实现

4.4字符数据的输入输出

441 putchar函数

442 getchar函数

4.5格式输入与输出

451printf函数

4.5.2scanf函数

46顺序结构程序设计举例

习题

选择结构程序设计

5.1关系运算符和关系表达式

5.1.1关系运算符及其优先次序

5.1.2关系表达式

5.2逻辑运算符和逻辑表达式

5.2.1逻辑运算符及其优先次序

5.2.2逻辑表达式

5.3if 语句

5.3.1if语句的3种形式

5.3.2if语句的嵌套

5.3.3条件运算符

5.4switch语句

5.5程序举例

习题

循环控制

61概述

62goto语句以及用goto语句构成循环

63用while语句实现循环

64用do…while语句实现循环

65用for 语句实现循环

66循环的嵌套

67几种循环的比较

68break语句和continue语句

681break语句

682continue语句

69程序举例

习题

数组

71一维数组的定义和引用

711一维数组的定义

712一维数组元素的引用

713一维数组的初始化

714一维数组程序举例

72二维数组的定义和引用

721 二维数组的定义

722二维数组的引用

723二维数组的初始化

724二维数组程序举例

73字符数组

731字符数组的定义

732字符数组的初始化

733字符数组的引用

734字符串和字符串结束标志

735字符数组的输入输出

736字符串处理函数

737字符数组应用举例

习题

函数

8.1概述

8.2函数定义的一般形式

821无参函数定义的一般形式

822有参函数定义的一般形式

823空函数

8.3函数参数和函数的值

8.3.1形式参数和实际参数

832函数的返回值

8.4函数的调用

8.4.1函数调用的一般形式

8.4.2函数调用的方式

8.4.3对被调用函数的声明和函数原型

8.5函数的嵌套调用

8.6函数的递归调用

8.7数组作为函数参数

871数组元素作函数实参

872数组名作函数参数

873多维数组名作函数参数

8.8局部变量和全局变量

8.8.1局部变量

882全局变量

8.9变量的存储类别

8.9.1动态存储方式与静态存储方式

8.9.2auto变量

893用static声明局部变量

894register变量

8.9.5用extern声明外部变量

896用static声明外部变量

897关于变量的声明和定义

8.9.8存储类别小结

810内部函数和外部函数

8101内部函数

8102外部函数

习题

预处理命令

9.1宏定义

9.1.1不带参数的宏定义

9.1.2带参数的宏定义

9.2“文件包含”处理

93条件编译

习题

指针

10.1地址和指针的概念

10.2变量的指针和指向变量的指针变量

10.2.1定义一个指针变量

10.2.2指针变量的引用

10.2.3指针变量作为函数参数

10.3数组与指针

10.3.1指向数组元素的指针

10.3.2通过指针引用数组元素

1033用数组名作函数参数

10.3.4多维数组与指针

10.4字符串与指针

10.4.1字符串的表示形式

10.4.2字符指针作函数参数

10.4.3对使用字符指针变量和字符数组的讨论

10.5指向函数的指针

10.5.1用函数指针变量调用函数

10.5.2用指向函数的指针作函数参数

10.6返回指针值的函数

10.7指针数组和指向指针的指针

10.7.1指针数组的概念

10.7.2指向指针的指针

10.7.3指针数组作main函数的形参

10.8有关指针的数据类型和指针运算的小结

1081有关指针的数据类型的小结

1082指针运算小结

1083void指针类型

习题

结构体与共用体

111概述

112定义结构体类型变量的方法

113结构体变量的引用

11.4结构体变量的初始化

11.5结构体数组

1151定义结构体数组

1152结构体数组的初始化

1153结构体数组应用举例

11.6指向结构体类型数据的指针

11.6.1指向结构体变量的指针

11.6.2指向结构体数组的指针

11.6.3用结构体变量和指向结构体的指针作

函数参数

11.7用指针处理链表

11.7.1链表概述

1172简单链表

1173处理动态链表所需的函数

1174建立动态链表

11.7.5输出链表

11.7.6对链表的删除 *** 作

11.7.7对链表的插入 *** 作

1178对链表的综合 *** 作

11.8共用体

11.8.1共用体的概念

11.8.2共用体变量的引用方式

11.8.3共用体类型数据的特点

11.9枚举类型312

11.10用typedef定义类型

习题

位运算

12.1位运算符和位运算

1211“按位与”运算符(&)

1212“按位或”运算符(|)

1213“异或”运算符(∧)

1214“取反”运算符(~)

1215左移运算符(<<)

1216右移运算符(>>)

1217位运算赋值运算符

1218不同长度的数据进行位运算

122位运算举例

123位段

习题

文件

13.1C文件概述

13.2文件类型指针

13.3文件的打开与关闭

13.3.1文件的打开(fopen函数)

13.3.2文件的关闭(fclose函数)

13.4文件的读写

13.4.1fputc函数和fgetc函数(putc函数和getc函数)

13.4.2fread函数和fwrite函数

13.4.3fprintf函数和fscanf函数

13.4.4其他读写函数

13.5文件的定位

13.5.1rewind函数

13.5.2fseek函数和随机读写

13.5.3ftell函数

13.6出错的检测

13.6.1ferror函数

13.6.2clearerr函数

13.7文件输入输出小结

这个是第3版

以上就是关于c语言程序设计全部的内容,包括:c语言程序设计、C语言学习、求C语言程序设计 何钦铭 颜晖 PDF,最好是第三版的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9409309.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存