C语言程序设计(谭浩强编)第七章数组
C语言程序设计第四版_谭浩强7章

➢函数的功能
return z; }
函数体
函数首部,不是语 句,行尾无分号
精选课件ppt
函数的返回值,类 型与首部定义一致14
函数的定义
关于函数类型的说明
无返回值的函数类型为void; 有返回值的函数,其类型根据返回值 类型决定;省略类型时默认为int(建议 不要省略)
精选课件ppt
15
函数的调用
int main( )
{ int max(int a[ ],int n);
int x[6],i;
for(i=0;i<=5;i++)
scanf("%d",&x[i]);
printf("max=%d",max(x,6));
return 0;
}
实参为数组名
精选课件ppt
int max(int a[ ],int n) { int m,i; m=a[0]; for (i=1;i<n;i++)
float fac; fac=1; for(i=1;i<=n;i++)
fac=fac*i; return fac;
printf("c="); scanf("%d",&c);
}
sum=factorial(a)+factorial(b)+factorial(c);
printf("%d!+%d!+%d!=%.0f",a,b,c,sum);
函数1 函数2 函数3
函数1 函数2
精选课件ppt
34
变量作用域——局部变量和全局变量
c程序设计(谭浩强)第七章习题答案

int i;
float ave=0;
for(i=0;i<10;i++)
ave=ave+a[i][n]/10;
return ave;
}
void max(float a[][5]) //最高分的学生和课程
{
int i,j,row,colum;
float max=a[0][0];
for(i=0;i<10;i++)
# include <stdio.h>
# include<math.h>
# include<string.h>
/*int yue(int a,int b) //求最大公约数
{
int i,min;
min=a>b?b:a;
for(i=min;i>0;i--)
{
if(a%i==0&&b%i==0)
{
return i;
if((mid%2)!=1) //因职工号序号为奇数,故强制把序号转为奇数
mid-=1;
if(strcmp(b,a[mid])>0) //不能写b>a[mid]
{min=mid+2;}
else if(strcmp(b,a[mid])<0) //不能写b<a[mid]
{max=mid-2;}
else
{printf("职工姓名为:%s\n",a[mid-1]);break;}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
printf("%-2d",b[i][j]);
C++程序设计(第3版)谭浩强 第7章PPT课件

结构体数组每个元素都是一个结构全类型的数据,它们分别包括各个成员项。 例7.2 对候选人得票的统计程序。设有3个候选人,最终只能有1个人当选为领导。今有10 个人参加投票,从键盘先后输入这10个人所投候选人的名字,要求最后输出各候选人得票结 果。 方法二:string法
第7章 用户自定义数据类型
第7章 用户自定义数据类型
• 7.2 枚举类型
例7.7 口袋中有红、黄、蓝、白、黑5种颜色的球若干。每次从口袋中任意取出3个球,问得 到不同颜色的球的取法,输出每种排列的情况。
写在最后
成功的基础在于好的学习习惯
The foundation of success lies in good habits
结构体变量的指针引用成 员变量方法: (1)(*p).成员名 (2)p->成员名
第7章 用户自定义数据类型
• 7.1.5 指向结构体变量的指针
• 2.用结构体变量和指向结构体变量的指针构成链表 链表是一种常见的重要的数据结构。
例7.4 建立一个如图7.6所示的简单链表, 它由3个学生数据的结点组成。输出各 结点中的数据。
20
谢谢聆听
·学习就是为了达到一定目的而努力去干, 是为一个目标去 战胜各种困难的过程,这个过程会充满压力、痛苦和挫折
Learning Is To Achieve A Certain Goal And Work Hard, Is A Process To Overcome Various Difficulties For A Goal
声明枚举类型的一般形式为: enum 枚举类型名 {枚举常量表}; 例如: enum weekday {sun,mon,tue,wed,thu,fri,sat} workday,week_end; 说明: (1)枚举元素按常量处理,故称枚举常量。 (2)枚举元素作为常量,它们是有值的,其值是一个整数,编译系统定义时的顺序对它们 赋值为0,1,2,…… (3)枚举值可以用来做判断比较,按整数比较规则进行比较。 (4)不能把一个整数直接赋给一个枚举变量,枚举变量只能接受枚举类型数据。
谭浩强 c语言程序设计(第七章)

13 27 76 13 30 27 27 97 30 76 97 第
27 30 97 30 97 初 始 关 键 字 n=8
第 一 趟 趟 趟 二 三 第
第 四 趟 趟 五
第 六 趟
第 七 趟
第
10
第七章 数组
#include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); 假 for(i=1;i<=9;i++) for (j=1;j<=10-i;j++) if(a[j]>a[j+1]) {t=a[j]; a[j]=a[j+1]; a[j+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }
{
#include <stdio.h> 1 f[0] 0 main() 1 f[1] 1 { int i; 2 2 int f[20]={1,1}; f[2] 3 3 for(i=2;i<20;i++)f[3] 4 5 f[4] f[i]=f[i-2]+f[i-1]; 5 for(i=0;i<20;i++;\n"); printf("%12d",f[i]); } } 19 f[19] f[19]
C语言程序设计(谭浩强版)第7章

for(j=0;j<9;j++) for(i=0;i<9-j;i++) 程序运行结果如下: if (a[i]> 0 4 8 12 65 -76 100 -45 123↙ t=a[i];a[i]=a[i+1]; the sorted numbers: a[i+1]=t; -76 -45 0 1 4 8 12 65 100 123 } printf(″the sorted numbers :\n″); for(i=0;i<10;i++) printf(″%d ″,a[i]); printf(″\n″); }/*程序结束*/
2.一维数组元素引用的程序实例 程序实例
#include <stdio.h> void main() { int i,a[10]; for (i=0; i<=9;i++) a[i]=i; for(i=9;i>=0; i--) printf("%d ″,a[i]); printf("\n″); }
运行结果如下: 9876543210 程序使a[0]到 a[9]的值为0~9, 然后按逆序输出。
第七章 数组
7.1 一维数组的定义和引用 7.2 二维数组的定义和引用 7.3 字符数组
7.1 一维数组的定义和引用
一个班学生的学习成绩 一行文字 一个矩阵 这些数据的特点是: 1.具有相同的数据类型 2.使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数 组。所谓数组就是一组具有相同数据类型的数据的 有序集合。
2. 可以只给一部分元素赋值。 例如: int a[10]={0,1,2,3,4}; 定义a数组有10个元素,但花括弧内只提供5个初值, 这表示只给前面5个元素赋初值,后5个元素值为0。 3. 如果想使一个数组中全部元素值为0,可以写成: 0 : int a[10]={0,0,0,0,0,0,0,0,0,0}; 不能写成: int a[10]={0*10};
谭浩强C语言第7章

第i+1个元素的地址&a[i]可写成a+i。
§7.1 一维数组的定义及引用 一维数组的初始化: C语言允许在定义数组的时候初始化数组,形式为: 类型 数组名[宽度] = { 数值表 };
初始化时,需注意几点: 如:int a[5]={ 0,1,2,3,4 }; • 数值表是用逗号分隔的,最后一项后面没有逗号。 • 当数值表中数值个数小于宽度时,其余元素会被 自动初始化为0; • 存字符串的字符数组允许下列的初始化简写形式: int a[5]={ 1,2 }; 等价于int a[5]={ 1,2,0,0,0 }; char ch[6]=“Hello”;
§7.2 二维数组的定义及引用 二维数组的引用:
地址引用:
• 二维数组的数组名代表该数组的首地址,即第1个 元素的地址。比如 a,实际上就是&a[0][0]。 • 二维数组元素在内存中按行存放,a[0]为第1行的 首地址。同样,a[1]为第2行的首地址,......, a[n-1]为第n行的首地址。
• 二维数组中任一元素a[i][j]的地址&a[i][j]等价 于a[i]+j。
§7.1 一维数组的定义及引用 二维数组的初始化: • 分行初始化
int
a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
• 很多程序员也喜欢这么写: 按数组在内存中的排列顺序 int a[3][3]={{1,2,3}, int a[3][3]={1,2,3,4,5,6,7,8,9}; {4,5,6}, {7,8,9}}; • 很多程序员也喜欢这么写: 可省略第一维的长度说明,长度由初值个数确定 int a[3][3]={1,2,3, int a[ ][3]={{1,2,3},{4,5,6},{7,8,9}}; 4,5,6, 注意:第二维的长度不能省略 练习:说出下面二维数组第一维的宽度及各元素的值: 7,8,9}; int b[ ][3]={1,2,3,4};
C语言程序设计_课件_第七章(适于清华谭浩强版)

注意:
(1) return(表达式); 和return 表达式;都 是正确的。 (2) 带返回值的函数只能返回一个值。 (3) 在函数定义时,允许使用多个return语句, 但是应尽量在末尾使用一个return语句。 (4) return语句中的表达式与函数的返回值类 型不匹配时,以函数定义时的返回类型为准。
问题的提出 函数基础 函数的定义 函数说明 函数调用 参数传递 程序举例 递归调用 变量的存储类别
7.1 问题的提出
例6.20它可以解决的问题有: ①输入若干个学生的姓名、某课程的期中 和期末成绩,并计算每个学生的总评成绩; ②计算总评成绩的分数段情况; ③输出所有学生的姓名、期中、期末和总 评成绩; ④查询某个学生的总评成绩。
函数调用时需要传递数据。调用函数要将 实参的值传送给被调用函数的形参。 若函数定义首部是 double power(double x,int n) /*函数定义 */ 调 用 形 式 是 可 以 是 power(y,m) , 也 可 以 是 power(3.0,5)。 其中,x和n是形式参数,y和m是实际参数,3.0 和可以是一个变量 名,因为变量名也构成一个表达式,形式参数只 能是变量名。当实际参数是变量名时,它与形参 的名称既可以相同,也可以不同,只是要注意, 在函数定义内部应该使用形参的名称。 (2) 实际参数与形式参数的参数个数、数据类型 和顺序都应该一致,如果数据类型不一致,系统 将按照自动转换规则进行转换。
7.3 函数的定义
7.3.1 函数的定义形式 在C语言中函数定义的形式有两种。
第一种:
函数返回值的数据类型说明 函数名称(带有类型说明的参数表)
{
函数内部数据说明; 语句;
}
第二种:
第七章C语言谭浩强答案

7.1用筛法求100之内的素数。
解:所谓“筛法”指的是“Eratosthenes筛法”。
Eratosthenes是古希腊的著名数学家。
他采用的方法是:在一张纸上写下1~1000之间的全部整数,然后逐个判断它们是否素数,找出一个非素数就把它挖掉,最后剩下的就是素数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2728 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 …具体做法如下:先将1挖掉(因为1不是素数)。
用2去除它后面的各个数,把能被2整除的数(如4,6,8…)挖掉,即把2的倍数挖掉。
用3去除它后面各数,把3的倍数挖掉。
分别用4,5…各数作为除数去除这些数以后的各数。
这个过程一直进行到在除数后面的数已全被挖掉为止。
例如在上表中1~50范围内的素数,要一直进行到除数为47为止。
事实上,这一过程可以简化。
如果需要找1~n数)即可。
例如对1~50,只需进行到将7上面的算法可表示为:挖去1;用刚才被挖去的数的下一个数p去除p后面的各数,把p的倍数挖掉;检查p n=1000,则检查p<31否),如果是,则返回(2)继续执行,否则就结束;纸上剩下的就是素数。
解题的基本思路有了,但要变成计算机的操作,还要作进一步的分析。
如怎样判断一个数是否已被“挖掉”,怎样找出某一个数p的倍数,怎样打印出未被挖掉的数。
可以设一个数组a,a[1]到a[100]的值分别是1,2,3,…100。
然后用上述方法将非素数“挖去”。
如果一个数被认为是非素数,就将它的值变为零,最后将不为零的数组元素输出,就是所求的素数表。
程序如下:#include <math.h>main ( ){int i,j,n,a[101];for (i=1;i<=100;i++)a[i] =i;for (i=2;i<sqrt(100);i++)for (j=i+1;j<=100;j++){if (a[i]!=0 && a[j]!=0)if (a[j]%a[i]==0)a[j]=0; } /*非素数,赋值为0,“挖掉”*/printf(“\n”);for (i=2,n=0;i<=100;i++){ if (a[i]!=0){printf(“%5d”,a[i]);n++; }if (n==10) /*此处if 语句的作用是在输出10个数后换行*/{ printf (“\n”);n=0; }}}运行结果:2 3 5 7 11 13 17 19 23 29 31 37 41 4347 53 59 61 67 71 73 79 83 89 977.2用选择法对10个整数排序(从小到大)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n个数经过一次冒泡排序后,最大数(最小数)将被交换到 确定位置,但前面n-1数仍然无序。
8
5
5
5
5
第 1
5
8
4
4
4
趟
4
4
8
2
2
冒 泡
2
2
2
8
0
排
0
9
9
9
9
第一次 比较
第二次 比较
第三次 比较
第四次 比较
第二次冒泡 排序的结果
从上述我们可以得出: 如果n个数参加冒泡排序,则共要进行n-1趟排序。在第j
言 程 序
例 6.4 将ifno一tr (b个i[3=二][02维;] i数,<i组=, 行1j;和;i +列+元)素互换,存到 一个二{维f数or组( j中=。0 ;如j <: = 2 ; j + + )
{ printf(“%5d”,a[i][j] ) ;
设
1 2 b[3j][i] = a[i]行[j]列;互换结1果 4
六
较的次数,因此可用循环嵌 套控制语句来完成。
章
4、输出经排序后的十个数
} 四川理工学院
*main ( ) {
int a[10];
输入n个数给a[0]到a[n-1] for j=0 to n-2
int i,j,t;
for i=0 to n-j-1
printf(“input 10 numbers:\n”);
a[2][0] a[2][1] a[2][2] a[2][3]
四川理工学院
C
语 言 程
3.
对二维或高维数组可看成其元素也是数组的数组。 如:a[3][4]可看成由三个元素 a[0],a[1],a[2]组成。 而每个元素又是一个包含4个元素的一维数组。即
序
a[0] – – – – a00 a01 a02 a03
a[i] >a[i+1]
for (i=0;i<10;i++)
scanf(“%d”,&a[i]);
a[i]与a[i=1]
printf(“\n”);
交换
for (j=0;j<9;j++) for(i=0;i<9-j;i++)
输出a[1]到a[n]
if(a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t;}
语
1000
言
5600
程
0000
序
(4) int a[3][4] = {{1} , { } , {9}} ;
设
1000
计
0000
9000
第 4. int a[3][4] = {1, 2, 3, …… 12} ;
六
int a[ ][4] = {1, 2, 3, …… 12} ; 但不能写成: int a[3][ ] = {1, 2, 3, …… 12} ;
计
a=
} }
array a :b = 2 5
第
p4rint5f ( “6\n ”) ;1 2 3 3 6 printf ( “\narra4y b5: \n 6” ) ;
六 章
源算程法序f{:orbfp(o[rirji]=n[(ipt0j]fr=;i(=n“0itaf<\;[n(i=a12]j“”[r<j)2r%];a=;y5451id+;b”+,j:b+)[i+][j)]) ;
序 设 计
说明:1. 多维数组的下标仍从0计起。
例如:a[2][3]其元素个数为 6个,即:
a[0][0] , a[0][1] , a[0][2]
a[1][0] , a[1][1] , a[1][2]
第
2. C 语言中,二维(或高维)数组中的元素是按行
六
存放。如: a[3][4] 数组
章
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3]
序 3. 部分赋值
设
(1) int a[3][4] = {{1 } , {5} , {9}} ;
计
1000
5000
第
9000
六
(2) int a[3][4] = {{1} , {0, 6} ,{0, 0, 11}};
章
1000
0600
0 0 11 0
四川理工学院
C
(3) int a[3][4] = {{1} , {5, 6}} ;
趟比较中有n-j个数参加排序,要进行n-j-1次两两比较。本例中 第1趟有5个数参加排序,进行了4次比较。
C 程序的结构:
语 main ( )
言{
程
1、定义相关的数组和相关变量
序
设
2、输入待排序的十个数
计
3、按冒泡算法对其升序排序
由于在排序中涉及到总共所
第
需的趟次和每一趟中具体比
设
a[3][4] a[1] – – – – a10 a11 a12 a13
计
a[2] – – – – a20 a21 a22 a23
二、二维数组元素的引用
第 格式: 数组名[下标][下标]
六
注意: 下标值同数组大小的匹配。 如:
章
int a[3][4] ; …….
a[3][4] = 3 ; (是错误的)
※例7.3 用冒泡法对10个数排序(由小到大)。 冒泡法:对将进行排序的数,两两比较,如果不满足次序要求,
则交换位置;
第9
8
08
9
趟 冒
5
5
泡4
4
排2
2
序
0
0
第一次 第二次
比较
比较
8 5 9 4 2 0
第三次 比较
8 5 4 9 2 0
第四次 比较
8 5 4 2 9 0
第五次 比较
8 5 4 2 0 9
printf(“the sorted numbers:\n”);
for(i=0;i<10;i++)
printf(“ %d”,a[i]);
}
C
§6.2 二维数组的定义和ww引w.s用
语 一、定义
言 格式: 类型说明符数组名[常量表达式][常量表达式]
程
如: int a[3][4] ; float b[5][6] ;
章 5. int a[3][4] = {{0, 0, 3}, { } , {0, 10}};
int a[ ][4] = {{0, 0, 3}, { } , {0, 10}};
四川理工学院
C main ( )
语 四、{ 二in维t 数a[2组][程3]序= 举{ {列1 , (2p,836}), {4 , 5 , 6 } } ;
四川理工学院
C 1. 分行赋初值 (即按行赋值) 如:
语
int a[3][4]={{1,2,3,4},{5,6 ,7,8},{9,10,11,12}};
言 2. 按数组排列的顺序对各元素赋值 如:
程
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};