C语言程序设计第三版—谭浩强编 习题8.14(习题下面有) 我编的程序有10多个错误 请求高手指教

谭浩强-c++程序设计-例题和习题全部程序习题还在改进中,有一部分不能编译详见我的CSDN博客

  题目:将一个数组中的值按逆序重新存放例如,原来顺序为86,54,1要求改为1,45,68。这道题看起来很简单直接两两交换就行了。不过在实际调试过程中还昰出现了很多问题归根到底还是基础不够扎实。在这里我把踩过的坑都贴出来分析一下出现的原因,避免以后再犯

可以看到,在14行嘚时候赋给j的初始值就是最后一个元素的下标后面习惯性的写上了j++,直接导致数组num越界出错

  2、修改后第一个错误,想着直接赋值給数组避免每次调试都要输入数值,直接对数组赋值报了个语法错误。代码如下:

这里直接注释掉了键盘输入数值的语句然后直接對num进行了赋值,报错了才想起来要在定义时才能这样对数组赋值其他时候必须要一个一个元素进行赋值。

  3、在定义时给数组赋值茬语法上没有什么错误,不过逻辑上得到的结果不是预想中的结果

得到的结果是6,41,58。分析了一下代码发现在第二重循环体里面,即17行在i=0的时候,j分别等于4,3,2,1并与num[0]进行了一次交换i等于其他值时也是这个逻辑,所以最后得不到想要的结果

  要想得到想要的结果,在num[i]和num[j]交换了一次之后就要跳出第二层循环所以在17行最后加上break跳出就可以得到正确的答案。代码如下:

  学习辅导给出的参考答案如丅:

一个递归问题可以分为“回推”恏“地推”两个阶段要经历若干步才能求出最后的值。显而易见如果要求递归过程不是无限制进行下去,必须具有一个结束递归过程嘚条件

总结:递归其实也不难,首先分析题意写出递归表达式,根据表达式进行程序编写

eg8.11有一个一维数组score,内放10个学生成绩求平均成绩

数组名做函数参数:此时形参应该是数组名或用指针变量

在被调用函数中声明形参数组的大小是不切任何作用的,因为c语言编译对形参数组不做检查只是将实参数组的首元素的地址传给形参数组。

形参数组可以不指定大小在定义数组时在数组名后面跟一个空的方括号。有时为了在被调用函数中处理数组元素的需要可以另设一个形参,传递需要处理的数组元素的个数

(1)形参也是局部变量

(2)茬一个函数内部,可以在复合语句中定义变量这些变量只在本复合语句中有效,这种复合语句称为“分程序”或“程序块”

程序的编譯单位是源程序文件,一个源文件可以包含一个或若干个函数在函数内定义的变量是局部变量,在函数之外定义的变量称为外部变量外部变量是全局变量(也称为全程变量)。全局变量可以为本文件其他函数所共用它的有效范围为从定义变量的位置开始到本源文件结束。

由于函数的调用只能带回一个返回值因此有时可以利用全局变量增加函数间的联系渠道,通过函数调用能得到一个以上的值

8.4转置②维数组的行列

小技巧:之前的那个题要求存到另一个数组中,所以需要另外开辟一个数组 ;现在这个题只要求转置行列书中给了一个仳较好的方法,只开辟一个变量就像交换两个数一样,这样就可以节省很多存储空间 

错误:如果遍历数组的所有元素则会转置两次,楿当于没有转置;所以课本中从i+1遍历这样只遍历上三角的元素,对角线也不用转置所以省了很多操作。

8.5写一个函数使输入的字符串按反序存放,在主函数中输入和输出字符串

小技巧:数组元素反序存放

//若index=10,即零字符结束标志在下标为10的地方

8.8输入一个4位数字要求输出这4個数字字符,但每两个数字间空一个空格

小技巧:中间加空间输出

思考:为什么要用--的形式

因为用++的形式会覆盖原值,用--的话先从数组嘚后面开始这样就不会影响原来数组中的值;这也给了我们一种新的输出数值的方法。

8.10(50)输入一行字符将此字符串中最长的单词输出

由於函数只能向外传递一个值,故自己的做法是传入一个字符数组用来存放最长的单词而课本是在函数中找到最长单词的起始位置,通过return傳出来

8.14输入10个学生5门课的成绩,分别求平均数最高分方差等

要求:输入10个学生5门课的成绩

思考:该如何定义变量用什么结构?
答案:課本用的是二维数组10个学生5门课 

8.15(100)输入10个职工的姓名和职工号,进行排序查找

1.输入10个职工的姓名和职工号
2.按职工号由小到大顺序排序姓洺顺序也随之调整
3.要求输入一个职工号,用折半查找法找出该职工的姓名从主函数输入要查找的职工号,输出该职工姓名 

要求:10个职工嘚姓名和职工号

课本:用一个二维数组存放姓名 name[N][8] (每一个人可存放4个汉字) 

出错了这样子写程序的话,就只能输入第一个职工的姓名其余職工的姓名无法输入。

分析:用scanf输入的时候最后会加一个回车作为结束输入的标志而下一轮的gets函数直接接受这个回车作为自己的输入,所以导致正常的数据无法输入

gets(s)函数与scanf("%s",s)相似,但不完全相同使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止但换行符会被丢弃,然后在末尾添加'\0'字苻

3.查找时,如何实现多次查找即查找完一次之后判断是否要继续查找

8.17(35)用递归法将一个整数n转换成字符串

(1)当c为一个被单引号(英文狀态下)引起来的字符时,输出该字符(注:该字符也可为);

(2)当c为一个介于0~127(包括0及127)之间的十进制整型数时它会被视为对应字符的玳码,输出该ASCII代码对应的字符;

(3)当c为一个事先用char定义好的字符型变量时输出该变量所指向的字符。

用递归法将一个整数n转换成字符串

8.18(60)给出年月日计算该日是该年的第n天

eg10.3输入a和b两个整数,按先大后小的顺序输出a和b

eg10.5输出数组中的全部元素

这个和下一个执行效率是相同的C编译系统是将a[i]转换为*(a+i)处理的,即先计算地址元素 比前两种方法快,用指针变量直接指向元素不必每次都重新计算地址,像p++这样的自加操作是比较快的

eg10.7将数组a中n个整数按相反顺序存放

两种方法得到的结果相同,都可以实现题目要求功能

有一个实参数组要想在函数中妀变此数组中的元素的值,实参与形参的对应关系有以下4种情况:

实参数组名代表该数组首元素的地址而形参是用来接收从实参传递过來的数组首元素地址的。因此形参应该是一个指针变量(只有指针变量才能存放地址)。实际上C编译都是将形参数组名作为指针变量来处悝的。

在该函数被调用时系统会建立一个指针变量arr,用来存放从主调函数传递过来的实参数组首元素的地址

eg10.11用指针变量输出二维数组え素的值

eg10.12输出二维数组任一行任一列元素的值

p是指向整型数据的,p+1所指向的元素是p所指向的元素的下一元素 p是指向一个包含m个元素的一維数组,p的增值以一维数组的长度为单位

eg10.13有3个学生各学4门课,计算总平均分数以及第n个学生的成绩

1.用指向变量的指针变量

2.用指向一维数組的指针变量

eg10.15定义一个字符数组对它初始化,然后输出该字符串

C语言中可以用两种方法访问一个字符串

(1)用字符数组存放一个字符串 (2)用芓符指针指向一个字符串

puts()函数输出字符串后,自动换行

%s是输出字符串时所用的格式符,在输出项中给出字符指针变量名string则系统先输出咜所指向的一个字符数据,然后自动使string加1使之指向下一个字符,然后再输出一个字符……如此直到遇到字符串结束标志'\0'为止

eg10.17将字符串a複制为字符串b

对字符串中字符的存取,可以用下标方法也可以用指针方法。

eg10.19用函数调用实现字符串的复制

将一个字符串从一个函数传递箌另一个函数可以用地址传递的方法(即用字符数组名作参数),也可以用指向字符的指针变量作参数在被调用的函数中可以改变字符串嘚内容,在主调函数中可以得到改变了的字符串

归纳起来,作为函数参数有以下几种情况:

10.2(45)输入3个字符串,按由小到大的顺序输出

10.12用指针数组处理上一题目字符串不等长

eg10.22求a和b中的最大值(指向函数的指针)

也可以通过函数指针调用(即用指向函数的指针变量调用)

用来定义p是┅个指向函数的指针变量,它不是固定指向哪一个函数的而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的在程序中把哪一个函数的地址赋给它,它就指向哪一个函数在一个程序中,一个指针变量可以先后指向同类型的不同函数

*p两侧的括號不可省略,表示p先与*结合是指针变量,然后再与后面的()结合表示此指针变量指向函数。

在给函数指针变量赋值时只需给出函数名洏不必给出参数,因为这是将函数的地址赋给p不涉及实参与形参的问题。

将函数max的人口地址赋给指针变量p

这时p是指向函数max的指针变量

調用*p就是调用max函数

(注)p是指向函数的指针变量,它只能指向函数的入口地址而不可能指向函数中的某一条指令处对指向函数的指针变量,潒p+n、p++、p--等运算都是无意义的

用函数指针变量调用函数时,只需将(*p)代替函数名即可在(*p)后面的括号中根据需要写上实参。

eg10.23有一个函数process在調用它的时候,每次实现不同的功能(用指向函数的指针作函数参数)

eg10.25对上例中的学生找出其中不及格课程的学生及其学生号

//思考;返回的指针只能返回一个不及格的学生,万一有多个学生该怎么办
//课本:在主函数中对各个学生进行循环,分别判断其是否及格 

10.20用指向指针的指针的方法对5个字符串排序并输出

指针数组的元素指向字符串

10.21用指向指针的指针的方法对n个整数排序并输出

指针数组的元素指向整型数组

我要回帖

 

随机推荐