第6章 数 组 本章要点: 数组的定义、初始化、数组元素的引用 字符数组的输入输出 字符串处理函数 数组的应用 学习方法建议:

Slides:



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

数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
只怕有心人只怕有心人 世上无难事世上无难事 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作.
电子成绩单项目实现.
C程序设计 第6章 数 组 主讲教师: 鲁 萍 西安建筑科技大学 理学院 任务:键盘输入整数,排序.
二级指针与二维数组.
第6章 数组 公共计算机基础教研部.
一维数组 乾坤以有亲可久; 君子以厚德载物。.
C语言程序设计.
4.3 使用二维数组 P 求两个矩阵的和 求方阵对角线上元素之和 显示算术题和学生答题信息
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
字符串与二维数组.
第九章 字符串.
第5讲 数组 5.1 一维数组 5.2 二维数组 5.3 字符串数组 5.4 综合案例分析.
第六章 数 组 主讲教师 贾月乐 联系电话:
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
C语言高级编程(第四部分) 字符串 北京大学 信息科学技术学院.
Introduction to the C Programming Language
Introduction to the C Programming Language
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
第6章 利用数组处理批量数据.
Introduction to the C Programming Language
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。
走进编程 程序的顺序结构(二).
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第六单元 应用数组的程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
第二章 Java语言基础.
第四章 数组 4.4.1一维数组的定义和初始化 一、一维数组的定义和初始化 1.一维数组定义 定义格式:类型 数组名[常量表达式];
第五章 习题课 电子信息与计算机科学系 曾庆尚.
数组 梁春燕 华电信息管理教研室.
第六章 数组 西安工程大学.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第5讲 数组 5.1 一维数组 5.2 二维数组 5.3 字符串数组 5.4 综合案例分析.
数列.
C语言概述 第一章.
第七章 数组.
顺序表的删除.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第4章 数组 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
C语言大学实用教程 第6章 数组 西南财经大学经济信息工程学院 刘家芬
第六章 数组.
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
请编写如下程序: 输入100名学生的成绩,要求输出高于平均分的成绩。
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第6章 数组.
第4章 Excel电子表格制作软件 4.4 函数(一).
5.4.1 二维数组 (一) 二维数组的定义 1. 二维数组定义的一般形式 类型说明符 数组名[常量表达式][ 常量表达式]
C程序设计.
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
实验七 数 组 第21讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第二章 Java基本语法 讲师:复凡.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
Introduction to the C Programming Language
§4.5 最大公因式的矩阵求法( Ⅱ ).
顺序结构程序设计 ——关于“字符串”和数值.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
台大資訊工程學系 資料系統訓練班 第119期 吳晉賢
C语言基础学习 从外行到入门.
Presentation transcript:

第6章 数 组 本章要点: 数组的定义、初始化、数组元素的引用 字符数组的输入输出 字符串处理函数 数组的应用 学习方法建议: 第6章 数 组 本章要点: 数组的定义、初始化、数组元素的引用 字符数组的输入输出 字符串处理函数 数组的应用 学习方法建议: 学习本章内容时,应重点掌握数组的定义、初始化和数组元素的引用,需要记忆。其中二维数组是难点,对于二维数组应正确理解按行存放的方式。并在此基础上,掌握数组的应用。

6.1 引例 1.问题描述——统计不及格成绩学生 每学期期末,教务处都要统计成绩不及格的同学,以便安排下学期开学参加补考。假设某班有50名同学选修C语言程序设计课程,要求统计该班参加C语言程序设计课程补考的学生名单。 2.引例分析 可采用以下步骤解决上述问题: (1)定义50个浮点型变量; (2)输入成绩保存在50个变量中; (3)分别找出成绩低于60分的学生,并输出他们的学号。

3.程序代码 #include "stdio.h" void main() /*定义50个浮点型变量分别保存每位同学的成绩*/ { float score1,score2,……,score50,average; scanf("%f",&score1); /*从键盘输入成绩*/ scanf("%f",&score2); …… scanf("%f",&score50); printf("pass-fail numbers:\n"); if(score1< 60) /*输出成绩不及格学生的学号*/ printf("1"); if(score2<60) printf("2"); if(score50<60) printf("50"); }

6.2 一维数组 6.2.1 一维数组的定义 可以定义一维数组保存引例中所有学生的成绩,语句如下: float score [50]; 6.2 一维数组 6.2.1 一维数组的定义 可以定义一维数组保存引例中所有学生的成绩,语句如下: float score [50]; 这是一个数组名为score的一维数组,有50个float型的数组元素,分别记作score[0]、score[1]、……score[49](其中0、1、2、……、49称为数组元素的下标),相当于50个float型的变量,分别用来保存50位同学的成绩,如图所示。 score[0] score[1] score[2] score[3] score[4] score[5] …… score[49]

一维数组定义形式如下: 数据类型 数组名1[常量表达式1][, 数组名2[常量表达式2]……]; 例如:int a[5],b[4]; 说明: (1)数据类型:是指数组元素的数据类型。 (2)数组名:与变量名一样,必须遵循标识符命名规则。 (3)常量表达式:必须用方括号括起来,指的是数组的元素个数,C语言中不允许动态定义数组,即数组的大小不能依赖于程序运行过程中变量的值。例如,下面是不合法的: int n; scanf("%d",&n); int a[n]; (4)数组元素的下标:C语言规定第一个元素的下标为0,第二个元素的下标为1,依次类推。 (5)数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。

6.2.2 一维数组中元素的引用 一维数组的元素由数组名和下标来确定,引用形式如下: 数组名[下标表达式] 说明: 6.2.2 一维数组中元素的引用 一维数组的元素由数组名和下标来确定,引用形式如下: 数组名[下标表达式] 说明: (1)“下标表达式”可以是任何非负整型常量或整型表达式,取值范围是0~(元素个数-1)。例如: int a[5],x=3,y=1; 则a[0]、a[x]、a[x+y]都是a数组中元素的合法引用形式,0、x、x+y是下标表达式。 (2)一个数组元素,实质上就是一个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。 (3)在运行C程序过程中,系统并不自动检测数组元素的下标是否越界。因此,在编写程序时,要保证数组下标不越界使用。 (4)程序中常用循环来控制下标的变化。

6.2.3 一维数组元素的初始化 一维数组初始化格式为: 数据类型 数组名[常量表达式]={初值表}; (1)在定义时对数组元素赋初值。 6.2.3 一维数组元素的初始化 一维数组初始化格式为: 数据类型 数组名[常量表达式]={初值表}; (1)在定义时对数组元素赋初值。 例如:int a[5]={1,2,3,4,5}; (2)“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。例如:int a[5]={1,2,3}; (3)如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。 int a[5]={1,2,3,4,5};可以写成: int a[ ]={1,2,3,4,5}; (4)如果想使一个数组中全部元素值为0,可以写成: int a[5]={0,0,0,0,0}; 或写成:int a[5]={0};

6.2.4 一维数组的应用 【例6.1】 使用一维数组编写引例。 #include "stdio.h" #define NUM 50 6.2.4 一维数组的应用 【例6.1】 使用一维数组编写引例。 #include "stdio.h" #define NUM 50 main() { float score[NUM]; int i; printf("\nEnter %d students\'scores\n",NUM); for(i=0;i< NUM;i++) /*输入50位同学的成绩*/ scanf("%f",&score[i]); printf("failed numbers:"); for(i=0;i< NUM;i++) /*输出成绩不及格学生的学号*/ if(score[i]< 60) printf("%d ", i+1); }

【例6.2】 建立一个数组,数组元素a[0]到a[9]的值为0~9,然后按逆序输出。 #include "stdio.h" main() { int i,a[10]; for(i=0;i<=9;i++) a[i]=i; /*给数组元素赋值*/ for(i=9;i>=0;i--) printf("%d ",a[i]); /*逆序输出数组元素的值*/ }

【例6.3】 输入10个整数,找出其中最大数和最小数,指明位置。 #include "stdio.h" main() { int a[10],i,max,min,ix,in; /*ix和in为最大数和最小数的序号*/ printf("input array a:"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=min=a[0]; for(i=1;i<10;i++) { if(a[i]>max)max=a[i],ix=i; /*保留序号*/ if(a[i]<min)min=a[i],in=i; } printf("max=%d\tix=%d\nmin=%d\tin=%d\n ", max,ix+1,min,in+1); }

【例6.4】 从键盘上输入10个整数,求其中正数之和、负数之和。 #include "stdio.h" main() { int b[10],s1=0,s2=0,j; printf("input 10 numbers: "); for(j=0;j<10;j++) /*用循环从键盘上输入10个整数*/ scanf("%d",&b[j]); for(j=0;j<10;j++) /*求其中正数之和、负数之和*/ if(b[j]>0) s1=s1+b[j]; else if(b[j]<0) s2=s2+b[j]; printf("s1=%d,s2=%d\n",s1,s2); }

【例6.5】 求Fibonacci数列的前20个数。该数列第1项、第2项均为1,从第3项开始,每个数等于前2个数之和。 #include "stdio.h" main( ) { int n,f[20]={1,1}; /*定义数组,初始化f[0]=f[1]=1 */ for(n=2;n<20;n++) f[n]=f[n-2]+f[n-1]; for(n=0;n<20;n++) { if(n%5==0) printf("\n"); /*每行输出5个数据*/ printf("%10d",f[n]); }

【例6.6】 从键盘上任意输入10个整数,要求按从小到大显示出来。 #include "stdio.h" main() { int a[10]; int i,j,temp; /*定义循环变量和临时变量*/ clrscr(); /*库函数clrscr():清屏*/ printf("Please input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d", &a[i]); /* 为数组输入元素*/ for(i=0;i<9;i++) /*冒泡法排序。外循环:控制比较趟数*/ for(j=9;j>i; j--) /*内循环:进行每趟比较*/ if(a[j]<a[j-1]) /*如果a[j]小于a[j-1],交换两数*/ { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } printf("\nthe result of sort:\n");/*输出排序后的数据*/ printf("%d ",a[i]);

6.3 二维数组 二维数组可以看成是由多个一维数组组成的,即数组的每一行或每一列都可以看作是一个一维数组,如图6-2所示。

6.3.1 二维数组的定义 二维数组定义的一般格式为: 6.3.1 二维数组的定义 二维数组定义的一般格式为: 数据类型 数组名1[常量表达式1][常量表达式2][,数组名2[常量表达式1][常量表达式2]]; 例如:int b[3][4]; 该定义语句表示: (1)定义了一个名为b的二维数组,数组中每个元素的类型均为整型。 (2)数组b中共包含了3*4个数组元素,其行列下标均从0开始。 (3)数组b的逻辑结构好似一个3行4列的表格,但是在物理结构上,与一维数组一样,在内存中占据连续的一片存储单元,各数组元素按行依次存放,每行的4个元素再按列号次序排列。 (4)在C语言中,可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组。

例如:a[2][3] 引用a数组中第2行第3列元素。 说明:   6.3.2 二维数组元素的引用 二维数组元素引用的格式为: 数组名[下标][下标] 例如:a[2][3] 引用a数组中第2行第3列元素。 说明: (1)“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。如有定义:int a[4][5],x=3,y=1;则a[0][3]、a[x][y]、a[x-1][y+1]都是正确的引用,而a[0,3]、a[x,y]、a[x-2,y+1]是不正确的引用。 (2)“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。上面定义的二维数组的行下标范围为0~3,列下标范围为0~4。则a[4][5]是不正确的引用,因为其行列下标已超限。 (3)对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。 (4)二维数组同一维数组一样,不能整体引用,必须引用到数组中的元素。 (5)通常引用二维数组需要用到两层循环嵌套,外层循环控制行号,内层循环控制列号。

6.3.3 二维数组的初始化 二维数组的初始化是指在定义二维数组的同时对其赋初值,可以用下面方法: (1)分行给二维数组所有元素赋初值 6.3.3 二维数组的初始化 二维数组的初始化是指在定义二维数组的同时对其赋初值,可以用下面方法: (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}; (3)可以对部分元素赋初值 int a[3][4]={{1},{2},{3}}; int a[3][4]={{1},{5,6}}; int a[3][4]={{1},{ },{9}}; (4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面等价: int a[][4]={ 1,2,3,4,5,6,7,8,9,10,11,12};

6.3.4 二维数组应用 【例6.7】 已知一个3×4矩阵,要求编写程序求出矩阵中所有元素中的最大值,并找出其所在的位置。   6.3.4 二维数组应用 【例6.7】 已知一个3×4矩阵,要求编写程序求出矩阵中所有元素中的最大值,并找出其所在的位置。 #include "stdio.h" main( ) { int i,j,r,c,max ; /*r为行号、c为列号*/ int a[3][4]={1,-5,3,4,5,6,7,8,9,10,11,12} ; max=a[0][0] ; for(i=0;i<3;i++) for(j=0;j<4;j++) if(a[i][j]>max) { max=a[i][j] ;r=i+1 ; c=j+1 ;} /*若矩阵下标是从1开始计数*/ printf("max=%d,r=%d,c=%d\n ",max,r,c); }

【例6.8】 某班有2名学生,每名学生考3门课程,求每个学生的平均成绩并输出。 #define M 2 #define N 3 #include "stdio.h" main( ) { int i,j ; float s[M][N],aver[M],sum ; for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%f",&s[i][j]) ; /*由键盘输入2名学生各3门课的成绩*/ { sum=0.0 ; sum+=s[i][j] ; aver[i]=sum/N ;} printf ("%.1f\n",aver[i]) ; }

3 2 7 11 1 9 12 5 6 10 【例6.9】 编写程序,将表6-1中的数据读入数组,求各行、各列元素之和及所有元素之和。 【例6.9】 编写程序,将表6-1中的数据读入数组,求各行、各列元素之和及所有元素之和。 #include "stdio.h" main() { int k,i,j,sh=0,sl=0; int a[4][5]={{3,2,7,11},{1,9,2,12},{5,6,1,10}};/*为部分元素赋初值*/ for(i=0;i<3;i++) { sh=0; /*行累加器清0*/ for(j=0;j<4;j++) sh+=a[i][j]; a[i][4]=sh; /*行累加的结果送入第4列*/ } for(j=0;j<5;j++) { sl=0; /*列累加器清0*/ sl+=a[i][j]; a[3][j]=sl; /*列累加的结果送入第3行*/ k=0; for(i=0;i<4;i++) { printf(" %-2d",a[i][j]); /*为使输出的数据对齐采取的格式输出*/ k=k+1; if(k%5==0) /*每行输出5个数据*/ printf("\n");} } 3 2 7 11 1 9 12 5 6 10

【例6.10】 按要求打印杨辉三角形。 #define N 10 #include "stdio.h" main() { int a[N][N],i,j,k; /*定义一个用于存放数据的二维数组*/ /*将数字1写入数组的第0列、行列相等的元素中*/ for(i=0;i<N;i++) a[i][0]=a[i][i]=1; for(i=2;i<N;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; { for(j=0;j<i+1;j++) printf("%6d",a[i][j]); printf("\n"); } }

【例6.11】 将一个二维数组的行和列互换,存放到另一个二维数组中。 #include "stdio.h" main() { int i,j,a[2][3],b[3][2]; printf("Please input array a:\n"); for(i=0;i<2;i++) for(j=0;j<3;j++) { scanf("%d",&a[i][j]); /*输入a数组的元素*/ b[j][i]=a[i][j]; /*将a数组转置为b数组*/ } printf("output array b:\n"); for(i=0;i<3;i++) { for(j=0;j<2;j++) printf("%5d",b[i][j]); /*输出b数组*/ printf("\n"); }

6.4 字符数组与字符串 6.4.1 字符数组的定义和初始化 1.字符数组的定义 一维字符数组定义的一般格式如下: 6.4 字符数组与字符串 6.4.1 字符数组的定义和初始化 1.字符数组的定义 一维字符数组定义的一般格式如下: char 数组名[常量表达式]; 二维字符数组定义的一般格式如下: char 数组名[常量表达式1][常量表达式2]; 2.字符数组的初始化 字符数组的初始化可采用以下两种方式: (1)可以在定义数组的同时对数组中的各个元素赋初值。 例如:char c[5]={'h','e','l','l','o'} ; (2)可以在定义数组同时将字符串赋给一个一维字符型数组。 例如: char c[6]={"hello"}

6.4.2 字符数组的输入输出 字符数组的输入输出可以有两种方法: (1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。 6.4.2 字符数组的输入输出 字符数组的输入输出可以有两种方法: (1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。 (2)将整个字符串一次输入或输出。用“%s”格式符输出字符串。 说明: 输出字符不包括结束符'\0'。 用“%s”格式符输出字符串时,printf()函数中的输出项是字符数组名,写成下面这样是不对的:printf("%s",c[0]); 如果数组长度大于字符串实际长度,也只输出到遇'\0'结束。例如:  char c[10]={"China"}; printf("%s",c); 只输出“China”5个字符。 如果一个字符数组中包含一个以上‘\0’,则遇第一个‘\0’时就结束。

【例6.12】 输出字符串"welcome"和字符'o'。 #include "stdio.h" main( ) { int i; char str[ ]={ 'w','e','l','c','o','m','e' }; for(i=0;i<7;i++) printf("%c",str[i]); printf("\n%c",str[4]); }

6.4.3 字符串处理函数 1. 字符串输入、输出函数 (1)输入一个字符串函数gets( ) 6.4.3 字符串处理函数 1. 字符串输入、输出函数 (1)输入一个字符串函数gets( ) gets( )函数一般调用格式为: gets(str) ; 【例6.13】 输入一段英文,统计其中单词的个数。 #include"stdio.h" main() { char s[100]; int i,j,n=0; printf("Please input the sentence:"); gets(s); for(i=0;;i++) { if(s[i]==' ')n++; if(s[i]=='\0') { n++;break;} } printf("\nthis sentence has %d word!",n);

(2)输出一个字符串函数puts( ) puts( )函数的一般调用格式为:puts(str) ; 【例6.14】 由终端键盘输入一字符串,要求从该串中删去指定的字符。 #include "stdio.h" main( ) { char str1[50],str2[50] ; char ch ; int i=0,k=0 ; printf("Please input a string:") ; gets(str1) ; printf(" \n delete?") ; scanf("%c",&ch) ; /*输入要删除的字符*/ for(i=0;str1[i]!='\0';i++) { if(str1[i]!=ch) str2[i-k]=str1[i] ; /*将不删除的字符存入str2数组*/ else k=k+1 ;} str2[i-k]='\0' ; puts (str2) ; }

2.字符串处理函数 (1)字符串复制函数strcpy( ) 调用格式为: strcpy(str1,str2); 【例6.15】 从终端键盘输入一字符串,并复制到另一字符数组后显示出来。 方法一:采用循环完成 #include "stdio.h" main( ) { char str1[30],str2[30] ; int i ; printf("Please input a string:") ; scanf("%s",str1) ; printf("str1:%s",str1) ; i=0 ; while(str1[i]!='\0') { str2[i]=str1[i] ; i++ ; } str2[i]='\0' ; printf(" \nstr2:%s",str2) ; }

方法二:采用strcpy( )函数完成 #include "string.h" #include "stdio.h" main() { char str1[30],str2[30]; int i ; printf("Please input a string:") ; scanf("%s",str1) ; printf("str1:%s\n" , str1) ; strcpy(str2,str1); printf("str2:%s\n" , str1) ; }

(2)字符串连接函数strcat( ) 调用格式为: strcat(str1 , str2); 【例6.16】 用strcat()函数将字符串 China、 Beijing和OK!连接起来。 #include "stdio.h" #include "string.h" main() { char s1[]="China ",s2[]="beijing ",s3[]="OK!"; strcat(s1,s2); /*此时s1中的内容为China Beijing */ strcat(s1,s3); /*此时s1为China Beijing OK!*/ puts(s1); }

(3)字符串比较函数strcmp( ) 调用格式为:strcmp(str1,str2) ; str1与str2相等时,函数值为0。 str1>str2时,函数值大于0。 str1<str2时,函数值小于0。 【例6.17】 由键盘输入任意字符串按回车键后显示出来,直到输入字符串“quit”并按回车后结束程序。 #include "string.h" #include "stdio.h" main() { char st[100]; for(;;) { gets(st); /*输入字符串*/ if(!strcmp(st,"quit"))break; puts(st); /*输出字符串*/ }

(4)求字符串长度函数strlen()(len是length的缩写) #include "string.h" #define S1 "This is a book" /*宏定义字符串S1*/ #include "stdio.h" main() { char s2[ ]="computer"; printf("S1=%s\tlen1=%d",S1,strlen(S1)); printf("\ns2=%s\t\t len2=%d",s2,strlen(s2)); }

【例6.19】 从键盘输入两个字符串,并对这两个串进行连接,要求输出原来的两个串和连接后串以及它们的长度。  6.4.4 字符数组应用举例 【例6.19】 从键盘输入两个字符串,并对这两个串进行连接,要求输出原来的两个串和连接后串以及它们的长度。 #include "stdio.h" #include "string.h" main() { char str1[30],str2[10],str3[30]; /*定义数组存放2个源串,1个目的串*/ printf("请输入第一个串:"); /*输入第一个源串*/ gets(str1); printf("请输入第二个串:"); /*输入第二个源串*/ gets(str2); strcpy(str3,str1); /*串拷贝*/ strcat(str1,str2); /*串连接*/ puts(str3);printf("长度为:%d\n",strlen(str3)); /*输出三个串及串长度*/ puts(str2);printf("长度为:%d\n",strlen(str2)); puts(str1);printf("长度为:%d\n",strlen(str1)); }

【例6.20】 判断一个字符串是不是回文。 #include "stdio.h" #include "string.h" main( ) { char str[10]; int i,j; /*定义变量i和j作为数组元素下标,分别从前后引用数组中的元素*/ printf("请输入字符串:"); gets(str); i=0; j=strlen(str)-1; while(i<j) { if(str[i]!=str[j]) break; i++; j--; } if(i>=j) printf("该字符串是回文\n"); else printf("该字符串不是回文\n"); }

上机实验

一、实验目的 1.掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2.掌握字符数组和字符串函数的使用; 3.掌握与数组有关的常用算法。

 二、实验内容 1.验证性实验 1)分析并运行下面程序,记录输出结果,考虑为什么? #include <stdio.h> main() { char s1[ ]= "morning"; char s2[10]= "morning"; int a1[]={1,2,3,4,5}; int a2[5]={1,2,3,4,5}; printf("%d,%d\n",strlen(s1),sizeof(s1)); printf("%d,%d\n",strlen(s2),sizeof(s2)); printf("%d,%d\n",siezeof(a1),sizeof(a2)); } 回答问题: (1) 数组s1、s2、a1、a2的长度(指数组元素的个数)分别是多少?它们的存储长度分别是多少? (2)字符数组s1、s2中存放的字符序列为字符串,那么s1、s2的串长各是多少?

2)以下程序用以把从键盘上输入的一个字符串存放到字符数组中,再将该字符串反序存放到该数组中,输出该字符串。上机运行该程序。 #include "stdio.h" #include "string.h" main( ) { char str[50],t; int i,j; gets(str); i=0;j=strlen(str)-1; while(i<j) { t=str[i]; str[i]=str[j]; str[j]=t; i++;j--; } puts(str); }

3)某班同学由高到矮排好队后,一名迟到的同学需要入队,要求将该同学按其身高排在合适的位置。阅读并运行该程序。 #include"stdio.h" #define N 8 main() { int height[N+1]; /*定义数组height保存学生身高*/ int i,j,later=0; printf("input the original heights: \n"); for(i=0;i<N;i++) /*从高到低输入学生身高*/ scanf("%d",&height[i]); printf("\ninput the later's height:"); /*输入迟到生身高*/ scanf("%d",&later); for(i=0;i<N;i++) /*寻找插入位置i*/ if(later>height[i]) break; for(j=N;j>i;j--) /*低于迟到生的同学都后移,让出位置i*/ height[j]=height[j-1]; height[i]=later; /*迟到生站入位置i*/ printf("the final heights:\n"); for(i=0;i<N+1;i++) /*输出所有学生的身高*/ printf(" %d", height[i]); }

2.设计性实验 1)有一个3×4的矩阵,求其中的最大元素,请将程序补充完整。 #include"stdio.h" main() { int i,j,max,a[3][4]; printf("Please input a array:\n"); for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",__①__); max=a[0][0]; { if(a[i][j]> __②__) max=a[i][j]; } printf("\nmax= %d ",max); }

2)输入一个n×n 矩阵元素值,求对角线元素值之和。 #define N 5 main() { int i,j,s1=0,s2=0,a[N][N]; for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); for(i=0; __①__;i++) { for(j=0;j<N;j++) { if(i==j)s1+=a[i][j]; if(i+j==__②__)s2+=a[i][j]; printf("%d ",a[i][j]); } printf("\n"); printf("\n%d %d",s1,s2);

3)使二维数组左下三角元素中的值乘以n,请将程序补充完整。 #include <stdio.h> main ( ) { int a[3][3], i, j,n; for ( i =0; i<3; i++ ) for ( j =0; j<3; j++ ) scanf("%d",&a[i][j]); scanf("%d",&n); for(i = 0 ; i < 3 ; i++) for(j = 0 ; j <= __①__; j++) __②__ ; printf("***** The array *****\n"); { for ( j =0; j<3; j++ ) printf( "%4d", a[i][j] ); printf("\n"); }

4)很多同学使用过自动取款机时常输错密码。设计一个程序,判断输入的密码是否正确,若正确,显示“欢迎使用”;否则要求重新输入。允许输入3次,若3次都错,显示“密码错误,您不能使用!”。

5)从键盘输入10个整数,用选择法按由小到大的顺序进行排序,并输出排序结果。 选择排序基本方法:首先在所有元素中选出值最小的元素,把它与第一个位置的元素交换,然后在其他元素中选取值次最小的元素与第二位置的元素交换,以此类推,直到所有元素完成排序。 6)输入三个字符串,找出其中的最大者进行输出。