字符串与二维数组
复习 1.对于接受和显示字符串,使用gets、puts和使用scanf、printf的区别;
复习2 从键盘任意输入5个学生的姓名,编程找出并输出 按字典顺序排在最前面的学生姓名 等价于求最小字符串
如果“键盘输入五个整数找出最小数” 算法: 1.先输入第一个数到min变量中; 2.循环四次,依次输入一个整数放到str变量中,和min比较如果较小就把该变量复制到min里面; 3.输出最小整数min。
#include <stdio.h> Void main() { int n,min, str; printf("Please enter five numbers:\n"); scanf(“%d”,&str); min=str; for (n=1; n<5; n++) if (str<min) } printf("The min is:%d", min );
问题分析:一个学生姓名就是一个字符串,因此应用字符数组来存储,而字典顺序是将字符串按有小到大顺序排列的,因此找出按字典顺序排在最前面的学生姓名实际上就是要找出最小的字符串。 算法如下: step1 从键盘输入一个学生的姓名,并将其先假设为最小字符串,保存在数组min中。 step2 利用循环,依次输入4个学生姓名,每输入一个学生姓名就将其与min比较,若当前学生姓名字符串小于min,则用当前学生姓名字符串更新min。
#include <stdio.h> #include <string.h> #define ARRA_SIZE 80 main() { int n, num; char str[ARRA_SIZE], min[ARRA_SIZE]; printf("Please enter five names:\n"); scanf(“%d”,&str); gets(str); min=str; strcpy(min, str); for (n=1; n<5; n++) if (strcmp(str, min) < 0) } printf("The min is:"); puts(min); if (str<min) { min=str; }
有没有改进之处? 五个被输入进来的名字没有都被保存 如何把这个找最先出现名字的程序改为一个单独的模块----- 函数?在主程序中又如何使用?
本周学习目标 字符数组与二维数组 数组名作为函数参数
二维数组的定义 格式: 数据类型 数组名[常量表达式][常量表达式] int b[2][3]; 格式: 数据类型 数组名[常量表达式][常量表达式] int b[2][3]; b为2×3(2行3列)的数组,注意下标范围 b[0] b[1] ---- b[0][0] b[0][1] b[0][2] b ---- b[1][0] b[1][1] b[1][2]
二维数组 二维数组定义的一般形式: 数据类型名 数组名[常量表达式1][常量表达式2]; 例如: double a[3][3],b[2][2]; int f[2][3]; 同一维数组一样,二维数组(或多维数组)中行、列下标的值也都是从0开始的。 二维数组可以看成是一个特殊的一维数组,只是这个一维数组的每一个元素又是一个一维数组。
二维数组
二维数组的存储结构 int b[2][3]; 存放顺序:按行存放,先顺序存放第一行的元素,再存放第二行的元素 b[0][2] b[0][1]
二维数组 二维数组中各元素的顺序遵照按行存放的原则。例如,定义一个二维数组a[3][3]后,其中的元素a[0][2]在内存中被存放在元素a[1][0]之前。 存储单元 3 4 5 3 a[0][0] a = 6 7 8 对应表: 4 a[0][1] 1 2 9 → 5 a[0][2] 6 a[1][0] 7 a[1][1] 8 a[1][2] 1 a[2][0] 2 a[2][1] 9 a[2][2] a[0][0]与a[0]的区别是什么?
例如int a[2][3]={11,22,33,44,55,66}
二维数组的输入和输出 数组的输入和输出只能逐个对数组元素进行操作(字符数组例外) int b[2][3],i,j; 输出方法: 输入方法: scanf(“%d”,&a[i][j]); 输入整个数组元素: for (i=0;i<2;i++) for(j=0;j<3;j++) 输出方法: 输出第i行第j列元素: printf(“%d”,a[i][j]); 输出整个数组元素: for (i=0;i<2;i++) for(j=0;j<3;j++)
在连续的一片内存空间存放五个键盘输入的名字 Wanglin libing Zhaoxiaohui Zhangtao Chenxiaofeng 目标:练习用二维数组来存放多个字符串
数组名作函数参数 用数组名作参数,就是将数组的首地址传递给函数 实参数组与形参数组占用同一段内存 在函数中对形参数组元素修改的结果,会影响结果主 调函数中的实参数组
数组作为函数的参数 #include <stdio.h> void findMax(int [5]); /* function prototype */ int main() { int nums[5] = {2, 18, 1, 27, 16}; findMax(nums); return 0; } void findMax(int vals[5]) /* find the maximum value */ { int i, max = vals[0]; for (i = 1; i <= 4; ++i) if (max < vals[i]) max = vals[i]; printf("The maximum value is %d.\n", max); return;
数组作为函数的参数 数组名是数组首元素的内存地址。 两个数组名指向内存中的同一组内存单元
数组作为函数的参数 传递数组长度,确定下标下限 #include <stdio.h> int findMax(int [ ], int); /* function prototype */ int main() { int nums[5] = {2, 18, 1, 27, 16}; printf("The maximum value is %d.\n", findMax(nums,5)); return 0; } int findMax(int vals[], int numEls) { int i, max = vals[0]; for (i = 1; i < numEls; ++i) if (max < vals[i]) max = vals[i]; return(max); 数组作为函数的参数 传递数组长度,确定下标下限 注意:C语言不提供数组下标越界的保护,设计时要注意。
数组名作函数参数 传递整个数组到另一个函数内,可以将数组的首地址作为参数传过去 用数组名作为函数参数 只拷贝一个地址自然比拷贝全部数据效率高 由于首地址相同,故实参数组与形参数组占用同一段内存 在该函数内,不仅可以读这个数组的元素,还可以修改它们
题目:编写一函数static,完成功能:分别统计一行字符,其中英文字母、空格、数字和其它字符的个数。在main函数中接受键盘输入的一行字符,调用static函数统计结果并显示。 2.用嵌套的if-else来完成统计。 3.数组名作为函数参数
i=0; while((c=a[i])!='\n') { if(c>='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++; else if(c>='0'&&c<='9') digit++; else others++; i++; }
作业: 完成本题 Page 372 编程2,6题