欢迎光临
免费的PDF电子书下载网站

C程序设计教程(第3版)学习辅导 PDF下载

编辑推荐



本书为普通高等教育“十一五”*规划教材,荣获全国高校出版社优秀畅销书一等奖。本书是与谭浩强所著的《C程序设计教程(第3版)》(清华大学出版社出版)配合使用的参考书,全书可分四个部分。*部分为《C程序设计教程(第3版)》习题与参考解答,包括了该书各章的全部习题,对全部编程习题都给出了参考解答,包括114个程序;第二部分为常见错误分析和程序调试;第三部分为C语言上机指南,详细介绍了利用Visual C 6.0集成环境和Visual Studio 2010编辑、编译、调试和运行程序的方法;第四部分为上机实验,提供了学习本课程应当进行的12个实验。

本书内容丰富、实用性强,是学习C语言的一本好参考书,可作为《C程序设计教程(第3版)》和其他C语言教材的配套教材,既适合高等学校师生使用,也可供报考计算机等级考试者和其他自学者参考。

 ;

内容简介

本书是与谭浩强所著的《C程序设计教程(第3版)》(清华大学出版社出版)配合使用的参考书,全书可分4个部分。*部分为《C程序设计教程(第3版)》习题与参考解答,包括了该书各章的全部习题,对全部编程习题都给出了参考解答,包括114个程序;第二部分为常见错误分析和程序调试;第三部分为C语言上机指南,详细介绍了利用Visual C 6.0集成环境和Visual Studio 2010编辑、编译、调试和运行程序的方法;第四部分为上机实验,提供了学习本课程应当进行的12个实验。 本书内容丰富,实用性强,是学习C语言的一本好参考书,可作为《C程序设计教程(第3版)》和其他C语言教材的参考书,既适合高等学校师生使用,也可供报考计算机等级考试者和其他自学者参考。

作者简介

暂无

C程序设计教程(第3版)学习辅导 PDF下载

目录


目录
第1章程序设计和C语言3
第2章最简单的C程序设计——顺序程序设计8
第3章选择结构程序设计16
第4章循环结构程序设计25
第5章利用数组处理批量数据42
第6章利用函数进行模块化程序设计64
第7章善于使用指针90
第8章根据需要创建数据类型114
第9章利用文件保存数据147
第二部分常见错误分析和程序调试
第10章常见错误分析169第11章程序的调试与测试185
11.1程序的调试185
11.2程序错误的类型187
11.3程序的测试189
第三部分C语言上机指南
第12章Visual C 6.0的上机操作19712.1Visual C 6.0的安装和启动197
12.2输入和编辑源程序198
12.2.1新建一个C源程序的方法198
12.2.2打开一个已有的程序200
12.2.3通过已有的程序建立一个新程序的方法200
12.3编译、连接和运行201
12.3.1程序的编译201
12.3.2程序的调试202
12.3.3程序的连接204
12.3.4程序的执行205
12.4建立和运行包含多个文件的程序的方法206
12.4.1由用户建立项目工作区和项目文件206
12.4.2用户只建立项目文件211
第13章用Visual Studio 2010运行C程序213
13.1关于Visual Studio 2010213
13.2怎样建立新项目213
13.3怎样建立文件217
13.4怎样进行编译219
13.5怎样运行程序220
13.6怎样打开项目中已有的文件221
13.7怎样编辑和运行一个包含多文件的程序222
13.8关于用Visual Studio 2010编写和运行C程序的说明225
第四部分上 机 实 验
第14章实验指导22914.1上机实验的目的229
14.2上机实验前的准备工作230
14.3上机实验的步骤230
14.4实验报告231
14.5实验内容安排的原则231
第15章实验安排 232
15.1实验1C程序的运行环境和运行C程序的方法232
15.2实验2最简单的C程序设计——顺序程序设计234
15.3实验3选择结构程序设计236
15.4实验4循环结构程序设计237
15.5实验5利用数组(一)238
15.6实验6利用数组(二)239
15.7实验7函数调用(一)240
15.8实验8函数调用(二)241
15.9实验9善用指针(一)242
15.10实验10善用指针(二)243
15.11实验11使用结构体244
15.12实验12文件操作245
参考文献246

前沿


从20世纪70年代末、80年代初开始,我国的高等院校开始面向各个专业的全体大学生开展计算机教育。面向非计算机专业学生的计算机基础教育牵涉的专业面广、人数众多,影响深远,它将直接影响我国各行各业、各个领域中计算机应用的发展水平。这是一项意义重大而且大有可为的工作,应该引起各方面的充分重视。
三十多年来,全国高等院校计算机基础教育研究会和全国高校从事计算机基础教育的老师始终不渝地在这片未被开垦的土地上辛勤工作,深入探索,努力开拓,积累了丰富的经验,初步形成了一套行之有效的课程体系和教学理念。高等院校计算机基础教育的发展经历了3个阶段:20世纪80年代是初创阶段,带有扫盲的性质,多数学校只开设一门入门课程;20世纪90年代是规范阶段,在全国范围内形成了按3个层次进行教学的课程体系,教学的广度和深度都有所发展;进入21世纪,开始了深化提高的第3阶段,需要在原有基础上再上一个新台阶。
在计算机基础教育的新阶段,要充分认识到计算机基础教育面临的挑战。
(1) 在世界范围内信息技术以空前的速度迅猛发展,新的技术和新的方法层出不穷,要求高等院校计算机基础教育必须跟上信息技术发展的潮流,大力更新教学内容,用信息技术的新成就武装当今的大学生。
(2) 我国国民经济现在处于持续快速稳定发展阶段,需要大力发展信息产业,加快经济与社会信息化的进程,这就迫切需要大批既熟悉本领域业务,又能熟练使用计算机,并能将信息技术应用于本领域的新型专门人才。因此需要大力提高高校计算机基础教育的水平,培养出数以百万计的计算机应用人才。
(3) 21世纪,信息技术教育在我国中小学中全面开展,计算机教育的起点从大学下移到中小学。水涨船高,这样也为提高大学的计算机教育水平创造了十分有利的条件。
迎接21世纪的挑战,大力提高我国高等学校计算机基础教育的水平,培养出符合信息时代要求的人才,已成为广大计算机教育工作者的神圣使命和光荣职责。全国高等院校计算机基础教育研究会和清华大学出版社于2002年联合成立了“中国高等院校计算机基础教育改革课题研究组”,集中了一批长期在高校计算机基础教育领域从事教学和研究的专家、教授,经过深入调查研究,广泛征求意见,反复讨论修改,提出了高校计算机基础教育改革思路和课程方案,并于2004年7月发布了《中国高等院校计算机基础教育课程体系2004》(简称CFC 2004)。国内知名专家和从事计算机基础教育工作的广大教师一致认为CFC 2004提出了一个既体现先进性又切合实际的思路和解决方案,该研究成果具有开创性、针对性、前瞻性和可操作性,对发展我国高等院校的计算机基础教育具有重要的指导作用。根据近年来计算机基础教育的发展,课题研究组先后于2006、2008和2014年发布了《中国高等院校计算机基础教育课程体系》的新版本,由清华大学出版社出版。
为了实现CFC提出的要求,必须有一批与之配套的教材。教材是实现教育思想和教学要求的重要保证,是教学改革中的一项重要的基本建设。如果没有好的教材,提高教学质量只是一句空话。要写好一本教材是不容易的,不仅需要掌握有关的科学技术知识,而且要熟悉自己工作的对象,研究读者的认识规律,善于组织教材内容,具有较好的文字功底,还需要学习一点教育学和心理学的知识等。一本好的计算机基础教材应当具备以下5个要素:
(1) 定位准确。要明确读者对象,要有的放矢,不要不问对象,提笔就写。
(2) 内容先进。要能反映计算机科学技术的新成果、新趋势。
(3) 取舍合理。要做到“该有的有,不该有的没有”,不要包罗万象、贪多求全,不应把教材写成手册。
(4) 体系得当。要针对非计算机专业学生的特点,精心设计教材体系,不仅使教材体现科学性和先进性,还要注意循序渐进,降低台阶,分散难点,使学生易于理解。
(5) 风格鲜明。要用通俗易懂的方法和语言叙述复杂的概念。善于运用形象思维,深入浅出,引人入胜。
为了推动各高校的教学,我们愿意与全国各地区、各学校的专家和老师共同奋斗,编写和出版一批具有中国特色的、符合非计算机专业学生特点的、受广大读者欢迎的优秀教材。为此,我们成立了“中国高等院校计算机基础教育课程体系规划教材”编审委员会,全面指导本套教材的编写工作。
本套教材具有以下几个特点:
(1) 全面体现CFC的思路和课程要求。可以说,本套教材是CFC的具体化。
(2) 教材内容体现了信息技术发展的趋势。由于信息技术发展迅速,教材需要不断更新内容,推陈出新。本套教材力求反映信息技术领域中新的发展、新的应用。
(3) 按照非计算机专业学生的特点构建课程内容和教材体系,强调面向应用,注重培养应用能力,针对多数学生的认知规律,尽量采用通俗易懂的方法说明复杂的概念,使学生易于学习。
(4) 考虑到教学对象不同,本套教材包括了各方面所需要的教材(重点课程和一般课程,必修课和选修课,理论课和实践课) ,供不同学校、不同专业的学生选用。
(5) 本套教材的作者都有较高的学术造诣,有丰富的计算机基础教育的经验,在教材中体现了研究会所倡导的思路和风格,因而符合教学实践,便于采用。
本套教材统一规划,分批组织,陆续出版。希望能得到各位专家、老师和读者的指正,我们将根据计算机技术的发展和广大师生的宝贵意见及时修订,使之不断完善。

全国高等院校计算机基础教育研究会荣誉会长
“中国高等院校计算机基础教育课程体系规划教材”编审委员会主任

前言
C语言是国内外广泛使用的计算机语言。许多高校都开设了“C语言程序设计”课程。作者于1991年编写了《C程序设计》,由清华大学出版社出版,该书出版后,受到了广大读者的欢迎,大家普遍认为该书概念清晰、叙述详尽、例题丰富、深入浅出、通俗易懂,大多数高校选其作为教材。该书已先后修订了4次,出了5版,重印200多次,累计发行1400多万册,为国内外同类书之首。
由于全国各地区、各类学校情况不尽相同,对C语言的教学要求学时数也有所差别。因此,作者除了编写出版《C程序设计》外,还针对部分学时较少的学校的情况,于2007年编写出版《C程序设计教程》一书,适当减少内容,紧扣基本要求,突出重点,同时编写出版了《C程序设计教程学习辅导》一书。2018年,作者对《C程序设计教程》一书再次进行修订,出版了《C程序设计教程(第3版)》,同时也对《C程序设计教程学习辅导》进行了修订,出版了《C程序设计教程(第3版)学习辅导》,即本书。
本书包括4个部分。
第一部分是“《C程序设计教程(第3版)》习题与参考解答”。在这一部分中包括了《C程序设计教程(第3版)》一书的全部习题,并提供了参考解答。除对其中少数概念问答题,由于能在教材中直接找到答案,不另给出答案外,对所有编程题一律给出参考解答,包括程序清单和运行结果。对于相对简单的问题,只给出程序清单和运行结果,不作详细说明,以便给读者留下思考的空间。对于一些比较复杂的问题还对算法进行了详细的分析介绍,给出流程图,并在程序中加注释以便于读者理解。对少数难度较大的题目(如链表的插入、删除等)还作了比较详细的文字说明。对有些题目,我们给出了两种参考解答,供读者参考和比较,以启发思路。全部程序都在Visual C 6.0环境下调试通过。
本书提供的114个不同类型、不同难度的题目,可以作为读者学习《C程序设计教程(第3版)》的补充材料。希望教师和同学们能善于利用这部分内容。教师可以根据教学要求和学生的情况,从习题中指定学生必须完成若干题目,目的是希望通过完成这些习题巩固消化教材中的内容,同时能帮助读者举一反三,深入思考。
习题中包括了不少有价值的、适用于教学的典型问题。由于篇幅和课时的限制,在教材和讲授中不可能介绍很多例子,只能介绍一些典型的例题。教师可以从习题中选一些,作为补充例题在课堂上讲授。对于一般读者,不必要求他们全部完成这些题目,但是可以提倡他们直接阅读参考解答,这对于开阔眼界,丰富知识,理解不同的程序,了解有关算法,掌握编程思路,是大有裨益的。对C程序设计有兴趣、有基础的读者,最好能多选一些题目独立完成编程,对提高编程水平会有很大的帮助。有人说: 如果能独立完成这些题目的编程,学习C语言就基本过关了。
应该说明,本书给出的程序并非是唯一正确的解答,甚至不一定是最佳的一种。对同一个题目可以编出多种程序,我们给出的只是其中的一种或两种,而且程序尽可能便于初学者容易理解,不一定直接搬用于专业的程序设计中。读者在使用本书时,千万不要照抄照搬,读者完全可以编写出更好、更专业的程序。
第二部分是“常见错误分析和程序调试”。作者根据多年教学经验,总结了学生在编写程序时常出现的问题,以提醒读者少犯类似错误。此外,介绍了调试程序的知识和方法,为上机实验打下基础。
第三部分是“C语言上机指南”。介绍了目前常用的Visual C 6.0和Visual Studio 2010集成环境下的上机方法,使读者上机练习有所遵循。
第四部分是“上机实验”。在这部分中提出了上机实验的要求,介绍了程序调试和测试的初步知识,并且安排了12个实验,便于进行实验教学。
本书不仅可以作为《C程序设计教程(第3版)》的参考书,而且可以作为任何C语言教材的参考书;既适用于高等学校教学,也可供报考计算机等级考试者和其他自学者参考。
南京大学金莹老师以及薛淑斌高级工程师和谭亦峰工程师参加本书的收集材料以及部分编写和调试程序的工作。
本书难免会有错误和不足之处,作者希望得到广大读者的指正。

2018年5月于清华园第一部分《C程序设计教程(第3版)》习题与参考解答

免费在线读

第5章
利用数组处理批量数据
5.1用筛选法求100之内的素数。
解: 解题思路: 所谓“筛法”指的是“埃拉托色尼(Eratosthenes)筛法”。埃拉托色尼是古希腊的著名数学家。他采取的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数,见图51。① 2 3 ④ 5 ⑥ 7 ⑧ ⑨ ⑩ 11 ; 13 ; ; ; 17 ; 19 ; ; ; 23 ; ; ; ; 29 ; 31 ; ; ; ; ; ;  ;
 ;37 ; ; ; ; ; ; 41 ; ; 43 ; ; ; ; ; 47 ; ; ; ; ; ; …
图51
具体做法如下:
(1) 先将1挖掉(因为1不是素数)。
(2) 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
(3) 用3去除它后面各数,把3的倍数挖掉。
(4) 分别用4,5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如在图51中找1~50的素数,要一直进行到除数为47为止。事实上,可以简化,如果需要找1~n范围内的素数表,只须进行到除数为n(取其整数) 即可。例如对1~50,只须进行到将7(即50的整数部分)作为除数即可。请读者思考为什么?
上面的算法可表示如下:
(1) 挖去1;
(2) 用下一个未被挖去的数 p去除p后面各数,把p的倍数挖掉;
(3) 检查p是否小于n的整数部分(如果n=1000,则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
(4) 剩下的数就是素数。
用计算机解此题,可以定义一个数组 a。数组元素a[1]~a[n] 分别代表1~n这n个数。如果检查出数组a的某一元素的值是非素数,就使它变为0,最后剩下不为0的就是素数。
编写程序如下:#include


#include
//程序中用到求平方根函数sqrt

int main()

{ int i,j,n,a[101];//定义a数组包含101个元素

for (i=1;i<;=100;i )//a[0]不用,只用a[1]~a[100]

a[i]=i; //使a[1]~a[100] 的值为1到100

a[1]=0; //先"挖掉"a[1]

for (i=2;i

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

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

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

 ;a[j]=0; //把非素数“挖掉”

 ;}

printf("\n");

for (i=2,n=0;i<;=100;i )

{if (a[i]!=0)//选出值不为0的数组元素,即素数

{printf("%5d",a[i]);//输出素数,宽度为5列

 ;n ; //累计本行已输出的数据个数

 ;}

 ;if(n==10)

 ;{ printf("\n");

 ;n=0;

 ;}

}

printf("\n");

return 0;

}运行结果:2357111317192329

31374143475359616771

737838997

输入数组a各元素for (i=1; i≤9; i )min=ifor (j=i 1; j≤10; j )a [min]>a[j]

TFmin=j交换a[min]与a[i]输出已排序的10个数图525.2用选择法对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[i]) 与a[1] 交换,此时a[1]中存放了10个数中最小的数。第2轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第二小的数。依此类推,共进行9轮比较,a[1]~a[10] 就已按由小到大的顺序存放了。NS图如图52所示。

编写程序如下:#include


int main()

{ int i,j,min,temp,a[11];

printf("enter data:\n");

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

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

scanf("%d",&;a[i]);//输入10个数

 ;}

printf("\n");

printf("The orginal numbers:\n");

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

printf("%5d",a[i]);//输出这10个数

printf("\n");

for (i=1;i<;=9;i ) //以下8行是对10个数排序

{min=i;

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

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

 temp=a[i];//以下3行将a[i 1]~a[10]中最小者与a[i]对换

 a[i]=a[min];

 a[min]=temp;

}

printf("\nThe sorted numbers:\n");//输出已排好序的10个数

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

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

printf("\n");

return 0;

}运行结果:enter data:

a[1]=1↙

a[2]=16↙

a[3]=5↙

a[4]=98↙

a[5]=23↙

a[6]=119↙

a[7]=18↙

a[8]=75↙

a[9]=65↙

a[10]=81↙

The orginal numbers:

1 165 98 23119 18 75 65 81

The sorted numbers:

15 16 18 23 65 75 81 98119 5.3求一个3×3的整型二维数组对角线元素之和。

解: 编写程序如下:#include


int main()

{ int a[3][3],sum=0;

int i,j;

printf("enter data:\n");

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

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

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

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

sum=sum a[i][i];

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

return 0;

}运行结果:enter data:

1↙

2↙

3↙

4↙

5↙

6↙

7↙

8↙

9↙

sum=15关于输入数据方式的讨论:

在程序的scanf语句中用%d作为输入格式控制,上面输入数据的方式显然是可行的。其实也可以在一行中连续输入9个数据,如:1 2 3 4 5 6 7 8 9↙结果也一样。在输入完9个数据并按回车键后,这9个数据被送到内存中的输入缓冲区中,然后逐个送到各个数组元素中。下面的输入方式也是正确的:1 2 3↙

4 5 6↙

7 8 9↙或者:1 2↙

3 4 5 6↙

7 8 9↙都是可以的。

请考虑,如果将程序第7~9行改为for (j=0;j<3;j )

 scanf(" %d %d %d",&a[0][j],&a[1][j],&a[2][j]);应如何输入?是否必须一行输入3个数据,如:1 2 3↙

4 5 6↙

7 8 9↙答案是可以按此方式输入,也可以不按此方式输入,而采用前面介绍的方式输入,不论分多少行、每行包括几个数据,只要求最后输入完9个数据即可。

程序中用的是整型数组,运行结果是正确的。如果用的是实型数组,只须将程序第4行的int改为float或double即可,并且在scanf函数中使用%f或%lf格式声明。

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

解: 解题思路: 设数组a有n个元素,而且已按升序排列,在插入一个数时按下面的方法处理:

(1) 如果插入的数num比a数组最后一个数大,则将插入的数放在a数组末尾。

(2) 如果插入的数num不比a数组最后一个数大,则将它依次和a[0]~a[n-1] 比较,直到出现a[i]>num为止,这时表示a[0]~a[i-1]各元素的值比num小,a[i]~a[n-1] 各元素的值比num大。num理应插到a[i-1] 之后、a[i]之前。怎样才能实现此目的呢?将a[i]~a[n-1] 各元素向后移一个位置(即a[i]变成a[i 1],…,a[n-1]变成a[n])。然后将num放在a[i]中。NS图如图53所示。显示初始数组输入待插入的数值numnum>末尾元素

TFnum

插在数

组尾for (i=0; i<10; i )a (i)>num

TFnum插在a(i)处将原第i个元素之后的所有元素下标依次增1输出结果图53编写程序如下:#include


int main()

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

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

printf("array a:\n");

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

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

printf("\n");

printf("insert data:");

scanf("%d",&number);

end=a[9];

if (number>end)

a[10]=number;

else

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

{if (a[i]>number)

 {temp1=a[i];

a[i]=number;

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

{temp2=a[j];

a[j]=temp1;

temp1=temp2;

}

break;

 }

}

}

printf("Now, array a:\n");

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

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

printf("\n");

return 0;

}运行结果:array a:

1469 13 16 19 28 40100

insert data: 5↙

Now,array a:

14569 13 16 19 28 401005.5将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。

解: 解题思路: 以中间的元素为中心,将其两侧对称的元素的值互换。例如,将8和1互换,将6和4互换。NS图见图54。显示初始数组元素for (i=0; i<N/2; i )第i个元素与第N-i-1个元素互换显示逆序存放的各数组元素图54

编写程序如下:#include


#define N 5 //定义N代表5

int main()

{ int a[N],i,temp;

printf("enter array a:\n");

for (i=0;i

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

printf("array a:\n");

for (i=0;i

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

for (i=0;i
{ temp=a[i];

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

a[N-i-1]=temp;

 }

printf("\nNow,array a:\n");

for (i=0;i

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

printf("\n");

return 0;

}运行结果:enter array a:

8 6 5 4 1↙

array a:

86541

Now, array a:

145685.6输出以下的杨辉三角形(要求输出10行)。1

11

121

1331

14641

15101051

解: 解题思路: 杨辉三角形是(a b)n展开后各项的系数。例如:

(a b)0展开后为 1系数为1

(a b)1展开后为 a b系数为1, 1

(a b)2展开后为a2 2ab b2系数为1, 2, 1

(a b)3展开后为a3 3a2b 3ab2 b3系数为1, 3, 3, 1

(a b)4展开后为a4 4a3b 6a2b2 4ab3 b4系数为1, 4, 6, 4, 1

以上就是杨辉三角形的前5行。杨辉三角形各行的系数有以下的规律:

(1) 各行第一个数都是1。

(2) 各行最后一个数都是1。

(3) 从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。例如,第4行第2个数(3) 是第3行第2个数(2)和第3行第1个数(1)之和。可以这样表示: a[i][j]=a[i-1][j] a[i-1][j-1],其中i为行数,j为列数。

编写程序如下:#include


#define N10

int main()

{ int i,j,a[N][N];//数组为10行10列

for (i=0;i

 {a[i][i]=1;//使对角线元素的值为1

a[i][0]=1;//使第1列元素的值为1

 }

for (i=2;i

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

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

for (i=0;i

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

 printf("%6d",a[i][j]); //输出数组各元素的值

 printf("\n");

}

printf("\n");

return 0;

}说明: 数组元素的序号是从0开始算的,因此数组中0行0列的元素实际上就是杨辉三角形中第1行第1列的数据,余类推。

运行结果:1

11

121

1331

14641

15101051

1615201561

172135352171

18285670562881

1936841261268436915.7输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为8 1 6

3 5 7

4 9 2要求输出由1~n2的自然数构成的魔方阵。

解: 解题思路:

魔方阵的阶数n应为奇数。要将1~n2的自然数构成魔方阵,可按以下规律处理:

(1) 将1放在第1行中间一列。

(2) 从2开始直到n×n,各数依次按下列规则存放: 每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)。

(3) 如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1。

(4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。

(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。

按此方法可以得到任何阶的魔方阵。

NS图如图55所示。输入魔方阵的阶数n使a数组的所有元素为0将1放在第1行中间一列上for (k=2; k<=n*n; k )i=i-1, j=j 1上一个数在第1行、第n列

 TFi=i 2

j=j-1上一个数在第1行

TFi=n上一个数在第n列

TFj=1a [i][j]未填数

TFa[i][j]=ki=i 2

j=j-1

a[i][j]=k输出魔方阵a[n][n]图55

编写程序如下:#include


int main()

{ int a[15][15],i,j,k,p,n;

p=1;

while(p==1)

{printf("enter n(n=1 to 15):"); //要求阶数为1~15的奇数

 scanf("%d",&n);

 if ((n!=0) && (n<=15) && (n%2!=0)) //检查n是否为1~15的奇数

p=0;

}

//初始化

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

 for (j=1;j<=n;j )

a[i][j]=0;

//建立魔方阵

j=n/2 1;

a[1][j]=1;

for (k=2;k<=nn;k )

{i=i-1;

 j=j 1;

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

{i=i 2;














C程序设计教程(第3版)学习辅导 pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:C程序设计教程(第3版)学习辅导