第六章 数 组 主讲教师 贾月乐 联系电话: 13402866690.

Slides:



Advertisements
Similar presentations
第 8 章 数组 计算机科学学院 李淮 Tel QQ
Advertisements

《C语言程序设计》复习
C语言程序设计 主讲教师 :张群燕 电话:
电子成绩单项目实现.
C语言程序设计教程 单位:德州学院计算机系.
第九章 字串 (String).
4.3 使用二维数组 P 求两个矩阵的和 求方阵对角线上元素之和 显示算术题和学生答题信息
C语言基础——指针的高级应用 Week 05.
第九章 指针 目录 指针与指针变量的概念 变量的指针和指向变量的指针变量 数组的指针和指向数组的指针变量
C语言程序设计 第十二章 位运算.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
复习与总结.
高级语言程序设计 主讲人:陈玉华.
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
選擇排序法 通訊一甲 B 楊穎穆.
Introduction to the C Programming Language
项目六 用指针优化学生成绩排名 项目要求 项目分析
Introduction to the C Programming Language
Introduction to the C Programming Language
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
Introduction to the C Programming Language
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
C语言程序设计 李祥.
算法的基本概念.
字符串和字符数组 字符串的输入和输出 字符串的基本操作
第八章 使用指针.
函 数 实验八 第24讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
第十章 指针.
第三章 顺序结构程序设计 主讲教师 贾月乐 电话:
第五章 习题课 电子信息与计算机科学系 曾庆尚.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
数组 梁春燕 华电信息管理教研室.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++大学基础教程 第5章 数组 北京科技大学 信息基础科学系.
|09 陣列.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
C语言概述 第一章.
C语言复习3----指针.
第 二 章 数据类型、运算符与表达式.
C语言大学实用教程 第6章 数组 西南财经大学经济信息工程学院 刘家芬
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
函式庫補充資料.
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华。 10.1 地址和指针的概念 内存中的每一个字节都有一个地址。
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
第4章 数 组.
第九章 指针.
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
实验七 数 组 第21讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
第七章  数 组.
程式設計--linear search 通訊一甲 B 楊穎穆.
第1章程序设计和C语言.
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
Introduction to the C Programming Language
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
第九章 指针 C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
第二章 计算机中的信息表示.
字串 第10章 part I 8/30/2019.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
陣列與檔案處理 授課:張朝麟 日期:2009/3/11.
台大資訊工程學系 資料系統訓練班 第119期 吳晉賢
C语言基础学习 从外行到入门.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第六章 数 组 主讲教师 贾月乐 联系电话: 13402866690

第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU

唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢? 为什么要使用数组 唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢?

为什么要使用数组 文学类 中国音乐类 计算机类 西方音乐类

为什么要使用数组 数组 内存 120 65 98 4 数组的元素 容器中保 存的物品 日常生活中的容器 程序中的数组

6.1 一维数组 一维数组的定义 一维数组元素的引用 一维数组的初始化 一维数组的输入、输出 一维数组应用举例 1 2 3 4 5 6.1 一维数组 一维数组的定义 1 一维数组元素的引用 2 一维数组的初始化 3 一维数组的输入、输出 4 一维数组应用举例 5 C语言程序设计——算法的描述 SCS-SWPU

6.1.1 一维数组的定义 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 6.1.1 一维数组的定义 存放一个学生的学习成绩 存放一个班100个学生的成绩呢? 这些数据的特点是: 具有相同的数据类型 float s; C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 C语言程序设计——算法的描述 SCS-SWPU

6.1.1 一维数组的定义 1、定义格式: 数据类型 数组名[ 整型常量表达式 ]; 例如: int socre[50]; 6.1.1 一维数组的定义 1、定义格式: 数据类型 数组名[ 整型常量表达式 ]; 例如: int socre[50]; char a[20]; 定义格式说明: 1、数组名的定义遵循用户自定义标识符的要求。 2、常量表达式中可以包括常量和符号常量,不能包含 变量 #define SIZE 10 int a[SIZE]; C语言程序设计——算法的描述 SCS-SWPU

√   6.1.1 一维数组的定义 以下数组定义是否正确 #define s 10 int a[s]; float f[5]; 6.1.1 一维数组的定义 以下数组定义是否正确 #define s 10 int a[s]; float f[5]; int s=10; int a[s]; float b[3.4] int n; scanf(“%d″,&n) int a[n]; √   数组说明中其他常见的错误: ① float a[0]; /* 数组大小为0没有意义 */ ② int b(2); /* 不能使用圆括号 */ C语言程序设计——算法的描述 SCS-SWPU

每个数据元素占用的字节数,就是基本类型的字节数 6.1.1 一维数组的定义 2.一维数组在内存中的存放 一维数组: float mark[100]; mark[0] mark[1] mark[2] mark[3] . mark[99] 86.5 92.0 77.5 52.0 94.0 低地址 高地址 每个数据元素占用的字节数,就是基本类型的字节数 一个元素占4个字节 数组名就是存放数组的首地址 C语言程序设计——算法的描述 SCS-SWPU

注意 数组下标从0开始 6.1.2 一维数组元素的引用 2、数组元素的引用 定义:int a[3]; 6.1.2 一维数组元素的引用 2、数组元素的引用 定义:int a[3]; 则有3个整型变量:a[0]、a[1]、a[2], 数组的下标都是从0开始. 引用数组元素时下标可为任意表达式,动态决定访问哪个元素 for (i=0; i<SIZE; i++) a[i] = 2 * i; 下标越界是大忌! 定义:int a[10]; 那么数组元素为a[0] ~a[9] 使用大于最大下标的下标,将访问数组以外的空间。那里的数 据是未知的,系统不做下标越界检查,但可能带来严重后果 sizeof可以用来获得数组大小 定义数组时用到的“数组名[常量表达式]” 引用数组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; t=a[9]; 数组下标从0开始 注意 C语言程序设计——算法的描述 SCS-SWPU

6.1.3 一维数组元素的初始化 3、一维数组的初始化 即:给数组元素赋初值 1)定义数组的同时赋初值 6.1.3 一维数组元素的初始化 3、一维数组的初始化 即:给数组元素赋初值 1)定义数组的同时赋初值 int a[5] = { 12, 34, 56 ,78 ,9 }; 2)给一部分元素赋初值 int a[10]={12,34,56,78,9}; 3)对全部数组元素赋初值,可以不指定数组长度 int a[ ] = { 11, 22, 33, 44, 55 }; a[0]=12 a[1]=34 a[2]=56 a[3]=78 a[4]=9 后5个元素的值为0 等价于:int a[5] = { 11, 22, 33, 44, 55 }; C语言程序设计——算法的描述 SCS-SWPU

6.1.3 一维数组元素的初始化 4)使一个数组中全部元素值为0 5)建议: 数组大小使用宏常量,以适应未来可能的变化 6.1.3 一维数组元素的初始化 4)使一个数组中全部元素值为0 int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10]={0}; 不能写成:int a[10]={0*10}; 或 int a[10]={ }; 5)建议: 数组大小使用宏常量,以适应未来可能的变化 #define SIZE 10 int a[SIZE]; C语言程序设计——算法的描述 SCS-SWPU

6.1.4 一维数组的输入输出 4、一维数组的输入和输出 只能逐个对数组元素进行操作(字符串数组例外) 设有定义:int a[10],i; 6.1.4 一维数组的输入输出 4、一维数组的输入和输出 只能逐个对数组元素进行操作(字符串数组例外) 设有定义:int a[10],i; 输入方法: 输出方法: 输入第i个数组元素: 输出第i个数组元素: scanf("%d",&a[i]); printf("%d",a[i]); 输入整个数组元素: 输出整个数组元素: for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%d",a[i]); C语言程序设计——算法的描述 SCS-SWPU

6.1.4 一维数组的输入输出 以下数组操作格式是否正确?? 3、 float a[0]; 4、 int b(2); 6.1.4 一维数组的输入输出 以下数组操作格式是否正确?? 3、 float a[0]; 4、 int b(2); 5、int b[4]={0}; 6、int b[ ]={0,0,0}; 1、 int n; scanf(“%d″,&n); int a[n]; 2、#define n 5 int a[n]; 7、int a[4]; a[4]={1,2,3,4}; 8、int a[4]; a[3]=2; 9、int a[ ]={1,2,3,4}; a[2]=a[1+2]+2; 10、int a[ ]={1,2,3,4}; a[2]=a[2+2]+2; C语言程序设计——算法的描述 SCS-SWPU

练习 1:若有定义语句:int m[]={5,4,3,2,1},i=4;,则 下面对m数组元素的引用中错误的是( ). A)m[--i] B)m[2*2] C)m[m[0]] D)m[m[i]] 2:若要求定义具有10个int型元素的一维数组a,则 下列定义语句中错误的是( )。 A)#def1ne N 10 B)#define n 5 int a [N]; int a[2*n]; C)int a [5+5]; D)int n=10,a[n];

练习 i=1 x[i-1] 下列程序的功能是:求出数组x中各相邻两个元素的和依 次存放到a数组中,然后输出。请填空。 main() { int x[10],a[9],i; for(i=0; i<10; i++) scanf(''%d'',&x[i]); for( ( ) ; i<10; i++) a[i-1]=x[i]+( ); for(i=0;i<9; i++) printf(''%d'',a[i]); printf(''\n''); } i=1 x[i-1]

6.1.5 一维数组的应用举例 例1:从键盘输入10个学生的成绩存放到数组score中, 统计最高分数学生人数,并输出对应的下标 分析: 6.1.5 一维数组的应用举例 例1:从键盘输入10个学生的成绩存放到数组score中, 统计最高分数学生人数,并输出对应的下标 分析: 1、定义float score[10], 最高分max=0,最高分人数 count=0; 2、循环:输入第i位学生的成绩score[i];并与max比较, 如果大于max,则max=score[i]; 3、循环:把每个学生成绩score[i]与max比较,若相等则 count++,并输出下标i C语言程序设计——算法的描述 SCS-SWPU

统计成绩最高分 6.1.5 一维数组的应用举例 #include <stdio.h> main( ) 6.1.5 一维数组的应用举例 统计成绩最高分 #include <stdio.h> main( ) { float score[10],max=0; int count=0,i; for(i=0;i<10;i++) { scanf("%f",&score[i]); if(max<score[i]) max=score[i]; } printf("得到最高分学生序号为:\n"); if(max==score[i]) { count++; printf("%d\t",i); printf("\n共有%d个学生得到最高分!\n",count); C语言程序设计——算法的描述 SCS-SWPU

6.1.5 一维数组的应用举例——冒泡排序 第 一 趟 比 较 例3 :用冒泡排序法对6个整数进行从小到大排序 6.1.5 一维数组的应用举例——冒泡排序 例3 :用冒泡排序法对6个整数进行从小到大排序 如有数:9,8,5,4,2,0 第 一 趟 比 较 经过第一趟(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二趟比较, C语言程序设计——算法的描述 SCS-SWPU

6.1.5 一维数组的应用举例——冒泡排序 第 二 趟 比 较 6.1.5 一维数组的应用举例——冒泡排序 第 二 趟 比 较 如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。 C语言程序设计——算法的描述 SCS-SWPU

6.1.5 一维数组的应用举例——冒泡排序 程序流程图如下: C语言程序设计——算法的描述 SCS-SWPU

冒泡程序 6.1.5 一维数组的应用举例——冒泡排序 #include <stdio.h> #define N 6 6.1.5 一维数组的应用举例——冒泡排序 冒泡程序 #include <stdio.h> #define N 6 void main( ) { int a[N],temp,i,j; for(i=0;i<N;i++) scanf("%d",&a[i]); for(j=1;j<=N-1;j++) for(i=0;i<=N-j-1;i++) if(a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } for(i=0;i<N;i++) printf("%4d",a[i]); printf("\n"); C语言程序设计——算法的描述 SCS-SWPU

6.1.5 一维数组的应用举例 例2 求Fibonacci (斐波纳契)数列:1,1,2,3,5,8,……的前40个数。 6.1.5 一维数组的应用举例 例2 求Fibonacci (斐波纳契)数列:1,1,2,3,5,8,……的前40个数。 f[1]=1 f[2]=1 Fn=Fn-1+Fn-2 (n≥3) #include <stdio.h> # define N 40 main( ) { int f[N]={1,1},i; for(i=2;i<N;i++) {f[i]=f[i-1]+f[i-2];} for(i=0;i<N;i++) { if(i%5==0) printf("\n"); printf("%12d",f[i]); } f[0]=1, f[1]=1 for i=2 to 39 f[i]=f[i-1]+f[i-2] C语言程序设计——算法的描述 SCS-SWPU

第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU

6.2 二维数组 二维数组的定义 二维数组元素的引用 二维数组的初始化 二维数组的输入、输出 二维数组的应用举例 1 2 3 4 5 6.2 二维数组 二维数组的定义 1 二维数组元素的引用 2 二维数组的初始化 3 二维数组的输入、输出 4 二维数组的应用举例 5 C语言程序设计——算法的描述 SCS-SWPU

6.2.1 二维数组的定义 二维数组的定义: 数:2 3 5 6 7 8 若: → 用int a[6]可以存储 2 3 5 6 6.2.1 二维数组的定义 数:2 3 5 6 7 8 若: 2 3 5 6 7 8 9 3 3 4 6 8 二维数组的定义: 数据类型 数组名[常量表达式1][常量表达式2]; 例如: int a[3][4]; //定义三行四列,共有12个元素 → 用int a[6]可以存储 →用怎样的数组存储? 不能写成 int a[3,4],b[5,10]; C语言程序设计——算法的描述 SCS-SWPU

6.2.1 二维数组的定义 a[0] a[1] a[2] a[3] 在逻辑上可以把二维数组看成是一个具有行和列的表格或 一个矩阵。 6.2.1 二维数组的定义 在逻辑上可以把二维数组看成是一个具有行和列的表格或 一个矩阵。 如 int a[4][5],二维数组a[4][5]的逻辑结构见表7-1。 第0列 第1列 第2列 第3列 第4列 a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[3] a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] C语言程序设计——算法的描述 SCS-SWPU

6.2.1 二维数组的定义 二维数组在内存中的存放: 下图表示对a[3][4]数组存放的顺序 按行存放 6.2.1 二维数组的定义 二维数组在内存中的存放: 下图表示对a[3][4]数组存放的顺序 按行存放 ——即先顺序存放第一行的元素,再存放第二行的元素…… C语言程序设计——算法的描述 SCS-SWPU

6.2.2 二维数组元素的引用 二维数组元素的表示形式为: 数组名[下标][下标] 例如: a[2][3] 6.2.2 二维数组元素的引用 二维数组元素的表示形式为: 数组名[下标][下标] 例如: a[2][3] 下标可以是整型表达式,如 a[2-1] [2*2-1] 不要写成 a[2,3],a[2-1,2*2-1]形式 二维数组的元素照常按照普通变量使用即可 例如:b[1][2]=a[2][3]/2 常出现的错误有: int a[3][4]; /* 定义a为3×4的数组 */ ┆ a[3][4]=3; C语言程序设计——算法的描述 SCS-SWPU

6.2.3 二维数组的初始化 二维数组的初始化有以下四种形式: ① 分行进行初始化; ② 不分行的初始化; 6.2.3 二维数组的初始化 二维数组的初始化有以下四种形式: ① 分行进行初始化; ② 不分行的初始化; ③ 省略第一维的定义,不省略第二维的定义。 ④ 部分数组元素初始化; int b[2][3] = {{1,2,3},{4,5,6}}; int b[2][3] = {1,2,3,4,5,6}; int b[ ][3] = {1,2,3,4,5,6}; C语言程序设计——算法的描述 SCS-SWPU

6.2.3 二维数组的初始化 ④ 对部分元素赋初值: 例如: int a[3][4]={{1},{5},{9}}; 也可以对各行中的某一元素赋初值,如 int a[3][4]={{1},{0,6},{0,0,0,11}}; 1 0 0 0 5 6 0 0 0 0 0 0 1 0 0 0 0 6 0 0 0 0 0 11 1 0 0 0 5 0 0 0 9 0 0 0 也可以只对某几行元素赋初值。如: int a[3][4]={ {1},{5,6} }; C语言程序设计——算法的描述 SCS-SWPU

6.2.4 二维数组的输入输出 ⑤ 从键盘动态给二维数组元素赋初值 用双重循环动态给二维数组赋初值或输出值 例如:int a[3][4] 6.2.4 二维数组的输入输出 ⑤ 从键盘动态给二维数组元素赋初值 用双重循环动态给二维数组赋初值或输出值 例如:int a[3][4] for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”,&a[i][j]); printf(“%d”,a[i][j]); C语言程序设计——算法的描述 SCS-SWPU

二维数组的定义、初始化、引用小结 例如:整型数组 b[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} }; 地址 值 数组元素 3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] b[2][0] b[2][1] b[2][2] 1 2 3 4 5 6 789 C语言程序设计——算法的描述 SCS-SWPU

练习 下列数组定义中错误的是( )。 A)int x[2][3]={0}; 下列数组定义中错误的是( )。 A)int x[2][3]={0}; B)int x[2][3]={{1,2},{3,4},{5,6}}; C)int x[ ][3]={{1,2,3},{4,5,6}}; D)int x[2][3]={1,2,3,4,5,6}; 有下列程序: main() { int i,t[ ][3]}={9,8,7,6,5,4,3,2,1}; for(i=0;i<3;i++) printf(''%d'',t[2-i][i]); } 程序执行后输出结果是( )。 A)7 5 3 B)3 5 7 C)3 6 9 D)7 5 1

练习 若有定义语句:int a[3][6];,按在内存的存放顺序,a数组 的第10个元素是( )。 A)a[0][4] B)a[1][3] C)a[0][3] D)a[1][4] 以下错误的定义语句是( )。 A)int x[ ][3]={{0},{1},{ 1,2,3}}; B)int x[4][3]={{ 1,2,3},{ 1,2,3},{ 1,2,3},{ 1,2,3}}; C)int x[4][ ]={{ 1,2,3},{ 1,2,3},{ 1,2,3},{ 1,2,3}}; D)int x[ ][3]={1,2,3,4};

练习 有下列程序: main() { int x[3][2]={0},i; for(i=0;i<3;i++) scanf(''%d'',x[i]); printf("%3d%3d%3d\n'',x[0][0],x[0][1],x[1][0]); } 若运行时输入:2 4 6<CR>,则输出结果为( )。 A)2 0 0 B)2 0 4 C)2 4 0 D)2 4 6

6.2.5 二维数组的应用举例 例: 将一个二维数组行和列元素互换,存到另一 个二维数组中。 分析 1、定义变量: 6.2.5 二维数组的应用举例 例: 将一个二维数组行和列元素互换,存到另一 个二维数组中。 分析 1、定义变量: int a[2][3]={1,2,3,4,5,6},b[3][2],i,j; 2、执行: b数组的内容转置赋值给array,即b [j][i]=a[i][j] 3、输出b C语言程序设计——算法的描述 SCS-SWPU

如何实现矩阵加法计算 6.2.5 二维数组的应用举例 main( ) { int a[2][3]={{1,2,3},{4,5,6}}; 6.2.5 二维数组的应用举例 main( ) { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d" ,b[i] [j]); printf("\n"); } printf("array a:\n"); for (i=0;i<=1;i++) { for (j=0;j<=2;j++) printf("%5d",a[i][j]); b[j] [i]=a[i] [j]; } printf("\n"); printf("array b:\n"); 如何实现矩阵加法计算 C语言程序设计——算法的描述 SCS-SWPU

第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU

6.3 字符数组与字符串 字符数组 字符串及字符串数组 字符数组的输入输出 字符串处理函数 1 2 3 4 6.3 字符数组与字符串 字符数组 1 字符串及字符串数组 2 字符数组的输入输出 3 字符串处理函数 4 C语言程序设计——算法的描述 SCS-SWPU

6.3.1 字符数组 字符数组是每个元素存放一个字符型数据的数组。 字符数组的定义和元素的引用方法与一般数组相同。 1、字符数组的定义 6.3.1 字符数组 字符数组是每个元素存放一个字符型数据的数组。 字符数组的定义和元素的引用方法与一般数组相同。 1、字符数组的定义 例如: char a[5]; char b[3][5]; 2、字符数组的引用及初始化 例如: char a=‘c’; char a[5]= {‘c’, ’h’,’i’,’n’,’a’} char b[3][5]={ {‘I’,’\’’,’m’},{‘ ’,‘a’,’ ’}, {‘b’,’o’,y’} } C语言程序设计——算法的描述 SCS-SWPU

6.3.1 字符数组 ‘I’ ‘’’ ‘m’ 0 0 ‘ ‘ ‘a’ ‘ ‘ 0 0 ‘b’ ‘o’ ‘y’ 0 0 6.3.1 字符数组 初始化列表中的字符个数 > 数组长度,编译出错! 初始化列表中的字符个数 < 数组长度,自动补空字符 ’\0’ 如: char a[5]={‘t’,’h’,’e’}; ‘I’ ‘’’ ‘m’ 0 0 ‘ ‘ ‘a’ ‘ ‘ 0 0 ‘b’ ‘o’ ‘y’ 0 0 t h e \0 char b[3][5]={ {‘I’,’\’’,’m’},{‘ ’,‘a’,’ ’}, {‘b’,’o’,y’} } char a[5]={‘c’,’h’,’i’,’n’,’a’,’!’}; C语言程序设计——算法的描述 SCS-SWPU

6.3.2 字符串数组 利用字符串初始化字符数组 例如: 6.3.2 字符串数组 利用字符串初始化字符数组 一个字符串能够在定义字符数组时作为初始化数据被存入到数组中,但不能通过赋值表达式直接赋值。 例如: char word[20] = “Dictionary” char name[ ] = “Tommy” char c[10] = {‘s’,’t’,’r’,’i’,’n’,’g’,’\0’}; 最后一个字符’\0’必须有,为字符串结束标志。 但是: char mark[10]; mark=''C program''; /*赋值不合法*/ C语言程序设计——算法的描述 SCS-SWPU

6.3.2 字符串数组 H E L O H E L O \0 区分字符数组和字符串数组 6.3.2 字符串数组 区分字符数组和字符串数组 char rat[5]={‘H’,‘E’,‘L’,‘L’,‘O’}; H E L O rat中存放的是单个字符,不是字符串!! 因为是以单个字符形式为数组各元素赋初值, 产生的数组没有结束符‘\0’ char rat[6]={‘H’, ‘E’, ‘L’, ‘L’,‘O’, ‘\0’}; H E L O \0 rat中存放的是字符串!! 等价于char rat[]=“hello”; C语言程序设计——算法的描述 SCS-SWPU

6.3.2 字符串数组 二维字符数组 对于一个二维数组,C编译程序将其视为一个一维数组,这个一维数组中每个元素又是一个一维数组。这一概念对字符型数组仍适用。 char ch [3][4]={{‘a’,’a’},{‘b’,’b’,’b’},{‘c’} }; char ch [3][4]={″aa″,″bbb″,″c″ }; a \0 b c C语言程序设计——算法的描述 SCS-SWPU

6.3.3 字符数组的输入与输出 1、字符数组: 用%c格式单独输入输出 例: main() { int i; char str[10]; 6.3.3 字符数组的输入与输出 1、字符数组: 用%c格式单独输入输出 例: main() { int i; char str[10]; for(i=0;i<10;i++) scanf(“%c”,&str[i]); printf(“%c”,str[i]); } C语言程序设计——算法的描述 SCS-SWPU

6.3.3 字符数组的输入与输出 2、字符串:用%s将字符串整体输入输出 例: main() { int i; char str[10]; 6.3.3 字符数组的输入与输出 2、字符串:用%s将字符串整体输入输出 例: main() { int i; char str[10]; scanf(“%s”,str); printf(“%s”,str); } 注意: 输入的字符串中不能有空格、回车或跳格符(Tab),因为系统遇到这些分隔符时,会认为输入结束。 若输入:hello world!则实际存入str的只有"hello " C语言程序设计——算法的描述 SCS-SWPU

6.3.3 字符数组的输入与输出 3、字符串:调用函数puts()和gets() gets( )函数——专门用于输入字符串 6.3.3 字符数组的输入与输出 3、字符串:调用函数puts()和gets() 只能使用数组名 gets( )函数——专门用于输入字符串 一般形式是: gets(字符数组名); puts()函数——专门用于输出字符串 字符常量或变量名 一般形式是: puts(字符串); char a[10]; gets(a); char a[10]=“hello”; puts(a); char a[10]; gets(“hello”) puts(“hello”); 与printf()的不同: puts()函数打印字符串的全部内容,直至遇到'\0'为止,然后自动多打印一个'\n',起到换行的作用。而printf函数无此功能。 注意:用puts和gets函数只能输入或输出一个字符串,不能写成 : puts(str1,str2) 或 gets(str1,str2) C语言程序设计——算法的描述 SCS-SWPU

6.3.3 字符数组的输入与输出 scanf(“%s”,str); printf(“%s”,str); 小结: 6.3.3 字符数组的输入与输出 小结: 1、与一般数组操作方法相同,例如: char str[20]; for( i = 0;i <20;i++) scanf(“%c”,&str[i]); for(i = 0;i <20;i++) printf(“%c”,str[i]); 2、%s整体访问字符数组 scanf(“%s”,str); printf(“%s”,str); 3、使用库函数gets()和puts() 可以输入全部字符,以回车结束,且默认换行 注意!! 任意键盘输入做为字符输入! C语言程序设计——算法的描述 SCS-SWPU

6.3.3 字符数组的输入与输出 char a[10]; scanf(“%s”,a) printf(“%s”,a) 若输入:hello! 6.3.3 字符数组的输入与输出 char a[10]; scanf(“%s”,a) printf(“%s”,a) 若输入:hello! 输出? 若输入:hello word! 输出? hello! hello! char a[10]=“hello word!” printf(“%s”,a); 输出? char a[20]=“hello word!” printf(“%s”,a); 输出? hello word! char a[10]=“hello”,b[10]=“word”; printf(“%s%s”,a,b); 输出? helloword char a[10]=“hello”,b[10]=“word”; puts(a); puts(b); 输出? hello word C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 这些函数的原型存放在string.h文件中 strlen( )函数 ——测试字符串的长度 6.3.4 字符串处理函数 strlen( )函数 ——测试字符串的长度 strcat( )函数——字符串连结 strcmp( )函数——字符串比较 strcpy( )函数——字符串的拷贝 strlwr()函数——将字符串中的大写字母转换成小写字母 strupr()函数——将字符串中的小写字母转换成大写字母 这些函数的原型存放在string.h文件中 C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 strcat()函数 功能:用于连结两个字符串。 一般形式: strcat(字符串1,字符串2); 6.3.4 字符串处理函数 strcat()函数 功能:用于连结两个字符串。 一般形式: strcat(字符串1,字符串2); 将字符串2连结到字符串1的后面 其中:参数1必须是字符数组名,而参数2可以是字符串常量或数组名。 注意: (1) strcat函数不检查字符串1的空白位置是否装得下字符串2。连结前应用strlen函数进行检验,确保不发生溢出。 (2) 长度加1,为新字符串的结束符‘\0’留一个位置。 C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 结果: hello word! 例如: #include <stdio.h> 6.3.4 字符串处理函数 例如: #include <stdio.h> #include <string.h> void main( ) { char a[20]="hello",b[10]=" word!"; strcat(a,b); puts(a); } 结果: hello word! C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 strcpy()函数 功能:用于实现两个字符串的拷贝。 一般形式: strcpy(字符串1,字符串2) 6.3.4 字符串处理函数 strcpy()函数 功能:用于实现两个字符串的拷贝。 一般形式: strcpy(字符串1,字符串2) 将字符串2拷贝到字符串1中 其中:字符串1必须是字符数组名,不能是字符串常量。 注意: 1、由于字符串是数组类型,所以两个字符串复制不能通过赋值运算进行。 如: t=s;——错误的字符串复制*/ strcpy(t,s);——正确的字符串复制 C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 输出: s=ab ab!perfect! 例: #include<stdio.h> 6.3.4 字符串处理函数 例: #include<stdio.h> #include<string.h> #define SIZE 80 void main() { char s[SIZE]="Chinese"; char m[SIZE]="ab"; char t[ ]="ab"; strcpy(s,m); printf("s=%s\n",s); strcpy(s,t); strcat(s, "!perfect!"); puts(s); } 输出: s=ab ab!perfect! C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 strlen()函数 功能:测试字符串的长度。 一般形式是: length=strlen(字符串) 其中: 6.3.4 字符串处理函数 strlen()函数 功能:测试字符串的长度。 一般形式是: length=strlen(字符串) 其中: 函数参数可以是字符串常量,或者字符数组名。 整型变量length用于保存函数的返回值。 字符串的长度是包围在双引号内的有效字符数,不包括双引号和‘\0’。 如: char t[ ]="\0"; printf("%d,%d\n",strlen(t),sizeof(t)); 0, 2 C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 strcmp()函数 其中: 比较结果的规定: 功能:比较两个字符串的大小。 6.3.4 字符串处理函数 strcmp()函数 功能:比较两个字符串的大小。 一般形式: i=strcmp(字符串1,字符串2); 比较方法:从左至右逐个比较其ASCII码值大小 其中: (1)字符串1、字符串2均可为字符串常量或数组名. (2) i 是用于存放比较结果的整型变量。 比较结果的规定: ①字符串1<字符串2,函数返回一个负值。 ②字符串1=字符串2,函数返回零。 ③字符串1>字符串2,函数返回一个正值。 C语言程序设计——算法的描述 SCS-SWPU

√ × 6.3.4 字符串处理函数 如:if(“ABC”>“DEF”) if( strcmp("ABC " ,"DEF") ) 6.3.4 字符串处理函数 长度不相同的两个字符串比较: strcmp函数比较到其中一个字符串遇到结束符'\0'为止。 注意:不能用关系运算进行大小比较。 如:if(“ABC”>“DEF”) × 正确的做法是用strcmp函数进行比较。 √ if( strcmp("ABC " ,"DEF") ) C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 strlwr(字符串) 功能: 将字符串中的大写字母转换为小写字母 strupr(字符串) 6.3.4 字符串处理函数 strlwr(字符串) 功能: 将字符串中的大写字母转换为小写字母 strupr(字符串) 功能:将字符串中的小写字母转换为大写字母 如: char str[12]="Hello Word!"; puts( strlwr(str) ); puts( strupr(str) ); C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 1.输入字符串 2.逆置字符串内容 使用什么方法可以实现逆置? 3.输出字符串 6.3.4 字符串处理函数 输入一串字符s,把s所指字符串中的内容逆置。例 如:字符串中原有的字符串为:abcdefg,则执行后, 串s中的内容为:gfedcba。 算法分析: 1.输入字符串 2.逆置字符串内容 使用什么方法可以实现逆置? 3.输出字符串 C语言程序设计——算法的描述 SCS-SWPU

#include <stdio. h> #include <string #include <stdio.h> #include <string.h> void main() { char a[100]; printf("请输入一串字符"); gets(a); int n=strlen(a); char temp; for(int i=0;i<n/2;i++) temp=a[i]; a[i]=a[n-i-1]; a[n-i-1]=temp; } printf("%s",a); C语言程序设计——算法的描述 SCS-SWPU

6.3.4 字符串处理函数 例题:从键盘输入三个字符串,找出其中最大的字 符串 #include<stdio.h> 6.3.4 字符串处理函数 例题:从键盘输入三个字符串,找出其中最大的字 符串 #include<stdio.h> #include<string.h> void main ( ) { char maxstring[20]; char str[3][20]; int i; for (i=0;i<3;i++) gets (str[i]); strcpy(maxstring,str[0]); for(i=1;i<3;i++) if(strcmp(str[i],maxstring)>0) strcpy(maxstring,str[i]); printf("the lagest string is:%s\n",maxstring); } C语言程序设计——算法的描述 SCS-SWPU

Thank You !