c++谭浩强第二版课后题答案

c++谭浩强第二版课后题答案,第1张

这里有第一章的:

谭浩强C++课后习题答案

1.请根据你的了解,叙述C++ 的特点。C++ 对C有哪些发展?

【解】 略。

2.一个C++的程序是由哪几部分构成的?其中的每一部分起什么作用?

【解】 略。

3.从拿到一个任务到得到最终结果,一般要经过几个步骤?

【解】 略。

4.请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?

【解】 编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对它们编译之后,得到若干个目标文件(后缀一般为.obj),然后要将它们连接为一个整体。此外,还需要与编译系统提供的标准库相连接,才能生成一个可执行文件(后缀为.exe)。不能直接运行后缀为.obj的目标文件,只能运行后缀为.exe的可执行文件。

5.分析下面程序运行的结果。

#include <iostream>

using namespace std

int main( )

{

cout<<" This "<<" is "

cout<<" a "<<" C++ "

cout<<"program. " <<endl

return 0

}

【解】 输出的结果为

ThisisaC++program.

6.分析下面程序运行的结果。

#include <iostream>

using namespace std

int main( )

{

int a,b,c

a=10

b=23

c=a+b

cout<<" a+b="

cout<<c

cout<<endl

return 0

}

【解】 前两个cout语句在输出数据后不换行,第3个cout语句输出一个换行,因此输出的结果为

a+b=33

7.分析下面程序运行的结果。请先阅读程序写出程序运行时应输出的结果,然后上机运行程序,验证自己分析的结果是否正确。以下各题同。

#include <iostream>

using namespace std

int main( )

{

int a,b,c

int f(int x,int y,int z)

cin>>a>>b>>c

c=f(a,b,c)

cout<<c<<endl

return 0

}

int f(int x,int y,int z)

{

int m

if (x<y) m=x

 else m=y

if (z<m) m=z

return(m)

}

【解】 程序的作用是:输入3个整数,然后输出其中值最小的数。在主函数中输入3个整数,然后调用f函数,在f函数中实现找最小的整数,用if语句比较两个数,将小者存放在变量m中,经过两个if语句的比较,m中存放的是3个整数中最小的数。运行情况如下:

1 5 3↙(输入3个整数)

1 (输出其中最小的数)

8.在你所用的C++系统上,输入以下程序,进行编译,观察编译情况,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果。

int main( )

{

int a,b

c=a+b

cout >>" a+b=" >>a+b

}

【解】 上机编译出错,编译出错信息告知在第2行出错,经检查,发现第1行的末尾多了一个分号,编译系统无法理解第2行的花括号,导致报告第2行出错。将第1行的末尾的分号去掉,重新编译,编译出错信息告知在第5行和第6行出错。第5行出错原因是cout未经声明,因为cout不是C++语言提供的系统的关键字,而是输出流的对象,必须使用头文件iostream。第6行出错原因是main是int型函数,应返回一个整型值。将程序改为

#include <iostream>

int main( )

{

int a,b

c=a+b

cout >>" a+b=" >>a+b

return 0

}

重新编译。编译出错信息告知在第5行和第6行出错。第5行出错原因是变量c未定义,第6行出错原因是cout未经声明,说明#include <iostream>命令行未能起作用,原因是未指明命名空间。将程序改为

#include <iostream>

using namespace std

int main( )

{

int a,b,c

c=a+b

cout>>" a+b=" >>a+b

return 0

}

重新编译。编译出错信息告知在第7行出错,经检查,是“>>”用得不当,“>>”是提取运算符,应与cin联合使用,用来从输入流中提取数据,输出时应该用插入运算符“<<”。把两处“>>”都改为“<<”,再重新编译,发现没有error错误,但有两个警告(warning),原因是定义了a和b,但未对它们赋值。应增加赋值语句或输入语句,使a和b获得值,将程序改为

#include <iostream>

using namespace std

int main( )

{

int a,b,c

cin>>a>>b

c=a+b

cout>>" a+b=" >>a+b

return 0

}

重新编译,没有编译错误,能通过编译和连接,可以正常运行,在Visual C++ 6.0环境下运行时屏幕显示如下:

5 9↙

a+b=14Press any key to continue

显然这样的输出不理想,“Press any key to continue”是Visual C++系统在输出了运行结果后自动显示的一个信息,告诉用户“如果想继续工作,请按任何一个键”。当用户按任何一个键后,显示运行结果的窗口消失,屏幕显示回到Visual C++的主窗口,显示出源程序和编译信息。

为了解决以上输出不理想的情况,可以在最后一个输出语句中增加输出一个换行符。最后的程序如下:

#include <iostream>

using namespace std

int main( )

{

int a,b,c

cin>>a>>b

c=a+b

cout<<"a+b="<<a+b<<endl

return 0

}

运行时屏幕显示如下:

5 9↙

a+b=14

Press any key to continue

这就完成了程序的调试。

这里对本题的调试过程作了比较详细的分析,以便使读者对如何调试程序有比较具体而清晰的了解。需要说明:

(1)编译系统给出的编译出错信息,只是提示性的,引导用户去检查错误,用户必须根据程序的上下文和编译出错信息,全面考虑,找出真正出错之处。例如编译出错信息通知第2行出错,其实可能是第1行出错。

(2)有时,有的错误开始时未被检查出来并告知用户(例如未定义变量c),由于其他错误未解决,掩盖了这个错误。当解决了其他错误后,这个错误会被检查出来。有时在调试过程中会不断检查出新的错误,这是不奇怪的。一一处理,问题会迎刃而解。

(3)为了说明调试过程,这里全部依靠计算机系统来检查错误,其实有些明显的错误,完全可以由人工查出,这样可以提高调试效率。由人工在纸面或屏幕上检查错误,称为静态查错,用计算机编译系统检查错误,称为动态查错。建议尽量先用静态查错的方法排除错误,只有人工检查不出来的错误才让计算机检查。

9.输入以下程序,进行编译,观察编译情况,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果。

#include <iostream>

using namespace std

int main( )

{

int a,b

c=add(a,b)

cout<<"a+b="<<c<<endl

return 0

}

int add(int x,int y)

{

z=x+y

retrun(z)

}

【解】 发现7个错误:

(1)对add函数未声明就调用,应在main函数中对add函数进行声明。

(2)定义add函数时,函数首行末尾不应有分号。

(3)变量c未经定义。

(4)add函数中的变量z未经定义。

(5)第6行末尾少了一个分号。

(6)add函数中的retrun拼写错误,应为return。编译系统把retrun作为未声明的标识符而报错,因为retrun(z)会被认为是函数调用的形式。

(7)变量a和b未被赋值。

改正后的程序如下:

#include <iostream>

using namespace std

int main( )

{int add(int x,int y)

int a,b,c

cin >>a >>b

c=add(a,b)

cout <<" a+b=" <<c <<endl

return 0

}

int add(int x,int y)

{int z

z=x+y

return(z)

}

运行情况如下:

5 8↙

13

10.输入以下程序,编译并运行,分析运行结果。

#include <iostream>

using namespace std

int main( )

{ void sort(int x,int y,int z)

int x,y,z

cin >>x >>y >>z

sort(x,y,z)

return 0

}

void sort(int x, int y, int z)

{

int temp

if (x>y) {temp=xx=yy=temp} //{ }内3个语句的作用是将x和y的值互换

if (z<x) cout <<z <<',' <<x <<',' <<y <<endl

else if (z<y) cout <<x <<',' <<z <<',' <<y <<endl

else cout <<x <<',' <<y <<',' <<z <<endl

}

请分析此程序的作用。sort函数中的if语句是一个嵌套的if语句。

运行时先后输入以下几组数据,观察并分析运行结果。

① 3 6 10↙

② 6 3 10↙

③ 10 6 3↙

④ 10,6,3↙

【解】 程序的作用是对输入的3个整数按由小到大的顺序进行排序。sort函数中的第1个if语句的作用是先将x和y排序,使x小于或等于y。第2个if语句是一个嵌套的if语句,先比较z和x,如果z<x,显然由小到大的顺序应当是z,x,y,按此顺序输出;如果z不小于x,而小于y,显然由小到大的顺序应当是x,z,y,按此顺序输出;如果z既不小于x,又不小于y,显然由小到大的顺序应当是x,y,z,按此顺序输出。

按题目要求分别输入以下几组数据,运行结果如下:

① 3 6 10↙

3,6,10

② 6 3 10↙

3,6,10

③ 10 6 3↙

3,6,10

④ 10,6,3↙

-858993460,-858993460,10

以上是在Visual C++ 6.0环境下运行的情况,前3次运行正常,表明当输入不同的数据时,程序能实现由小到大的排序功能。第4次运行的结果显然不正常,这是由于输入数据时出了问题,本来要求在输入数据时,数据之间以空格或换行相隔,而现在却以逗号相隔,只有第一个整数能正常赋给变量x,第二和第三个数据均无法正常赋给变量y和z,y和z的值来自输入流中相应字节的内容。

11.求2个或3个正整数中的最大数,用带有默认参数的函数实现。

【解】 可以编写出以下程序:

#include <iostream>

using namespace std

int main( )

{int max(int a,int b,int c=0)

int a,b,c

cin >>a >>b >>c

cout <<" max(a,b,c)= " <<max(a,b,c) <<endl

cout <<" max(a,b)= " <<max(a,b) <<endl

return 0

}

int max(int a,int b,int c)

{if(b>a) a=b

if(c>a) a=c

return a

}

运行情况如下:

13 5 76↙

max(a,b,c)=76 (从3个数中找最大者)

max(a,b)=13 (从前2个数中找最大者)

如果想从3个数中找大者,可以在调用时写成“max(a,b,c)”形式,如果只想从2个数中找大者,则在调用时写成“max(a,b)”形式,此时c自动取默认值0,由于0比任何正整数都小,因此从14,5,0中选最大者和从14,5中选大者的结果是一样的。

12.输入两个整数,将它们按由大到小的顺序输出。要求使用变量的引用。

【解】 可以编写出以下程序:

#include<iostream>

using namespace std

int main( )

{ void change(int &,int &)

int a,b

cin>>a>>b

if(a<b) change(a,b)//如果a<b,使a和b的值互换

cout<<"max="<<a<<" min="<<b<<endl

return 0

}

void change(int &r1,int &r2) //函数的作用是使r1与r2互换

{ int temp

temp=r1

r1=r2

r2=temp

}

运行情况如下:

12 67↙

max=67 min=12

13.对3个变量按由小到大顺序排序,要求使用变量的引用。

【解】 可以编写出以下程序:

#include <iostream>

using namespace std

int main( )

{void sort(int &,int &,int &)

int a,b,c,a1,b1,c1

cout<<" Please enter 3 integers:"

cin>>a>>b>>c

a1=ab1=bc1=c

sort(a1,b1,c1)

cout<<a<<" "<<b<<" "<<c<<" in sorted order is "

cout<<a1<<" "<<b1<<" "<<c1<<endl

return 0

}

void sort(int &i,int &j,int &k)

{ void change(int &,int &)

if (i>j) change(i, j)

if (i>k) change(i, k)

if (j>k) change(j, k)

}

void change(int &x,int &y)

{ int temp

temp=x

x=y

y=temp

}

运行情况如下:

Please enter 3 integers:23 67 -55↙

23 67 –55 in sorted order is –55 23 67

这个程序很容易理解,不易出错。由于在调用sort函数时虚实结合使形参i,j,k成为实参a1,b1,c1的引用(别名),因此通过调用函数sort(a1,b1,c1)既实现了对i,j,k排序,也就同时实现了对a1,b1,c1排序。同样,执行change(i,j)函数,可以实现对实参i和j的互换。

14.编一程序,将两个字符串连接起来,结果取代第一个字符串。要求用string方法。

【解】 可以编写出以下程序:

#include <iostream>

#include <string> //程序中若使用字符串变量,必须包含头文件string

using namespace std

int main( )

{ string s1= " week ",s2= " end "

cout <<" s1= " <<s1 <<endl

cout <<"s2=" <<s2 <<endl

s1=s1+s2

cout<<" The new string is: "<<s1<<endl

return 0

}

运行情况如下:

s1=week

s2=end

The new string is: weekend

15.输入一个字符串,把其中的字符按逆序输出。如输入LIGHT,输出THGIL。要求用string方法。

【解】 可以编写出以下程序:

#include <iostream>

#include <string>

using namespace std

int main( )

{ string str   //定义字符串变量str

int i,n

char temp //定义字符变量temp

cout<<" please input a string: "

cin>>str //输入一个字符串赋给字符串变量str

n=str.size( ) //测量str的长度n

for(i=0i<n/2i++) //使str中的字符对称互换

{temp=str[i]str[i]=str[n-i-1]str[n-i-1]=temp}

cout <<str <<endl

return 0

}

运行情况如下:

please input a string:

LIGHT↙

THGIL

注意:输入的字符串中不能含有空格。

16.有5个字符串,要求将它们按由小到大的顺序排列,用string方法。

【解】 可以编写出以下程序:

#include <iostream>

#include <string>

using namespace std

int main( )

{ int i

string str[5]={" BASIC"," C"," FORTRAN"," C++","PASCAL"}

void sort(string [ ])

sort(str)//对字符串排序

cout<<" the sorted strings : "<<endl

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

cout<<str[i]<<" " //按已排好的顺序输出字符串

cout<<endl

return 0

}

void sort(string s[ ])

{int i, j

string t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

{t=s[i]s[i]=s[i+1]s[i+1]=t}

}

运行结果如下:

the sorted strings :

BASIC C C++ FORTRAN PASCAL

17.编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型。用重载函数实现。

【解】 可以编写出以下两个程序:

(1)建立3个函数,分别用于处理整型、单精度型、双精度型数据的排序,在3个函数中都采用选择法排序方法。

#include <iostream>

#include <string>

using namespace std

int main( )

{

long a[5]={10100,-123567, 1198783,-165654, 3456}

int b[5]={1,9,0,23,-45}

float c[5]={2.4, 7.6, 5.5, 6.6, -2.3 }

void sort(long [ ])

void sort(int [ ])

void sort(float [ ])

sort(a)

sort(b)

sort(c)

return 0

}

void sort(long a[ ])

{int i, j

long t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

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

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

void sort(int a[ ])

{int i, j, t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

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

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

void sort(float a[ ])

{int i, j

float t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

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

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

运行结果如下:

the sorted numbers :

-123567 -165654 10100 3456 1198783 (长整型数据排序)

the sorted numbers :(整型数据排序)

-45 0 1 9 23

the sorted numbers :

-2.3 2.4 5.5 6.6 7.6 (单精度型数据排序)

(2)在第1种方法中,3个函数的函数体基本上是相同的,都是采用选择法排序,在下面的程序中,3个函数的函数体不全相同,前两个函数采用选择法排序,最后一个函数采用起泡法排序。

#include <iostream>

#include <string>

using namespace std

int main( )

{ long a[5]= {10100,-123567, 1198783,-165654, 3456}

int b[5]={1,9,0,23,-45}

float c[5]={2.4, 7.6, 5.5, 6.6, -2.3 }

void sort(int [ ])

void sort(float [ ])

void sort(long [ ])

sort(a)//对长整型数据排序

sort(b)//对整型数据排序

sort(c)//对单精度型数据排序

return 0

}

void sort(long a[ ]) //对长整型数据用选择法排序的函数

{int i,j,min

long t

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

{min=i

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

if(a[min]>a[j]) min=j

{t=a[i]a[i]=a[min] a[min]=t}

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

void sort(int a[ ])//对整型数据用选择法排序的函数

{int i, j, t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

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

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

void sort(float a[ ]) //对单精度型数据用起泡法排序的函数

{int i, j

float t

for (j=0j<5j++)

for(i=0i<5-ji++)

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

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

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

运行结果如下:

the sorted numbers :

-123567 -165654 10100 3456 1198783 (长整型数据排序结果)

the sorted numbers : (整型数据排序结果)

-45 0 1 9 23

the sorted numbers :

-2.3 2.4 5.5 6.6 7.6(单精度型数据排序结果)

对比两种方法,可以看到,并不要求重载函数的函数体相同,在本例中,采用不同的排序方法,结果是相同的。从理论上说,重载的函数可以用来实现完全不同的功能,但是应该注意:同一个函数名最好用来实现相近的功能,而不要用来实现完全不相干的功能,以方便用户理解和使用。

18.对第17题改用函数模板实现。并与17题程序进行对比分析。

#include <iostream>

#include <string>

using namespace std

template <typename T >

void sort(T a[ ])//函数模板,采用选择法排序

{int i, j, min

T t

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

{min=i

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

if(a[min]>a[j]) min=j

t=a[i]a[i]=a[min]a[min]=t

}

cout<<" the sorted numbers : "<<endl

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

cout<<a[i]<<" "

cout<<endl<<endl

}

int main( )

{ long a[5]={10100,-123567, 1198783,-165654, 3456}

int b[5]={1,9,0,23,-45}

float c[5]={2.4, 7.6, 5.5, 6.6, -2.3 }

sort(a)

sort(b)

sort(c)

return 0

}

运行结果如下:

the sorted numbers :

-123567 -165654 10100 3456 1198783(长整型数据排序)

the sorted numbers : (整型数据排序)

-45 0 1 9 23

the sorted numbers :

-2.3 2.4 5.5 6.6 7.6 (单精度型数据排序)

对比第17题和18题,可以看到,如果重载函数的函数体基本相同的话,用函数模板显然更方便,可以压缩程序篇幅,使用方便。

第一章

1.6

main()

{int a,b,c,max

printf("input three numbers:\n")

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

max=a

if(max<b)max=b

if(max<c)max=c

printf("max=%d",max)

}

第二章

2.3

(1)(10)10=(12)8=(a)16

(2)(32)10=(40)8=(20)16

(3)(75)10=(113)8=(4b)16

(4)(-617)10=(176627)8=(fd97)16

(5)(-111)10=(177621)8=(ff91)16

(6)(2483)10=(4663)8=(963)16

(7)(-28654)10=(110022)8=(9012)16

(8)(21003)10=(51013)8=(520b)16

2.6

aabb(8)cc(8)abc

(7)AN

2.7

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)

}

2.8

main()

{int c1,c2

c1=97c2=98

printf("%c %c",c1,c2)

}

2.9

(1)=2.5

(2)=3.5

2.10

9,11,9,10

2.12

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

第三章

3.4

main()

{int a,b,c

long int u,n

float x,y,z

char c1,c2

a=3b=4c=5

x=1.2y=2.4z=-3.6

u=51274n=128765

c1='a'c2='b'

printf("\n")

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

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

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

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

printf("c1='%c'or %d(ASCII)\n",c1,c1)

printf("c2='%c'or %d(ASCII)\n",c2,c2)

}

3.5

57

5 7

67.856400,-789.123962

67.856400,-789.123962

67.86 -789.12,67.856400,-789.123962,67.856400,-789.123962

6.785640e+001,-7.89e+002

A,65,101,41

1234567,4553207,d687

65535,177777,ffff,-1

COMPUTER, COM

3.6

a=3 b=7/

x=8.5 y=71.82/

c1=A c2=a/

3.7

10 20Aa1.5 -3.75 +1.4,67.8/

(空3)10(空3)20Aa1.5(空1)-3.75(空1)(随意输入一个数),67.8回车

3.8

main()

{float pi,h,r,l,s,sq,sv,sz

pi=3.1415926

printf("input r,h\n")

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

l=2*pi*r

s=r*r*pi

sq=4*pi*r*r

sv=4.0/3.0*pi*r*r*r

sz=pi*r*r*h

printf("l=%6.2f\n",l)

printf("s=%6.2f\n",s)

printf("sq=%6.2f\n",sq)

printf("vq=%6.2f\n",sv)

printf("vz=%6.2f\n",sz)

}

3.9

main()

{float c,f

scanf("%f",&f)

c=(5.0/9.0)*(f-32)

printf("c=%5.2f\n",c)

}

3.10

#include"stdio.h"

main()

{char c1,c2

scanf("%c,%c",&c1,&c2)

putchar(c1)

putchar(c2)

printf("\n")

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

}

第四章

4.3

(1)0 (2)1 (3)1 (4)0 (5)1

4.4

main()

{int a,b,c

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)

}

main()

{int a,b,c,temp,max

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

temp=(a>b)?a:b

max=(c>temp)?c:temp

printf("max=%d",max)

}

4.5

main()

{int x,y

scanf("%d",&x)

if(x<1)y=x

else if(x<10)y=2*x-1

else y=3*x-11

printf("y=%d",y)

}

4.6

main()

{int score,temp,logic

char grade

logic=1

while(logic)

{scanf("%d",&score)

if(score>=0&&score<=100)logic=0

}

if(score==100)

temp=9

else

temp=(score-score%10)/10

switch(temp)

{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 2:

case 1:

case 0:grade='E'

}

printf"score=%d,grade=%c",score,grade)

}

4.7

main()

{long int num

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

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-ten_thousand*10000)/1000

hundred=(num-ten_thousand*10000-thousand*1000)/100

ten=(num-ten_thousand*10000-thousand*1000-hundred*100)/10

indiv=num-ten_thousand*10000-thousand*1000-hundred*100-ten*10

switch(place)

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

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

break

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

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

break

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

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

break

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

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

break

case 1:printf("%d\n",indiv)

printf("%d\n",indiv)

}

}

4.8

main()

{long i

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

bon1=100000*0.1

bon2=bon1+100000*0.075

bon4=bon2+200000*0.05

bon6=bon4+200000*0.03

bon10=bon6+400000*0.015

scanf("%ld",&i)

if(i<=1e5)bonus=i*0.1

else if(i<=2e5)bonus=bon1+(i-100000)*0.075

else if(i<=4e5)bonus=bon2+(i-200000)*0.05

else if(i<=6e5)bonus=bon4+(i-400000)*0.03

else if(i<=1e6)bonus=bon6+(i-600000)*0.015

else bonus=bon10+(i-1000000)*0.01

printf("bonus=%10.2f",bonus)

}

main()

{long i

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

int branch

bon1=100000*0.1

bon2=bon1+100000*0.075

bon4=bon2+200000*0.05

bon6=bon4+200000*0.03

bon10=bon6+400000*0.015

scanf("%ld",&i)

branch=i/100000

if(branch>10)branch=10

switch(branch)

{case 0:bonus=i*0.1break

case 1:bonus=bon1+(i-100000)*0.075break

case 2:

case 3:bonus=bon2+(i-200000)*0.05break

case 4:

case 5:bonus=bon4+(i-400000)*0.03break

case 6:

case 7

case 8:

case 9:bonus=bon6+(i-600000)*0.015break

case 10:bonus=bon10+(i-1000000)*0.01

}

printf("bonus=%10.2f",bonus)

}

4.9

main()

{int t,a,b,c,d

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

if(a>b){t=aa=bb=t}

if(a>c){t=aa=cc=t}

if(a>d){t=aa=dd=t}

if(b>c){t=bb=cc=t}

if(b>d){t=bb=dd=t}

if(c>d){t=cc=dd=t}

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

}

4.10

main()

{int h=10

float x,y,x0=2,y0=2,d1,d2,d3,d4

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

d1=(x-x0)*(x-x0)+(y-y0)*(y-y0)

d2=(x-x0)*(x-x0)+(y+y0)*(y+y0)

d3=(x+x0)*(x+x0)+(y-y0)*(y-y0)

d4=(x+x0)*(x+x0)+(y+y0)*(y+y0)

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

printf("h=%d",h)

}

第五章 循环控制

5.1

main()

{int a,b,num1,num2,temp

scanf("%d,%d",&num1,&num2)

if(num1<num2){temp=num1num1=num2num2=temp}

a=num1b=num2

while(b!=0)

{temp=a%b

a=b

b=temp}

printf("%d\n",a)

printf("%d\n",num1*num2/a)

}

5.2

#include"stdio.h"

main()

{char c

int letters=0,space=0,digit=0,other=0

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("letters=%d\nspace=%d\ndigit=%d\nother=%d\n",letters,space,digit,other)

}

5.3

main()

{int a,n,count=1,sn=0,tn=0

scanf("%d,%d",&a,&n)

while(count<=n)

{tn+=a

sn+=tn

a*=10

++count

}

printf("a+aa+aaa+...=%d\n",sn)

}

5.4

main()

{float n,s=0,t=1

for(n=1n<=20n++)

{t*=n

s+=t

}

printf("s=%e\n",s)

}

5.5

main()

{int N1=100,N2=50,N3=10

float k

float s1=0,s2=0,s3=0

for(k=1k<=N1k++)s1+=k

for(k=1k<=N2k++)s2+=k*k

for(k=1k<=N3k++)s3+=1/k

printf("s=%8.2f\n",s1+s2+s3)

}

5.6

main()

{int i,j,k,n

for(n=100n<1000n++)

{i=n/100

j=n/10-i*10

k=n%10

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

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

}

}

5.7

#define M 1000

main()

{int k0,k1,k2,k3,k4,k5,k6,k7,k8,k9

int i,j,n,s

for(j=2j<=Mj++)

{n=0

s=j

for(i=1i<ji++)

{if((j%i)==0)

{n++

s=s-i

switch(n)

{case 1:k0=ibreak

case 2:k1=ibreak

case 3:k2=ibreak

case 4:k3=ibreak

case 5:k4=ibreak

case 6:k5=ibreak

case 7:k6=ibreak

case 8:k7=ibreak

case 9:k8=ibreak

case 10:k9=ibreak

}

}

}

if(s==0)

{printf("j=%d\n",j)

if(n>1)printf("%d,%d",k0,k1)

if(n>2)printf(",%d",k2)

if(n>3)printf(",%d",k3)

if(n>4)printf(",%d",k4)

if(n>5)printf(",%d",k5)

if(n>6)printf(",%d",k6)

if(n>7)printf(",%d",k7)

if(n>8)printf(",%d",k8)

if(n>9)printf(",%d\n",k9)

}

}

}

main()

{static int k[10]

int i,j,n,s

for(j=2j<=1000j++)

{n=-1

s=j

for(i=1i<ji++)

{if((j%i)==0)

{n++

s=s-i

k[n]=i

}

}

if(s==0)

{printf("j=%d\n",j)

for(i=0i<ni++)

printf("%d,",k[i])

printf("%d\n",k[n])

}

}

}

5.8

main()

{int n,t,number=20

float a=2b=1s=0

for(n=1n<=numbern++)

{s=s+a/b

t=a,a=a+b,b=t

}

printf("s=%9.6f\n",s)

}

5.9

main()

{float sn=100.0,hn=sn/2

int n

for(n=2n<=10n++)

{sn=sn+2*hn

hn=hn/2

}

printf("sn=%f\n",sn)

printf("hn=%f\n",hn)

}

5.10

main()

{int day,x1,x2

day=9

x2=1

while(day>0)

{x1=(x2+1)*2

x2=x1

day--

}

printf("x1=%d\n",x1)

}

5.11

#include"math.h"

main()

{float a,xn0,xn1

scanf("%f",&a)

xn0=a/2

xn1=(xn0+a/xn0)/2

do

{xn0=xn1

xn1=(xn0+a/xn0)/2

}

while(fabs(xn0-xn1)>=1e-5)

printf("a=%5.2f\n,xn1=%8.2f\n",a,xn1)

}

5.12

#include"math.h"

main()

{float x,x0,f,f1

x=1.5

do

{x0=x

f=((2*x0-4)*x0+3)*x0-6

f1=(6*x0-8)*x0+3

x=x0-f/f1

}

while(fabs(x-x0)>=1e-5)

printf("x=%6.2f\n",x)

}

5.13

#include"math.h"

main()

{float x0,x1,x2,fx0,fx1,fx2

do

{scanf("%f,%f",&x1,&x2)

fx1=x1*((2*x1-4)*x1+3)-6

fx2=x2*((2*x2-4)*x2+3)-6

}

while(fx1*fx2>0)

do

{x0=(x1+x2)/2

fx0=x0*((2*x0-4)*x0+3)-6

if((fx0*fx1)<0)

{x2=x0

fx2=fx0

}

else

{x1=x0

fx1=fx0

}

}

while(fabs(fx0)>=1e-5)

printf("x0=%6.2f\n",x0)

}

5.14

main()

{int i,j,k

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

{for(j=0j<=2-ij++)

printf(" ")

for(k=0k<=2*ik++)

printf("*")

printf("\n")

}

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

{for(j=0j<=ij++)

printf(" ")

for(k=0k<=4-2*ik++)

printf("*")

printf("\n")

}

}

5.15

main()

{char i,j,k

for(i='x'i<='z'i++)

for(j='x'j<='z'j++)

{if(i!=j)

for(k='x'k<='z'k++)

{if(i!=k&&j!=k)

{if(i!='x'&&k!='x'&&k!='z')

printf("\na--%c\tb--%c\tc--%c\n",i,j,k)

}

}

}

}

第六章 数组

6.1

#include <math.h>

#define N 101

main()

{ int i,j,line,a[N]

for (i=2i<Ni++) a[i]=i

for (i=2i<sqrt(N)i++)

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

{if(a[i]!=0 &&a[j]!=0)

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

a[j]=0 }

printf("\n")

for (i=2,line=0i<Ni++)

{ if(a[i]!=0)

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

line++ }

if(line==10)

{ printf("\n")

line=0 }

}

}

6.2

#define N 10

main()

{int i,j,min,temp,a[N]

for(i=0i<Ni++)

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

for(i=0i<N-1i++)

{min=i

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

if(a[min]>a[j])min=j

temp=a[i]

a[i]=a[min]

a[min]=temp

}

for(i=0i<Ni++)

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

}

6.3

main()

{float a[3][3],sum

int i,j

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

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

{scanf("%f",&sum)

a[i][j]=sum

}

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

sum=sum+a[i][i]

printf("sum=%f",sum)

}

6.4

main()

{int a[11]={1,4,6,9,13,16,19,28,40,100}

int temp1,temp2,number, end,i,j

scanf("%d",&number)

end=a[9]

if(number>end) a[10]=number

else

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

{if(a[i]>number)

{temp1=a[i]

a[i]=number

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

{temp2=a[j]

a[j]=temp1

temp1=temp2

}

break

}

}

}

for(i=0i<11i++)

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

}

6.5

#define N 5

main()

{int a[N]={8,6,5,4,1},i,temp

for(i=0i<N/2i++)

{temp=a[i]

a[i]=a[N-i-1]

a[N-i-1]=temp

}

for(i=0i<Ni++)

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

}

6.6

#define N 11

main()

{int i,j,a[N][N]

for(i=1i<Ni++)

{a[i][i]=1

a[i][1]=1

}

for(i=3i<Ni++)

for(j=2j<ij++)

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

for(i=1i<Ni++)

{for(j=1j<=ij++)

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

printf("\n")

}

}

6.7

main()

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

p=1

while(p==1)

{scanf("%d",&n)

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

}

for(i=1i<=ni++)

for(j=1j<=nj++)

a[i][j]=0

j=n/2+1

a[1][j]=1

for(k=2k<=n*nk++)

{i=i-1

j=j+1

if((i<1)&&(j>n))

{i=i+2

j=j-1

}

else

{if(i<1)i=n

if(j>n)j=1

}

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

else

{i=i+2

j=j-1

a[i][j]=k

}

}

for(i=1i<=ni++)

{for(j=1j<=nj++)

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

printf("\n")

}

}

6.8

#define N 10

#define M 10

main()

{int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj

scanf("%d,%d",&n,&m)

for(i=0i<ni++)

for(j=0j<mj++)

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

flag2=0

for(i=0i<ni++)

{max=a[i][0]

for(j=0j<mj++)

if(max<a[i][j])

{max=a[i][j]

maxj=j

}

for(k=0,flag1=1k<n&&flag1k++)

if(max>a[k][maxj])flag1=0

if(flag1)

{ printf("\na[%d][%d]=%d\n",i,maxj,max)

flag2=1

}

}

if(!flag2) printf("NOT")

}

6.9

#include<stdio.h>

#define N 15

main()

{int i,j,number,top,bott,min,loca,a[N],flag

char c

for(i=0i<=Ni++)

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

flag=1

while(flag)

{scanf("%d",&number)

loca=0

top=0

bott=N-1

if((number<a[0])||(number>a[N-1]))

loca=-1

while((loca==0)&&(top<=bott))

{min=(bott+top)/2

if(number==a[min])

{loca=min

printf("number=%d,loca=%d\n",number,loca+1)

}

else if(number<a[min])

bott=min-1

else

top=min+1

}

if(loca==0||loca==-1)

printf("%d not in table\n",number)

printf("continue Y/N or y/n\n")

c=getchar()

if(c=='N'||c=='n')flag=0

}

}

6.10

main()

{int i,j,uppn,lown,dign,span,othn

char text[3][80]

uppn=lown=dign=span=othn=0

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

{gets(text[i])

for(j=0j<80&&text[i][j]!='\0'j++)

{if(text[i][j]>='A'&&text[i][j]<='Z')

uppn++

else if(text[i][j]>='a'&&text[i][j]<='z')

lown++

else if(text[i][j]>='0'&&text[i][j]<='9')

dign++

else if(text[i][j]==' ')

span++

else

othn++

}

}

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

printf("%s\n",text[i])

printf("uppn=%d\n",uppn)

printf("lown=%d\n",lown)

printf("dign=%d\n",dign)

printf("span=%d\n",span)

printf("othn=%d\n",othn)

}

6.11

main()

{static char a[5]={'*','*','*','*','*'}

int i,j,k

char space=' '

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

{printf("\n")

for(j=1j<=3*ij++)

printf("%1c",space)

for(k=0k<=5k++)

printf("%3c",a[k])

}

}

6.12

#include<stdio.h>

main()

{int i,n

char ch[80],tran[80]

gets(ch)

i=0

while(ch[i]!='\0')

{if((ch[i]>='A')&&(ch[i]<='Z'))

tran[i]=26+64-ch[i]+1+64

else if((ch[i]>='a')&&(ch[i]<='z'))

tran[i]=26+96-ch[i]+1+96

else

tran[i]=ch[i]

i++

}

n=i

for(i=0i<ni++)

putchar(tran[i])

}

6.13

main()

{char s1[80],s2[40]

int i=0,j=0

scanf("%s",s1)

scanf("%s",s2)

while(s1[i]!='\0')i++

while(s2[j]!='\0')s1[i++]=s2[j++]

s1[i]='\0'

printf("s=%s\n",s1)

}

6.14

#include<stdio.h>

main()

{int i,resu

char s1[100],s2[100]

gets(s1)

gets(s2)

i=0

while((s1[i]==s2[i])&&(s1[i]!='\0'))i++

if(s1[i]=='\0'&&s2[i]=='\0')resu=0

else

resu=s1[i]-s2[i]

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

}

6.15

#include"stdio.h"

main()

{char from[80],to[80]

int i

scanf("%s",from)

for(i=0i<=strlen(from)i++)

to[i]=from[i]

printf("%s\n",to)

}

第七章

7.1

hcf(u,v)

int u,v

{int a,b,t,r

if(u>v){t=uu=vv=t}

a=ub=v

while((r=b%a)!=0)

{b=aa=r}

return(a)

}

lcd(u,v,h)

int u,v,h

{return(u*v/h)}

main()

{int u,v,h,l

scanf("%d,%d",&u,&v)

h=hcf(u,v)

printf("H.C.F=%d\n",h)

l=lcd(u,v,h)

printf("L.C.D=%d\n",l)

}

7.2

#include"math.h"

float x1,x2,disc,p,q

greater_than_zero(a,b)

float a,b

{x1=(-b+sqrt(disc))/(2*a)

x2=(-b-sqrt(disc))/(2*a)

}

equal_to_zero(a,b)

flaot a,b

{x1=x2=-b/(2*a)}

smaller_than_zero(a,b)

float a,b

{p=-b/(2*a)

q=sqrt(-disc)/(2*a)

}

main()

{float a,b,c

scanf("%f,%f,%f",&a,&b,&c)

disc=b*b-4*a*c

if(fabs(disc)<=1e-5)

{equal_to_zero(a,b)

printf("x1=%5.2f\tx2=%5.2f\n",x1,x2)

}

else if(disc>0)

{greater_than_zero(a,b)

printf("x1=%5.2f\tx2=%5.2f\n",x1,x2)

}

else

{smaller_than_zero(a,b)

printf("x1=%5.2f+%5.2fi\tx2=%5.2f-%5.2fi\n",p,q,p,q)

}

}

7.3

main()

{int number

scanf("%d",&number)

if(prime(number))

printf("yes")

else

printf("no")

}

int prime(number)

int number

{int flag=1,n

for(n=2n<number/2&&flag==1n++)

if(number%n==0)

flag=0

return(flag)

}

7.4

#define N 3

int array[N][N]

convert(array)

int array[3][3]

{int i,j,t

for(i=0i<Ni++)

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

{t=array[i][j]

array[i][j]=array[j][i]

array[j][i]=t

}

}

main()

{int i,j

for(i=0i<Ni++)

for(j=0j<Nj++)

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

convert(array)

for(i=0i<Ni++)

{printf("\n")

for(j=0j<Nj++)

printf("%5d",array[i][j])

}

}

7.5

main()

{char str[100]

scanf("%s",str)

inverse(str)

printf("%s\n",str)

}

inverse(str)

char str[]

{char t

int i,j

for(i=0,j=strlen(str)i<strlen(str)/2i++,j--)

{t=str[i]

str[i]=str[j-1]

str[j-1]=t

}

}

7.6

char concate(str1,str2,str)

char str1[],str2[],str[]

{int i,j

for(i=0str1[i]!='\0'i++)

str[i]=str1[i]

for(j=0str2[j]!='\0'j++)

str[i+j]=str2[j]

str[i+j]='\0'

}

main()

{char s1[100],s2[100],s[100]

scanf("%s",s1)

scanf("%s",s2)

concate(s1,s2,s)

printf("\ns=%s",s)

}

7.7

main()

{char str[80],c[80]

void cpy()

gets(str)

cpy(str,c)

printf("\n%s\n",c)

}

void cpy(s,c)

char s[],c[]

{int i,j

for(i=0,j=0s[i]!='\0'i++)

if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'||

s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U')

{c[j]=s[i]j++}

c[j]='\0'

}

7.8

main()

{char str[80]

scanf("%s",str)

insert(str)

}

insert(str)

char str[]

{int i

for(i=strlen(str)i>0i--)

{str[i*2]=str[i]

str[i*2-1]=' '

}

printf("%s\n",str)

}

7.9

int alph,digit,space,others

main()

{char text[80]

gets(text)

alph=0,digit=0,space=0,others=0

count(text)

printf("\nalph=%d,digit=%d,space=%d,others=%d\n",alph,digit,space,others)

}

count(str)

char str[]

{int i

for(i=0str[i]!='\0'i++)

if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))

alph++

else if(str[i]>='0'&&str[i]<='9')

digit++

else if(strcmp(str[i],' ')==0)

space++

else

others++

}

7.10

int alph(c)

char c

{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))

return(1)

else

return(0)

}

int longest(string)

char string[]

{int len=0,i,length=0,flag=1,place,point

for(i=0i<=strlen(string)i++)

if(alph(string[i]))

if(flag)

{point=i

flag=0

}

else

len++

else

{flag=1

if(len>length)

{length=len

place=point

len=0

}

}

return(place)

}

main()

{int i

char line[100]

gets(line)

for(i=longest(line)alph(line[i])i++)

printf("%c",line[i])

printf("\n")

}

7.11

#define N 10

char str[N]

main()

{int i,flag

for(flag=1flag==1)

{scanf("%

言,你可以很好地应付任何一种编程工具。

2、一定要多上机练习,通过程式了解相关知识。几经反复方得正果。

3、不要把学习C语言当成一种任务,更不要把它看成很难完成的任务。要充满自信,只要是一个智力正常的人都能学好C语言。始终保持游戏的心态,多发现其中的乐趣。当感到编程趣味无穷,那你在电脑方面将前程无量。

4、如果一个程式一时无法弄清楚最后暂时放在一边,过一段时间你可能会从其他的程式中悟出道理。

5、C语言是一个整体,各个方面是有机联系的,要从总体上把握它,不要把它割裂成互不关联的部件。

6、不要完全相信教材(包括本讲义),所有结论最好都上机验证。

怎样学好C语言

1. 工欲善其事,必先利其器

准备工作:一个开发环境,如Turbo C 2.0、Visual C++等开发工具;一本好教材,如谭浩强主编的《C语言程序设计》(第二版)。我当时看的是他的第一版,就为它的简洁、完美所吸引,简直爱不释手,用了两个星期一口气看完。

2. 秘密武器

初学者学习计算机语言要会“读程序”,要对小型的应用型、游戏型程序感兴趣,并模仿去加深对C语言程序设计的理解和 *** 作,只有不断地写程序、调试程序才能得到编写程序的经验和加深对程序的理解,这也是学习编写优秀高级程序的秘密武器。

3. 发扬探索精神

学习C语言程序设计有点像做数学难题,只要我们善于思考,善于探索,发扬探索精神去寻找好的设计思想和方法,才能把C语言的精髓真正地掌握。

备战C语言考试要诀

1. 了解大纲,临阵不乱

各类笔试中,大多数考题是与大纲要求的基本内容一致的,难度不高,但内容十分广泛,应牢固掌握C语言考试大纲要求的基础部分。只有熟悉题型,理解语法、句法,做到心中有数,才能临阵不乱。

2. 善于归纳,强化记忆

对于需要记忆的计算机基础知识和基本概念,如果考试时因此失分就十分可惜。如:C语言中有几种不同的数据类型?运算的优先级别是怎样的?因此我们需要善于归纳这些计算机基础知识,并在理解的基础上强化记忆。

3. 重视实践,善于调试

计算机科学是一门理论性、实践性都很强的学科,对C语言考试的参加者来说,基础理论方面要求不高,而上机试题往往是很多考生不能通过考试的重要原因,因此要勤于实践。

4. 多做练习,查漏补缺

在认真地学完指定用书后,最好再找些试题,认真地测试一下,一则可以检查自己的复习情况;二则可以查漏补缺;三则可以调节心理状况,以备正式考试时沉着冷静、万无一失。


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

原文地址: https://outofmemory.cn/yw/11108708.html

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

发表评论

登录后才能评论

评论列表(0条)

保存