Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

《C语言程序设计》复习
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
Loops.
第一章 C语言概述 计算机公共教学部.
程序设计基础知识.
補充: Input from a text file
C语言基础——指针的高级应用 Week 05.
专题研讨课二: 数组在解决复杂问题中的作用
C语言程序设计 第八章 函数.
第一章 程序设计入门.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
第六章 数 组 主讲教师 贾月乐 联系电话:
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
選擇排序法 通訊一甲 B 楊穎穆.
函數(一) 自訂函數、遞迴函數 綠園.
排序 Sorting.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
Introduction to the C Programming Language
Introduction to the C Programming Language
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
Function.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
2017北一女中 資訊能力競賽 暑期培訓營
第八章 函数.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
Introduction to the C Programming Language
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
Chap 3 分支结构 3.1 简单的猜数游戏 3.2 四则运算 3.3 查询自动售货机中商品的价格.
第四章 C 语言中的输入和输出.
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
C语言 程序设计基础与试验 刘新国、2012年秋.
期中考试成绩分布 《程序设计》-2017年秋.
THE C PROGRAMMING LANGUAGE
C++语言程序设计 第二章 C++简单程序设计.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
第十章 指针.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
数组 梁春燕 华电信息管理教研室.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
C语言概述 第一章.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
C语言复习3----指针.
C语言大学实用教程 第6章 数组 西南财经大学经济信息工程学院 刘家芬
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
<编程达人入门课程> 本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
第4章 数 组.
第2章 基本数据及其运算 本章学习的目标: 1、掌握基本数据的各种表示,基本数据常数的书写方法;
第四章 C 语言中的输入和输出.
C程序设计.
程序设计基础.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
多重條件選擇敘述
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
Presentation transcript:

Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换

本章要点 什么是数组? 为什么要使用数组? 如何定义数组? 如何引用数组元素? 二维数组的元素在内存中按什么方式存放? 什么是字符串? 字符串结束符的作用是什么? 如何实现字符串的存储和操作,包括字符串的输入和输出? 怎样理解C语言将字符串作为一个特殊的一维字符数组?

7.1 排序问题 输入一个正整数n (1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。 7.1.1 程序解析 7.1 排序问题 输入一个正整数n (1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。 7.1.1 程序解析 7.1.2 一维数组的定义和引用 7.1.3 一维数组的初始化 7.1.4 使用一维数组编程

7.1.1 程序解析-排序 #include <stdio.h> int main(void) { int i, index, k, n, temp; int a[10]; /* 定义1个数组a,它有10个整型元素*/ printf(“Enter n: "); scanf("%d”, &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); for(k = 0; k < n-1; k++){ /* 对n个数排序 */ index = k; for(i = k + 1; i < n; i++) if(a[i] < a[index]) index = i; temp = a[index]; a[index] = a[k]; a[k] = temp; } printf("After sorted: "); for(i = 0; i < n; i++) /* 输出n个数组元素的值 */ printf("%d ", a[i]); return 0; 7.1.1 程序解析-排序 Enter n: 10 Enter 10 integers: 3 5 2 8 1 22 89 0 -1 7 After sorted: -1 0 1 2 3 5 7 8 22 89

for(i = 0; i < n; i++) printf("%d ", a[i]); 数组 0 1 2 9 a[0] a[1] a[9] a 3 5 2 8 1 22 89 0 -1 7 数组:相同类型数据的有序集合,在内存中连续存放。 由数组名和下标惟一地确定每个数组元素 每个元素都属于同一类型 一批相同类型的变量使用同一个数组变量名,用下标来相互区分。 优点:表述简洁,可读性高;便于使用循环结构

7.1.2 一维数组的定义和引用 1、定义 类型名 数组名[数组长度] int a[10]; char c[200]; 7.1.2 一维数组的定义和引用 1、定义 类型名 数组名[数组长度] 类型名:数组元素的类型 数组名:数组(变量)的名称,标识符 数组长度:常量表达式,给定数组的大小 int a[10]; 定义一个含有10个整型元素的数组 a char c[200]; 定义一个含有200个字符元素的数组 c float f[5]; 定义一个含有5个浮点型元素的数组 f

2、引用 先定义,后使用 只能引用单个的数组元素,不能一次引用整个数组 数组元素的使用方法与同类型的变量相同 数组名[下标] 下标:整型表达式 取值范围:[0,数组长度-1] int a[10]; 10个元素:a[0]、a[1]、…… a[9] 数组元素的使用方法与同类型的变量相同 scanf("%d", &a[i]); temp = a[index]; a[index]= a[k]; a[k] = temp; printf("%d ", a[i]); 下标不要越界 不能使用a[10]

区分数组的定义和数组元素的引用 定义数组 引用数组元素 类型名 数组名[数组长度] 数组名[下标] int a[10]; 类型名 数组名[数组长度] 引用数组元素 数组名[下标] int a[10]; a[0] = a[9] = 0; a[k] = temp; 数组长度为常量 下标不要越界

7.1.3 一维数组的初始化 定义数组时,对数组元素赋初值 静态数组、动态数组的初始化 类型名 数组名[数组长度] = {初值表}; 7.1.3 一维数组的初始化 定义数组时,对数组元素赋初值 类型名 数组名[数组长度] = {初值表}; int a[10] = {1,2,3,4,5,6,7,8,9,10}; a[0]=1, a[1]=2,...… a[9]=10 静态数组、动态数组的初始化 static int b[5] = {1, 2, 3, 4, 5}; 静态存储的数组如果没有初始化,所有元素自动赋0 static int b[5]; 动态存储的数组如果没有初始化,所有元素为随机值 auto int c[5];

针对部分元素的初始化 static int b[5] = {1, 2, 3}; auto int fib[20] = {0, 1}; b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 0, b[4] = 0 auto int fib[20] = {0, 1}; fib[0] = 0, fib[1] = 1, 其余元素不确定 如果对全部元素都赋初值,可以省略数组长度 int a[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; /*长度为10*/

7.1.4 使用一维数组编程 数组和循环 for(i = 0; i < n; i++) printf("%d ", a[i]); 7.1.4 使用一维数组编程 数组和循环 for(i = 0; i < n; i++) printf("%d ", a[i]); 数组下标作为循环变量,通过循环,逐个处理数组元素

一维数组示例 例 7-2 用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1, 1, 2, 3, 5, …… 例7-3 输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 例 7-4 输入n(n<10),再输入n个数 (1) 求最小值 (2) 求最小值和它所对应的下标 (3) 将最小值与第一个数交换,输出交换后的n个数 例 7-1 输入n(n<10),再输入n个数,用选择法将它们从小到大排序后输出。

例 7-2 计算fibonacci数列 用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。 1, 1, 2, 3, 5, 8, 13, …… 用数组计算并存放fibonacci数列的前20个数 f[0] = f[1] = 1 f[n] = f[n-1] + f[n-2] 2≤n≤19

例 7-2 源程序 #include <stdio.h> int main(void) { int i; int fib[20] = {1, 1}; /* 数组初始化 */ for(i = 2; i < 20; i++) fib[i] = fib[i - 1] + fib[i - 2]; for(i = 0; i < 20; i++){ printf("%6d", fib[i]); if((i + 1) % 5 == 0) /* 5个数换行 */ printf("\n"); } return 0; 例 7-2 源程序 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

例7-3 在数组中查找一个给定的数 输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 输入:2 9 8 9 6 9 输出:1 7 输出:Not Found

例 7-3 源程序 Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 1 #include <stdio.h> int main(void) { int i, flag, x; int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); flag = 0; if(a[i] == x){ printf("Index is %d\n", i); flag = 1; break; } if(flag == 0) printf("Not Found\n"); return 0; 例 7-3 源程序 Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 1 Enter 5 integers: 2 9 8 1 9 Enter x: 7 Not Found

例 7-3 思考(1) #include <stdio.h> int main(void) { int i, flag, x; int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); flag = 0; if(a[i] == x){ printf("Index is %d\n", i); flag = 1; break; } if(flag == 0) printf("Not Found\n"); return 0; 例 7-3 思考(1) Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 1 Index is 4

例 7-3 思考(2) #include <stdio.h> int main(void) { int i, sub, x; int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); sub = -1; if(a[i] == x) sub = i; if(sub != -1) printf("Index is %d\n", i); else printf("Not Found\n"); return 0; } 例 7-3 思考(2) Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 4

例 7-4(1) 求最小值 #include <stdio.h> int main(void) { int i, min, n; 例 7-4(1) 求最小值 #include <stdio.h> int main(void) { int i, min, n; int a[10]; printf(“Enter n: "); scanf("%d", &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); min = a[0]; for(i = 1; i < n; i++) if(a[i] < min) min = a[i]; printf("min is %d \n", min); return 0; } Enter n: 6 Enter 6 integers: 2 9 -1 8 1 6 min is -1

例 7-4(2) 求最小值及其下标 输入n(n<10), 再输入n个数, 输出最小值和它所对应的下标。 例 7-4(2) 求最小值及其下标 输入n(n<10), 再输入n个数, 输出最小值和它所对应的下标。 用index记录最小值对应的下标 a[index]就是最小值

求最小值及下标 #include <stdio.h> int main(void) { int i, index, n; int a[10]; printf(“Enter n: "); scanf("%d", &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); index = 0; for(i = 1; i < n; i++) if(a[i] < a[index]) index = i; printf("min is %d\tsub is %d\n", a[index], index); return 0; } 求最小值及下标 Enter n: 6 Enter 6 integers: 2 9 -1 8 1 6 min is -1 sub is 2

例 7-4(3) 交换最小值 输入n(n<10), 再输入n个数,将最小值与第一个数交换,输出交换后的n个数。 例 7-4(3) 交换最小值 输入n(n<10), 再输入n个数,将最小值与第一个数交换,输出交换后的n个数。 用index记录最小值对应的下标 a[index]就是最小值 最小值与第一个数交换 a[index] <==> a[0]

例 7-1 选择法排序 输入n(n<10), 再输入n个数,用选择法将它们从小到大排序后输出。 3 5 2 8 1 例 7-1 选择法排序 输入n(n<10), 再输入n个数,用选择法将它们从小到大排序后输出。 设 n=5 3 5 2 8 1 3 5 2 8 1 (1) 1 5 2 8 3 (2) 2 5 8 3 (3) 3 8 5 (4) 5 8

选择法(1) 3 5 2 8 1 (n=5) (1) 1 5 2 8 3 a[4] <==> a[0] 5个数(a[0]~a[4])中找最小数,与a[0]交换 (1) 1 5 2 8 3 a[4] <==> a[0] 4个数(a[1]~a[4])中找最小数,与a[1]交换 (2) 1 2 5 8 3 a[2] <==> a[1] 3个数(a[2]~a[4])中找最小数,与a[2]交换 (3) 1 2 3 8 5 a[4] <==> a[2] 2个数(a[3]~a[4])中找最小数,与a[3]交换 (4) 1 2 3 5 8 a[4] <==> a[3]

选择法(2) (1) 5个数 (a[0]~a[4]) 中找最小数,与 a[0] 交换 (1) n个数 (a[0]~a[n-1]) 中找最小数,与 a[0] 交换 (2) n-1个数 (a[1]~a[n-1]) 中找最小数,与 a[1] 交换 …… (n-1) 2个数 (a[n-2]~a[n-1]) 中找最小数,与 a[n-2] 交换

流程图 输入数组a k=0 假(0) k<n-1 index=k i=k+1 i<n 真(非0) a[i]<a[index] index=i i=i+1 交换a[index]和a[k] 输出数组a index=k i=k+1 k=k+1 i<n

选择法排序 (程序段) for(k = 0; k < n-1; k++){ index = k; for(i = k + 1; i < n; i++) if(a[i] < a[index]) index = i; temp = a[index]; a[index] = a[k]; a[k] = temp; } Enter n: 5 Enter 10 integers: 3 5 2 8 1 After sorted: 1 2 3 5 8

7.2 找出矩阵中最大值所在的位置 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 7.2 找出矩阵中最大值所在的位置 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 7.2.1 程序解析 7.2.2 二维数组的定义和引用 7.2.3 二维数组的初始化 7.2.4 使用二维数组编程

7.2.1 程序解析-求矩阵的最大值 例 7-5 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 row 记录最大值的行下标 Col 最大值的列下标 a[row][col] 就是最大值

例7-5 源程序 int main(void) { int col, i, j, row; int a[3][2]; printf(“Enter 6 integers:\n") ; for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) scanf("%d", &a[i][j]); for(i = 0; i < 3; i++){ printf("%4d", a[i][j]); printf("\n"); } row = col = 0; if(a[i][j] > a[row][col]){ row = i; col = j; printf("max = a[%d][%d] = %d\n", row, col, a[row][col]); return 0; 例7-5 源程序 Enter 6 integers: 3 2 10 -9 6 -1 3 2 max = a[1][0] = 10

二维数组 多维数组的空间想象 一维数组: 一列长表或一个向量 二维数组: 一个表格或一个平面矩阵 三维数组: 三维空间的一个方阵 多维数组: 多维空间的一个数据列阵

7.2.2 二维数组的定义和引用 1、定义 类型名 数组名[行长度][列长度] int a[3][2]; int b[5][10]; 类型名 数组名[行长度][列长度] int a[3][2]; 定义1个二维数组a,3行2列,6个元素 int b[5][10]; 定义1个二维数组a,5 行 10 列, 50 个元素

2、引用 数组元素的引用: 数组名[行下标] [列下标] int a[3][2]; 3 行 2 列, 6 个元素 行下标和列下标:整型表达式 行下标的取值范围是[0,行长度-1] 列下标的取值范围是[0,列长度-1] int a[3][2]; 3 行 2 列, 6 个元素 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 下标不要越界

二维数组在内存中的存放方式 int a[3][2]; 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] 3 行 2 列, 6 个元素 表示1个3行2列的矩阵 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]

7.2.3 二维数组的初始化 1、分行赋初值 数组a 1 2 3 4 5 6 7 8 9 数组b 1 2 3 0 0 0 4 5 0 7.2.3 二维数组的初始化 1、分行赋初值 int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; static int b[4][3] = {{1,2,3},{ },{4,5}}; 数组a 1 2 3 4 5 6 7 8 9 数组b 1 2 3 0 0 0 4 5 0 2、顺序赋初值 int a[3][3] = {1,2,3,4,5,6,7,8,9}; static int b[4][3] = {1,2,3,0,0,0,4,5};

省略行长度 数组b 1 2 3 数组a 0 0 0 1 2 3 4 5 0 4 5 6 7 8 9 对全部元素都赋了初值, int a[ ][3]={1,2,3,4,5,6,7,8,9}; 或分行赋初值时,在初值表中列出了全部行 static int b[ ][3]={{1,2,3},{},{4,5},{}} 数组b 1 2 3 0 0 0 4 5 0 数组a 1 2 3 4 5 6 7 8 9

7.2.4 使用二维数组编程 行下标和列下标分别做为循环变量, 通过二重循环,遍历二维数组 通常将行下标做为外循环的循环变量 列下标 内循环

例7-6 生成一个矩阵并输出 定义1个 3*2 的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。 例7-6 生成一个矩阵并输出 定义1个 3*2 的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。 a[i][j] = i + j(0≤i≤2,0≤j≤1) int a[3][2]; a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 0 1 1 2 2 3

例7-6 源程序 #include <stdio.h> int main(void) { int i, j; 例7-6 源程序 #include <stdio.h> int main(void) { int i, j; int a[3][2]; for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) a[i][j] = i + j; for(i = 0; i < 3; i++){ printf("%4d", a[i][j]); printf("\n"); } return 0; a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 0 1 1 2 2 3 i = 0 j = 0 i = 0 j = 1 i = 1 j = 0 i = 1 j = 1 i = 2 j = 0 i = 2 j = 1

二维数组的输入 例7-5中,int a[3][2]; for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) scanf("%d", &a[i][j]); Enter 6 integers: 2 10 -9 6 -1 3 -9 2 6 10 -1 max = a[2][0] = 10 Enter 6 integers: 3 2 10 -9 6 -1 3 2 10 -9 6 -1 max = a[1][0] = 10 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] for(j = 0; j < 2; j++) for(i = 0; i < 3; i++) scanf("%d", &a[i][j]);

矩阵与二维数组 int a[N][N]; N是正整数 a[i][j]:i、j的取值范围[0,N-1] a[0][0] a[0][1] a[0][2] 主对角线 a[1][0] a[1][1] a[1][2] 上三角 a[2][0] a[2][1] a[2][2] 下三角 付对角线 i==j i<=j i>=j i+j==N-1

例7-7 方阵转置 输入一个正整数n (1<n≤6),根据下式生成1个n*n的方阵,然后将该方阵转置(行列互换)后输出。 例7-7 方阵转置 输入一个正整数n (1<n≤6),根据下式生成1个n*n的方阵,然后将该方阵转置(行列互换)后输出。 a[i][j] = i * n + j + 1(0≤i≤n-1,0≤j≤n-1) 分析:int a[6][6]; n=3时 1 2 3 4 5 6 7 8 9 1 4 7 2 5 8 3 6 9 a[i][j] a[j][i] a[0][1] a[1][0] a[0][2] a[2][0] a[1][2] a[2][1]

例7-7 源程序 #include <stdio.h> int main(void) { int i, j, n, temp; int a[6][6];   printf(“Enter n: "); scanf("%d", &n); /* 给二维数组赋值 略……*/ /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++) if(i <= j){ /* 只遍历上三角阵 */ temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } /* 按矩阵的形式输出a 略…… */ return 0; 例7-7 源程序

例7-7 说明 1 2 3 4 5 6 7 8 9 /* 行列互换*/ for(i = 0; i < n; i++) 1 2 3 4 5 6 7 8 9 主对角线:i == j 上三角: i <= j 下三角: i > =j /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++) if(i <= j){ temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } i=0 1 4 7 2 5 6 3 8 9 i=1 1 4 7 2 5 8 3 6 9 for( j = i+1; j < n; j++)

例7-7 思考 /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++){ temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } 1 2 3 4 5 6 7 8 9 i=0 1 4 7 2 5 6 3 8 9 i=1 1 2 7 4 5 8 3 6 9 i=2 1 2 3 4 5 6 7 8 9

例7-8 日期计算 自定义1个函数day_of_year(year, month, day),计算并返回年year、月month和日day对应的是该年的第几天。 day_of_year(2000, 3, 1) 返回61 day_of_year(1981, 3, 1) 返回60 分析: 月 0 1 2 3……11 12 非闰年 0 31 28 31 30 31 闰年 0 31 29 31 30 31 int tab[2][13]={ {0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31} {0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31} }

例7-8 源程序 int day_of_year(int year, int month, int day) { int k, leap; 例7-8 源程序 int day_of_year(int year, int month, int day) { int k, leap; int tab[2][13]={ {0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31} {0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31} }; leap = (year%4==0&&year%100!=0) || year %400==0; for (k=1; k<month; k++) day = day + tab[leap][k]; return day; }

7.3 进制转换 例7-9 输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。 7.3 进制转换 例7-9 输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。 7.3.1 程序解析 7.3.2 一维字符数组 7.3.3 字符串

7.3.1 程序解析- 进制转换 #include <stdio.h> int main(void) { int i, n; char s[10]; printf(“Enter a string: ");   /* 输入字符串 */ i = 0; while((s[i] = getchar( )) != '\n') i++; s[i] = '\0'; n = 0; /* 将字符串转换为整数 */ for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; printf("digit = %d\n", n); return 0; } 7.3.1 程序解析- 进制转换 Enter a string: 123 digit = 123

7.3.2 一维字符数组 字符串的存储和运算可以用一维字符数组实现 一维字符数组的定义、引用、初始化与其他类型的一维数组一样。 t char str[80]; 定义一个含有80个字符型元素的数组str char t[5]={'H', 'a', 'p', 'p', 'y'}; 初始化数组 t 输出数组 t 的所有元素 for(i=0; i<5; i++) putchar( t[i] ); t[0] t[1] t[4] t H a p p y

一维字符数组 t s char t[5] = {'H', 'a', 'p', 'p', 'y'}; static char s[6] = {'H', 'a', 'p', 'p', 'y'}; static char s[6]={'H', 'a', 'p', 'p', 'y', 0}; 0代表字符'\0',也就是ASCII码为0的字符 static char s[6]={'H', 'a', 'p', 'p', 'y', '\0'}; t[0] t[1] t[4] t H a p p y s[0] s[1] s[5] s H a p p y \0

7.3.3 字符串 字符串常量 用一对双引号括起来的字符序列 一个字符串结束符 '\0' "Happy" 7.3.3 字符串 字符串常量 用一对双引号括起来的字符序列 一个字符串结束符 '\0' "Happy" 6个字符 'H' 'a’ 'p’ 'p’ 'y' '\0' 字符串结束符 有效字符 字符串的有效长度:有效字符的个数

字符串与一维字符数组 字符串:一个特殊的一维字符数组 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作

1. 字符串的存储-数组初始化 s 字符串可以存放在一维字符数组中 static char s[6] = {'H', 'a', 'p', 'p', 'y', '\0'}; 字符数组初始化:用字符串常量 static char s[6] = {"Happy"}; static char s[6] = "Happy"; 数组长度 >= 字符串的有效长度 + 1 char t[5]; "Happy" 能存入t吗? s[0] s[1] s[5] s H a p p y \0

字符串的存储 s auto char s[80]= "Happy"; 字符串遇 '\0' 结束 '\0' 之后的其他数组元素与该字符串无关 字符串由有效字符和字符串结束符 '\0' 组成 s[0] s[1] s[5] s H a p p y \0 ? ?

2. 对字符串的操作 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作 普通字符数组:数组元素的个数是确定的,一般用下标控制循环 字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 '\0' 之前的字符都是字符串的有效字符,一般用结束符 '\0' 来控制循环 循环条件:s[i] != '\0'

例6-10 计算字符串的有效长度 s H a p p y \0 ? ? s[0] s[1] s[5] 计算字符串的有效长度,并输出该字符串。 例6-10 计算字符串的有效长度 s[0] s[1] s[5] s H a p p y \0 ? ? 计算字符串的有效长度,并输出该字符串。 字符串的有效长度:有效字符的个数 数组中第一个 '\0' 前面的字符个数

例7-10 源程序 s #include <stdio.h> int main(void) { int i = 0, len; char str[80] = "Happy"; /* 初始化 */ for(i = 0; str[i] != '\0'; i++) ; len = i; printf("len = %d\n", len); for(i = 0; str[i] != '\0'; i++) /* 输出字符串 */ putchar(str[i]); return 0; } 例7-10 源程序 len = 5 Happy 循环条件 s[0] s[1] s[5] s H a p p y \0 ? ?

输出字符串 s for(i = 0; s[i] != '\0'; i++) putchar(s[i]); for(i = 0; i < 80; i++) for(i = 0; i < len; i++) s[0] s[1] s[5] s H a p p y \0 ? ?

3. 字符串的存储-赋值和输入 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作 存储 数组初始化 赋值 static char s[6]= "Hello"; 赋值 s[0]='a'; s[1]='\0'; 或者 static char s[6]= "a"; 区分"a" 和 'a' "a" 2 个字符 'a' 和 '\0' 'a' 1 个字符常量

字符串的输入 字符串的存储 字符数组初始化:static char s[6] = "Happy"; 赋值:s[0] = 'a'; s[1] = '\0'; 输入 '\0' 代表空操作,无法输入 输入时,设定一个输入结束符 将输入结束符转换为字符串结束符 '\0'

例7-11 统计字符 输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。 分析: 数组长度取上限80 以 '\n' 做为输入结束符

例7-11 源程序 #include <stdio.h> int main(void) { int count, i; char str[80];  printf(“Enter a string: "); i = 0; while((str[i] = getchar( )) != '\n') i++; str[i] = '\0'; /* 输入结束符=>字符串结束符 */ count = 0; for(i = 0; str[i] != '\0'; i++) if(str[i] <= '9' && str[i] >= '0') count++; printf("count = %d\n", count); return 0; } 例7-11 源程序 字符串的输入 如何改变输入结束符? 能省略str[i] = '\0'吗? Enter a string: It's 512? count = 3 0 1 2 3 4 5 6 7 8 s I t ' s 5 1 2 \0 ? ?

例7-9 进制转换 s #include <stdio.h> int main(void) { int i, n; char s[10]; printf(“Enter a string: ");   /* 输入字符串 */ i = 0; while((s[i] = getchar( )) != '\n') i++; s[i] = '\0'; n = 0; /* 将字符串转换为整数 */ for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; printf("digit = %d\n", n); return 0; } 例7-9 进制转换 Enter a string: 123 digit = 123 0 1 2 3 s 1 2 3 \0 ? ?

进制转换方法 s i s[i] s[i]-'0' n = n*10+(s[i]-'0') 0 '1' 1 0*10+1 = 1 0 1 2 3 s 1 2 3 \0 ? ? n = 0; for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; Enter a string: 1#2#3 digit = i s[i] s[i]-'0' n = n*10+(s[i]-'0') 0 '1' 1 0*10+1 = 1 1 '2 ' 2 1*10+2 =12 2 '3' 3 12*10+3 =123 3 '\0'

字符串小结 字符串:一个特殊的一维字符数组 '\0' 把字符串放入一维字符数组(存储) s 数组长度足够 H a p p y \0 ? ? 字符串:一个特殊的一维字符数组 '\0' 把字符串放入一维字符数组(存储) 数组长度足够 字符数组初始化: static char s[80] = "Happy"; 赋值: s[0] = 'a'; s[1] = '\0'; 输入: 输入结束符 ==> 字符串结束符'\0' i = 0; while((s[i]=getchar( )) != '\n') i++; s[i] = '\0'; s[0] s[1] s[5] s H a p p y \0 ? ?

对字符串的操作 ===> 对字符数组的操作 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作 只针对字符串的有效字符和字符串结束符 '\0' 检测 for(i = 0; s[i] != '\0'; i++) putchar(s[i]); s[0] s[1] s[5] s H a p p y \0 ? ?