C语言学习 清华大学宝钢教授课件 珍藏版 (6)
合集下载
清华大学C语言教学课件(共16个PPT)第2个共33页
16、业余生活要有意义,不要越轨。——华盛顿 17、一个人即使已登上顶峰,也仍要自强不息。——罗素·贝克 18、最大的挑战和突破在于用人,而用人最大的突破在于信任人。——马云 19、自己活着,就是为了使别人过得更美好。——雷锋 20、要掌握书,莫被书掌握;要为生而读,莫为读而生。——布尔沃
清华大学C语言教学课件(共16个PPT) 第2个
16、自己选择的路、跪着也要把它走 完。 17、一般情况下)不想三年以后的事, 只想现 在的事 。现在 有成就 ,以后 才能更 辉煌。
18、敢于向黑暗宣战的人,心里必须 充满光 明。 19、学习的关键--重复。
20、懦弱的人只会裹足不前,莽撞的 人只能 引为烧 身,只 有真正 勇敢的 人才能 所向披 靡。
ENDቤተ መጻሕፍቲ ባይዱ
精品-清华大学C语言课件 第2章02 C语言基础知识
int good_way;/*正确,标识符中可以有下划线*/ int bus7;/*正确,标识符中可以有数字*/ int car6V;/*正确*/
注意: 标识符中不能有除字母、数字或下划线以外的字符。
英文字母的大小写代表不同的标识符。也就是说在C语言中是区分大小写字母,例如:
int mingri;/*全部是小写*/ int MINGRI;/*全部是大写*/ int MingRi;/*一部分是小写,一部分是大写*/
这个集成开发环境只有2M左右,因为它的小巧,所以很适合初学者进行学习使用。但是其界面不是 很方便,不能使用鼠标进行操作。
(2)在其子目录下,找到TC.exe可执行程序,选择并打开。此时屏幕上将会显示如图2.4所示的Turbo C 集成开发环境界面。
图2.4 Turbo C集成开发环境 (3)现在具体讲解一下关于TC环境中的功能。在图2.4的上方是开发环境的菜单栏部分。菜单栏中的菜单 项依次代表的含义是:文件操作(File)、编辑(Edit)、运行(Run)、编译(Compile)、项目 (Project)、选项(Options)、调试(Debug)、中断/观察(Break/watch)。
随着C语言不断的被完善,其编译器也在不断的更新。学习C语言的人对Turbo C一定很熟悉,Turbo C是美国Borland 公司推出的产品,Borland公司在1987年首次推出Turbo C1.0产品,而现在常用的 Turbo C2.0是在1989年出版,随着Turbo C2.0的推出,Turbo C1.0逐渐的被淘汰。
程序运行效果如图2.28所示。
图2.28 求一个数的平方根
实例2 猴子吃桃
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上 又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早 上想再吃时,见只剩下一个桃子了。编写程序求第一天共摘了多少桃子。代码如下:
注意: 标识符中不能有除字母、数字或下划线以外的字符。
英文字母的大小写代表不同的标识符。也就是说在C语言中是区分大小写字母,例如:
int mingri;/*全部是小写*/ int MINGRI;/*全部是大写*/ int MingRi;/*一部分是小写,一部分是大写*/
这个集成开发环境只有2M左右,因为它的小巧,所以很适合初学者进行学习使用。但是其界面不是 很方便,不能使用鼠标进行操作。
(2)在其子目录下,找到TC.exe可执行程序,选择并打开。此时屏幕上将会显示如图2.4所示的Turbo C 集成开发环境界面。
图2.4 Turbo C集成开发环境 (3)现在具体讲解一下关于TC环境中的功能。在图2.4的上方是开发环境的菜单栏部分。菜单栏中的菜单 项依次代表的含义是:文件操作(File)、编辑(Edit)、运行(Run)、编译(Compile)、项目 (Project)、选项(Options)、调试(Debug)、中断/观察(Break/watch)。
随着C语言不断的被完善,其编译器也在不断的更新。学习C语言的人对Turbo C一定很熟悉,Turbo C是美国Borland 公司推出的产品,Borland公司在1987年首次推出Turbo C1.0产品,而现在常用的 Turbo C2.0是在1989年出版,随着Turbo C2.0的推出,Turbo C1.0逐渐的被淘汰。
程序运行效果如图2.28所示。
图2.28 求一个数的平方根
实例2 猴子吃桃
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上 又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早 上想再吃时,见只剩下一个桃子了。编写程序求第一天共摘了多少桃子。代码如下:
清华大学C语言教学课件(共16个PPT)第1个共26页
清华大学C语言教学课件(共16个PPT) 第1个
•
6、黄金时代是在我们的前面,而不在 我们的 后面。
•
7、心急吃不了热汤圆。
•
8、你可以很有个性,但某些时候请收口 (蹩脚 的工人 总是说 工具不 好)。
•
10、只要下定决心克服恐惧,便几乎 能克服 任何恐 惧。因 为,请 记住, 除了在 脑海中 ,恐惧 无处藏 身。-- 戴尔. 卡耐基 。
55、 为 中 华 之 崛起而 读书。 ——周 恩来
谢谢!
51、 天 下 之 事 常成 于困约 ,而败 于奢靡 。——陆 游 52、 生 命 不 等 于是呼 吸,生 命是活 动。——卢 梭
53、 伟 大 的 事 业,需 要决心 ,能力 ,组织 和责任 感。 ——易 卜 生 54、 唯 书 籍 不 朽。——乔 特
•
6、黄金时代是在我们的前面,而不在 我们的 后面。
•
7、心急吃不了热汤圆。
•
8、你可以很有个性,但某些时候请收口 (蹩脚 的工人 总是说 工具不 好)。
•
10、只要下定决心克服恐惧,便几乎 能克服 任何恐 惧。因 为,请 记住, 除了在 脑海中 ,恐惧 无处藏 身。-- 戴尔. 卡耐基 。
55、 为 中 华 之 崛起而 读书。 ——周 恩来
谢谢!
51、 天 下 之 事 常成 于困约 ,而败 于奢靡 。——陆 游 52、 生 命 不 等 于是呼 吸,生 命是活 动。——卢 梭
53、 伟 大 的 事 业,需 要决心 ,能力 ,组织 和责任 感。 ——易 卜 生 54、 唯 书 籍 不 朽。——乔 特
C语言程序设计--第六章(适于清华谭浩强版)PPT优秀课件
*/
printf("\n");
for (i=2;i<20;i++)
fib[i]=fib[i-1]+fib[i-2];
for (i=1;i<=20;i++)
{ printf("%10d",fib[i-1]);
if (i%5==0) printf("\n");
/*换行,每行输出5个
*/
}
}
15
例6.3 输入100个整数,求出最小的数以及第一个 最小的数在数组中的下标。
例如,int data[5]=1;
13
6.2.4 程序举例 例6.2用数组方式解决Fibonacci数列问题,求出 Fibonacci数列的前20项存储在数组中,并将数 组内容输出。
14
#include "stdio.h"
void main() { int i,fib[20]={1,1};
/*初始化
例6.4 输入100个整数,从小到大排列并输出 。 选择排序
例6.5 输入100个学生的“C程序设计”课程的期 中和期末成绩,算出总评成绩,总评成绩为 “30%×期中成绩+70%×期末成绩”,计算总
评 成绩的分Leabharlann 段情况。本题要使用三个平行的数组才能解决问题。 这三个数组的第i个元素记录了一个学生的期中
但不能是浮点型的变量或浮点型表达式;并且 下标不能大于[数组长度-1],因为超过部分没 有被定义过,是不能正确使用的。
图。 例如:data[4]、data[i+j]、data[i++]都是 合法的引用方式。
9
例6.1用数组方式读入5个整数,并求和。
清华大学C语言教学课件(共16个PPT)第2个共33页
26、要使整个人生都过得舒适、愉快,这是不可能的,因为人类必须具备一种能应付逆境的态度。——卢梭
▪
27、只有把抱怨环境的心情,化为上进的力量,才是成功的保证。——罗曼·罗兰
▪
28、知之者不如好之者,好之者不如乐之者。——孔子
▪
29、勇猛、大胆和坚定的决心能够抵得上武器的精良。——达·芬奇
▪
30、意志是一个强壮的盲人,倚靠在明眼的跛子肩上。——叔本华
谢谢!
33
清华大学C语言教学课件(共16个PPT) 第2个
51、山气日夕佳,飞鸟相与还。 52、木欣欣以向荣,泉涓涓而始流。
53、富贵非吾愿,帝乡不可期。 54、雄发指危冠,猛气冲长缨。 55、土地平旷,屋舍俨然,有良田美 池桑竹 之属, 阡陌交 通,鸡 犬相闻 。
▪
C语言课件 清华大学谭浩强版c6
§6.5 函数参数及其传递方式
形参与实参
形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式 说明:
实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换———函数 调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存; 调用结束,内存释放
运行结果:9,9
(main)
9 5 9 9 2000 2002
(swap)
2000 2002 ****
...
指针变量在使用前 必须赋值!
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2 指针p1 指针p2 指针p
函数说明
一般形式: 函数类型 函数名(形参类型 [形参名],….. ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型,参数个数及类型,以便检验 函数定义与函数说明不同 函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数说明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前 有些系统(如Borland C++)要求函数说明指出函数返值类型和形 参类型,并且对void 和 int 型函数也要进行函数说明
无参函数 有参函数
使用库函数应注意: 1,函数功能 2,函数参数的数目和顺序,及各参数意义和类型 3,函数返回值意义和类型 4,需要使用的包含文件
Ch7_201.c
§6.2 函数的定义
一般格式
现代风格:
函数返回值类型 缺省int型 无返回值void
合法标识符
函数类型 函数名(形参类型说明表) { 说明部分 语句部分 } 例 例 有参函数(现代风格) 有参函数(现代风格) 例 无参函数 y) 例 x, int int max(int x,int y) max(int 空函数 printstar( ) dummy( ) { {int int z; z; { printf("**********\n"); } { } z=x>y?x:y; z=x>y?x:y; 或 return(z); return(z); printstar(void ) 函数体为空 } } { printf("**********\n"); }
C语言(清华大学出版社)ppt课件
结构。 (4)具有结构化的控制语句 ,是完全模块化
和结构化的语言。 (5)语法限制不太严格,程序设计自由度大。
C程序设计(第三版)
C语言的特点
(6)允许直接访问物理地址,能进行位操 作,能实现汇编语言的大部分功能,可直接 对硬件进行操作。兼有高级和低级语言 的特点 。
(7)目标代码质量高,程序执行效率高。 只比汇编程序成的目标代码效率低10 %-20%。
C程序设计(第三版)
算法如下 :
S1:输入n
S2:i=2
(i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不 是素数”,算法结束。否则执行S5
S5:i+1→i
S6:如果i≤n-1,返回S3。否则打印 n “是素
实际上,n不必被2到(n-1)的整数除,只需 被2到n/2间整数除,甚至只需被2到 之n 间的 整数除即可。
C程序设计(第三版)
说明: 本程序的作用是输出一行信息:
1.3 简单的C语Th言is程i序s a介C绍program.
#include <stdio.h>
/*文件包含*/
main( )
/*主函数 */
{
/*函数体开始*/
printf ("This is a C program.\n"); /*输出语句*/
(8)程序可移植性好(与汇编语言比)。基 本上不做修改就能用于各种型号的计算 机和各种操作系统。
C程序设计(第三版)
1.2 C语言的特点
问题:既然有了面向对象的C++语言,为 什么还要学习C语言?
解释1:C++是由于开发大型应用软件的需 要而产生的,并不是所有的人都要去编 写大型软件。
和结构化的语言。 (5)语法限制不太严格,程序设计自由度大。
C程序设计(第三版)
C语言的特点
(6)允许直接访问物理地址,能进行位操 作,能实现汇编语言的大部分功能,可直接 对硬件进行操作。兼有高级和低级语言 的特点 。
(7)目标代码质量高,程序执行效率高。 只比汇编程序成的目标代码效率低10 %-20%。
C程序设计(第三版)
算法如下 :
S1:输入n
S2:i=2
(i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不 是素数”,算法结束。否则执行S5
S5:i+1→i
S6:如果i≤n-1,返回S3。否则打印 n “是素
实际上,n不必被2到(n-1)的整数除,只需 被2到n/2间整数除,甚至只需被2到 之n 间的 整数除即可。
C程序设计(第三版)
说明: 本程序的作用是输出一行信息:
1.3 简单的C语Th言is程i序s a介C绍program.
#include <stdio.h>
/*文件包含*/
main( )
/*主函数 */
{
/*函数体开始*/
printf ("This is a C program.\n"); /*输出语句*/
(8)程序可移植性好(与汇编语言比)。基 本上不做修改就能用于各种型号的计算 机和各种操作系统。
C程序设计(第三版)
1.2 C语言的特点
问题:既然有了面向对象的C++语言,为 什么还要学习C语言?
解释1:C++是由于开发大型应用软件的需 要而产生的,并不是所有的人都要去编 写大型软件。
C语言学习 清华大学宝钢教授课件 珍藏版 (5)
24
函数调用:swap(a0,a1)
a. 解释
在数据传递过程中,实参a0,a1的值被传。 实参不受被调用函数swap的影响而改变。
25
b.图示
Given a0=2,a1=3
a0 函数main 2 a1 3 (实参)
2
函数swap 2/3 b0 3/2 b1
3
(虚参)
26
数据传递示例5:递归函数
18
ⅲ.函数调用:max(a,b)的含义
对于代表自变量具体值的a和b,调用 所定义的函数max求函数值(这里:a和b 称为实际参数)
19
ⅳ.函数调用:max(a,b)的执行过程
Given a=3, b=2
3,2由实参a,b被传递到形参x,y 执行函数体中的语句求z(z为3)。然后 执行语句return (z)。即将z的值3作为运算结 果以int型返回到调用函数main的调用处,以 便给c赋值。
• 多函数和多文件程序的编写
3
重要内容(Important Parts)
6.2 函数的定义 6.3 函数间数据的仁传递方法 6.4 函数的调用
4
教学目标(Objectives)
• • • • • 掌握函数的定义和使用方法 掌握变量作参数时数据传递的特点 掌握数组名作参数时数据传递的特点 理解静态局部变量和全局变量的概念* 用递归函数求解递归问题*
main
age(5) 18
n←5
age(4)
return 18
n←4
age(3)
return 16
n←3
age(2)
return 14
n←2
age(1)
return 12
n←1
c=10
函数调用:swap(a0,a1)
a. 解释
在数据传递过程中,实参a0,a1的值被传。 实参不受被调用函数swap的影响而改变。
25
b.图示
Given a0=2,a1=3
a0 函数main 2 a1 3 (实参)
2
函数swap 2/3 b0 3/2 b1
3
(虚参)
26
数据传递示例5:递归函数
18
ⅲ.函数调用:max(a,b)的含义
对于代表自变量具体值的a和b,调用 所定义的函数max求函数值(这里:a和b 称为实际参数)
19
ⅳ.函数调用:max(a,b)的执行过程
Given a=3, b=2
3,2由实参a,b被传递到形参x,y 执行函数体中的语句求z(z为3)。然后 执行语句return (z)。即将z的值3作为运算结 果以int型返回到调用函数main的调用处,以 便给c赋值。
• 多函数和多文件程序的编写
3
重要内容(Important Parts)
6.2 函数的定义 6.3 函数间数据的仁传递方法 6.4 函数的调用
4
教学目标(Objectives)
• • • • • 掌握函数的定义和使用方法 掌握变量作参数时数据传递的特点 掌握数组名作参数时数据传递的特点 理解静态局部变量和全局变量的概念* 用递归函数求解递归问题*
main
age(5) 18
n←5
age(4)
return 18
n←4
age(3)
return 16
n←3
age(2)
return 14
n←2
age(1)
return 12
n←1
c=10
c语言讲义(国立清华大学)
• 宣告過結構之後可以用它來定義變數 struct t_point pt; • 所以 pt 會包含 x 以及 y 兩個成員,可以使 用 . 來存取它們 pt.x = 10; pt.y = 20;
什麼是 C 結構 (C Structure)
• 已經宣告過的結構可以再拿來宣告另一個結構 struct t_rect { struct t_point pt1; struct t_point pt2; }; • 然後用它來產生變數,以及存取成員 struct t_rect screen; screen.pt1.x = 10;
C 結構
什麼是 C 結構 (C Structure)
• 結構是多個相關的變數的集合,用一個共 同的名稱來統稱 • 要描述平面上的點座標,若使用結構則可 以自定一個叫做 t_point 的資料型態,寫成 struct t_point { int x; int y; };做運算
• 結構可以使用的運算元只有 =、&、. • 其他的運算則必須自己寫函數來達到我們 想要的功能
結構參數的傳遞方式
• 傳遞結構變數到函數,會用 call-by-value 的方式 • 結構同樣可以用指標方式來達到 call-byreference 的效果 • 可以使用 typedef 宣告新的型別名稱,這 樣接下來宣告變數會比較方便 typedef struct t_point Point; Point pt;
什麼是 C 結構 (C Structure)
• 已經宣告過的結構可以再拿來宣告另一個結構 struct t_rect { struct t_point pt1; struct t_point pt2; }; • 然後用它來產生變數,以及存取成員 struct t_rect screen; screen.pt1.x = 10;
C 結構
什麼是 C 結構 (C Structure)
• 結構是多個相關的變數的集合,用一個共 同的名稱來統稱 • 要描述平面上的點座標,若使用結構則可 以自定一個叫做 t_point 的資料型態,寫成 struct t_point { int x; int y; };做運算
• 結構可以使用的運算元只有 =、&、. • 其他的運算則必須自己寫函數來達到我們 想要的功能
結構參數的傳遞方式
• 傳遞結構變數到函數,會用 call-by-value 的方式 • 結構同樣可以用指標方式來達到 call-byreference 的效果 • 可以使用 typedef 宣告新的型別名稱,這 樣接下來宣告變數會比較方便 typedef struct t_point Point; Point pt;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i 1 Loop body a[0]=a[1] a[0] 2 a[1] 2 a[2] 3 a[3] 4
2
3 4
a[1]=a[2]
a[2]=a[3] a[3]=a[4]
2
2 2
3
3 3
3
4 4
4
4 5
Note:循环体a[i-1]=a[i];的左值,当i由1变化到4,其具 体形式为:a[0]~a[3]。所以将之列出。
12/74
v.运行示例(Sample Dialog)
输入: 90 100
. . .
65 输出: 0-- 9: 0 10-- 19: 0 20-- 29: 1 30-- 39: 2 40-- 49: 0 50-- 59: 2 60-- 69: 12 70-- 79: 24 80-- 89: 5 90-- 99: 2 100--109: 2
• • • • 掌握一维数组的定义和使用 掌握二维数组的定义和使用 会使用数组输入输出字符串 会使用常用字符串库函数处理字符 串 • 会使用数组名作参数使一组数在函 数间传递
5/74
重要例题和习题
数组部分例题
7.17 输入一组数并求最小者及位置 7.18 数组的最小者与首元素互换 7.19 对一组数用选择法排序 7.21 对于有序序列用二分法查找某数
2000 2002 2004 2006 2008 (地址码) i. 特点(Properties) a. 该数组被分配连续的一块存储单元 b. a[i]在a[i+1]之前
15/74
ii.使用(How to use)
a. 使用前要对数组a进行声明:int a[5];
b. 下标常用作数组元素的地址。若视数组 元素a[i]的地址为i。则可认为a[i]是地址i所 指向的元素
23/74
Assignment
Ex.1 下面程序段的输出是什么? int a[5]={1,2,3,4,5},i,t; t=a[0]; for(i=1;i<5;i++)a[i-1]=a[i]; a[4]=t; for(i=0;i<5;i++) printf(”%3d”,a[i]);
24/74
Given: i=1, a[5]={1,2,3,4,5}
19/74
例题1
e.g. 对上述一维数组a的所有元素求和 i.要点(Basic)
设置一累加变量s,对a[i]进行累加 ii.程序(Source)
int a[5]={1,2,3,4,5},s,i; for(s=0,i=0;i<5;i++)s+=a[i];
20/74
例题2
e.g. 对上述二维数组a的所有元素求和 i.程序(Source) int a[3][5]={ {1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}},s=0,i; for(i=0;i<5;i++)s+=a[0][i]; for(i=0;i<5;i++)s+=a[1][i]; for(i=0;i<5;i++)s+=a[2][i];
26/74
Assignment
Ex.3 以下程序的输出是什么? #include<stdio.h> void main() { int sub(int n); int i=5; printf(“%d\n”,sub(i));} int sub(int n) { int a; if(n==1)return 1; a=n+sub(n-1); return a;}
Chapter 7
Array & User-Defined Type
1/74
学习指导(Learning Guides)
• • • • 概述(Overview) 重要部分(Important parts) 教学目标(Objectives) 重要例题和习题(Important Examples and Exercises) • 难点(Difficulties)
21/74
ii.一般化(Generalization)
Consider 0,1,2 as the values of the variable j, the block:
for(i=0;i<5;i++)s+=a[0][i]; for(i=0;i<5;i++)s+=a[1][i]; for(i=0;i<5;i++)s+=a[2][i]; changes as follows for(i=0;i<5;i++)s+=a[j][i]; (here j=0) for(i=0;i<5;i++)s+=a[j][i]; (here j=1) for(i=0;i<5;i++)s+=a[j][i]; (here j=2)
27/74
例题3
e.g. 输入一个大写字符串,然后以全部小写 字母输出。 i. 程序(Source)
char a[100];int i=0; scanf(“%s”,a) ; [1] while(a[i])a[i++]+=32; [2] printf(”%s\n”,a); [3]
28/74
Note 1: 对scanf(”%s”,a);的注释
数组部分习题:全部 常用算法部分例题
8.3 对一组数用冒泡法排序 8.4 用顺序法查找某数 8.7 十进制数转成其它进制数 8.10 求1000以内的完数 8.12 猴子分桃
结构体部分习题:全部
6/74
难点(Difficulties)
• 冒泡排序算法 • 选择排序算法
7/74
成组数据处理问题实例及解决方法
2/74
内容概述(Contents in Brief)
• 成组数据处理问题实例及解决方法 • 数组的定义及使用 • 常用算法的使用 • 结构体类型的声明及使用
3/74
重要内容(Important Parts)
7.4 字符数组的定义与引用 7.5 数组元素及数组作函数的参数
4/74
教学目标(Objectives)
25/74
Assignment
Ex.2 程序填空。函数gcd的功能是求num1,num2的 最大公约数,并通过a返回该结果。 int gcd(int num1, int num2) {int t,a,b; a=num1; b=num2; while( 1 ) {t=a%b; 2 ; b=t;} return ;} 3
按字符串形式读入数据并为数组a 赋初值
然后在字符串结尾处添加特殊字符’\0‟, 用作字符串结束标志 该语句可换成等价的gets(a)
29/74
Note 2: 对while(a[i])a[i++]+=32;的注释
a[i]表示条件: 第i号元素为非结束标志’\0‟ 该条件成立时,则第i++号元素增32 (即:使 大写变小写。因为’A‟+32=‟a‟)。直到第i号元 素为结束标志时为止
Notes: [1]a表示50个相同类型的一组变量。分别记为:a[0],a[1]……a[49]。每个元 素都是整型int [2]j表示11个相同类型的一组变量。分别记为:j[0],j[1]……a[10]。每个元 素都是整型int
11/74
iv.程序(Source)
int i,k,a[50],j[11]; (声明数组a和j) for ( i=0 ; i<50 ; i++ ) (通过键盘输入使数组a有初值) scanf(”%d”,&(a[i]) );(a[i]为数组a的第i号元素) for ( i=0 ; i<11 ; i++ ) j[i]=0 ; (数组j被清0) for (i=0 ; i<50 ; i++ ) { k=a[i]/10; j[k]++ ;}( j[k]对应第k分段的人数) for ( i=0 ; i<11 ; i++ ) printf(”%3d -- %3d:%6d\n”,i*10,(i+1)*10-1,j[i] ); (输出内容:从多少分到多少分有多少人)
(The concept of array)
• 具有相同类型的一组变量 • 被分配连续的存储单元 • 用于组织成组数据
14/74
一维数组概念
e.g. 一维数组a:由五个整型变量组成.示意如下:
a[0] a[1] a[2] a[3] a[4]
int int int int int
• 直接设置变量:a0,a1…a49和j0,,j1…j10会导致大量 重复。这样的程序是低效的程序 • 程序设计语言提供数组机制(The Mechanism of Array)来组织类似的成组数据。相同类型的一组 变量称数组。 • 可采用二个数组分别组织二组数据:50个分数及 11个不同分段的人数。具体如下: • 假设: int a[50]-----50个分数 int j[11]-----11个分段的人数
16/74
二维数组概念
e.g. 二维数组a:由排列成三行五列的整 型变量组成。示意如下:
2000(地址)
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] int int int int int 2010 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4 ] 2020 int int int int int a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] int int int int int
2
3 4
a[1]=a[2]
a[2]=a[3] a[3]=a[4]
2
2 2
3
3 3
3
4 4
4
4 5
Note:循环体a[i-1]=a[i];的左值,当i由1变化到4,其具 体形式为:a[0]~a[3]。所以将之列出。
12/74
v.运行示例(Sample Dialog)
输入: 90 100
. . .
65 输出: 0-- 9: 0 10-- 19: 0 20-- 29: 1 30-- 39: 2 40-- 49: 0 50-- 59: 2 60-- 69: 12 70-- 79: 24 80-- 89: 5 90-- 99: 2 100--109: 2
• • • • 掌握一维数组的定义和使用 掌握二维数组的定义和使用 会使用数组输入输出字符串 会使用常用字符串库函数处理字符 串 • 会使用数组名作参数使一组数在函 数间传递
5/74
重要例题和习题
数组部分例题
7.17 输入一组数并求最小者及位置 7.18 数组的最小者与首元素互换 7.19 对一组数用选择法排序 7.21 对于有序序列用二分法查找某数
2000 2002 2004 2006 2008 (地址码) i. 特点(Properties) a. 该数组被分配连续的一块存储单元 b. a[i]在a[i+1]之前
15/74
ii.使用(How to use)
a. 使用前要对数组a进行声明:int a[5];
b. 下标常用作数组元素的地址。若视数组 元素a[i]的地址为i。则可认为a[i]是地址i所 指向的元素
23/74
Assignment
Ex.1 下面程序段的输出是什么? int a[5]={1,2,3,4,5},i,t; t=a[0]; for(i=1;i<5;i++)a[i-1]=a[i]; a[4]=t; for(i=0;i<5;i++) printf(”%3d”,a[i]);
24/74
Given: i=1, a[5]={1,2,3,4,5}
19/74
例题1
e.g. 对上述一维数组a的所有元素求和 i.要点(Basic)
设置一累加变量s,对a[i]进行累加 ii.程序(Source)
int a[5]={1,2,3,4,5},s,i; for(s=0,i=0;i<5;i++)s+=a[i];
20/74
例题2
e.g. 对上述二维数组a的所有元素求和 i.程序(Source) int a[3][5]={ {1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}},s=0,i; for(i=0;i<5;i++)s+=a[0][i]; for(i=0;i<5;i++)s+=a[1][i]; for(i=0;i<5;i++)s+=a[2][i];
26/74
Assignment
Ex.3 以下程序的输出是什么? #include<stdio.h> void main() { int sub(int n); int i=5; printf(“%d\n”,sub(i));} int sub(int n) { int a; if(n==1)return 1; a=n+sub(n-1); return a;}
Chapter 7
Array & User-Defined Type
1/74
学习指导(Learning Guides)
• • • • 概述(Overview) 重要部分(Important parts) 教学目标(Objectives) 重要例题和习题(Important Examples and Exercises) • 难点(Difficulties)
21/74
ii.一般化(Generalization)
Consider 0,1,2 as the values of the variable j, the block:
for(i=0;i<5;i++)s+=a[0][i]; for(i=0;i<5;i++)s+=a[1][i]; for(i=0;i<5;i++)s+=a[2][i]; changes as follows for(i=0;i<5;i++)s+=a[j][i]; (here j=0) for(i=0;i<5;i++)s+=a[j][i]; (here j=1) for(i=0;i<5;i++)s+=a[j][i]; (here j=2)
27/74
例题3
e.g. 输入一个大写字符串,然后以全部小写 字母输出。 i. 程序(Source)
char a[100];int i=0; scanf(“%s”,a) ; [1] while(a[i])a[i++]+=32; [2] printf(”%s\n”,a); [3]
28/74
Note 1: 对scanf(”%s”,a);的注释
数组部分习题:全部 常用算法部分例题
8.3 对一组数用冒泡法排序 8.4 用顺序法查找某数 8.7 十进制数转成其它进制数 8.10 求1000以内的完数 8.12 猴子分桃
结构体部分习题:全部
6/74
难点(Difficulties)
• 冒泡排序算法 • 选择排序算法
7/74
成组数据处理问题实例及解决方法
2/74
内容概述(Contents in Brief)
• 成组数据处理问题实例及解决方法 • 数组的定义及使用 • 常用算法的使用 • 结构体类型的声明及使用
3/74
重要内容(Important Parts)
7.4 字符数组的定义与引用 7.5 数组元素及数组作函数的参数
4/74
教学目标(Objectives)
25/74
Assignment
Ex.2 程序填空。函数gcd的功能是求num1,num2的 最大公约数,并通过a返回该结果。 int gcd(int num1, int num2) {int t,a,b; a=num1; b=num2; while( 1 ) {t=a%b; 2 ; b=t;} return ;} 3
按字符串形式读入数据并为数组a 赋初值
然后在字符串结尾处添加特殊字符’\0‟, 用作字符串结束标志 该语句可换成等价的gets(a)
29/74
Note 2: 对while(a[i])a[i++]+=32;的注释
a[i]表示条件: 第i号元素为非结束标志’\0‟ 该条件成立时,则第i++号元素增32 (即:使 大写变小写。因为’A‟+32=‟a‟)。直到第i号元 素为结束标志时为止
Notes: [1]a表示50个相同类型的一组变量。分别记为:a[0],a[1]……a[49]。每个元 素都是整型int [2]j表示11个相同类型的一组变量。分别记为:j[0],j[1]……a[10]。每个元 素都是整型int
11/74
iv.程序(Source)
int i,k,a[50],j[11]; (声明数组a和j) for ( i=0 ; i<50 ; i++ ) (通过键盘输入使数组a有初值) scanf(”%d”,&(a[i]) );(a[i]为数组a的第i号元素) for ( i=0 ; i<11 ; i++ ) j[i]=0 ; (数组j被清0) for (i=0 ; i<50 ; i++ ) { k=a[i]/10; j[k]++ ;}( j[k]对应第k分段的人数) for ( i=0 ; i<11 ; i++ ) printf(”%3d -- %3d:%6d\n”,i*10,(i+1)*10-1,j[i] ); (输出内容:从多少分到多少分有多少人)
(The concept of array)
• 具有相同类型的一组变量 • 被分配连续的存储单元 • 用于组织成组数据
14/74
一维数组概念
e.g. 一维数组a:由五个整型变量组成.示意如下:
a[0] a[1] a[2] a[3] a[4]
int int int int int
• 直接设置变量:a0,a1…a49和j0,,j1…j10会导致大量 重复。这样的程序是低效的程序 • 程序设计语言提供数组机制(The Mechanism of Array)来组织类似的成组数据。相同类型的一组 变量称数组。 • 可采用二个数组分别组织二组数据:50个分数及 11个不同分段的人数。具体如下: • 假设: int a[50]-----50个分数 int j[11]-----11个分段的人数
16/74
二维数组概念
e.g. 二维数组a:由排列成三行五列的整 型变量组成。示意如下:
2000(地址)
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] int int int int int 2010 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4 ] 2020 int int int int int a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] int int int int int