nullnull教学目标*教学目标了解数组数据结构
熟悉数组定义,初始化和引用数组元素
掌握基本排序
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
能够使用常用的字符处理函数 教学
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
*数组概述
一维数组
多维数组
字符数组与字符串
教学内容null*1、引进数组的意义
以简单的方式定义一组同类型的变量
这组变量在内存中连续存储,所以访问时很容易通过第一个变量找到另外的所有变量
2.引例
例:若我们要求一个班100个学生的平均成绩,然后统计高于平均分的人数。
数组概述null*
1、解决问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
的方法一:按以前简单变量的使用和循环结构相结合,其求平均成绩程序段如下:
aver = 0
For( i = 1 ;i<=100;i++)
{ scanf(“%d”,%mark);
aver = aver + mark
}
aver = aver / 100
但若要统计高于平均分的人数,需要重复输入成绩。因为mark是一个简单变量,存放的是最后一个学生的成绩。
null*重复输入成绩,带来两个问题:
(1)输入数据的工作量成倍增加;
(2)若本次输入的成绩与上次不同,则统计的结果不正确。
2、解决问题的方法之二
定义101个普通变量
问题显而易见:语句太庞大(输入和比较语句)
解决此问题的根本方法,引入数组
null*构造数据类型之一:数组
定义:数组是有序数据的集合
组成数组的数据称为数组的元素
数组的每个元素都属于同一个数据类型
每个数组要用一个统一的标识符标识
null*数组的分类:二维数组: 一个表格或一个平面矩阵一维数组: 一列长表或一个向量多维数组: 多维空间的一个数据列阵三维数组: 三维空间的一个方阵一维数组*定义
引用
初始化
输入和输出
一维数组的应用
一维数组定义
*定义
类型说明符 数组名[常量表达式];
一维
int a[5];
char c[20];
float x[10]; null*注意:数组的大小是固定的(即:不允许对数组的大小进行动态定义),另常量表达式的值表示元素的个数以下行为是不容许的
int n;
scanf(“%d”,&n);
int a[n];必须是常量
(数字或符号常量)符号常量定义数组
#define N 4
int a[N]引用*引用数组必须先定义,后使用。
只能逐个引用数组元素。
引用形式:
数组名[下标];(下标值从0开始)
null*例如,定义数组 int a[3],数组元素为:
a[0] a[1] a[2]
引用数组元素时,下标可以是常量,变量或表达式,但不能超过下标范围
例如:a[2]=1; a[j]=6;a[i+j];(i,j为整型变量)
初始化* 初始化顺序指定全部元素的初始值
int a[5]={1,2,3,4,5};
指定部分元素的初始值
int a[5]={0,0,1};
以上语句只给数组a的前面三个元素赋了初始值,未赋初值的元素的值在此默认为0(默认值根据数组类型不同而不同,数值型的为0);
不能隔一个赋值null*初始化时不指定数组元素的个数
int b[]={1,2,3};
若初值的个数小于数组元素的个数,则初始化时不能省略数组元素的个数,
注意:初值的个数不能大于数组元素的个数。
null*1.#include
void main()
{
int a[4]; // 声明项
printf("a[0]=%d; a[1]=%d; a[2]=%d;
a[3]=%d\n", a[0], a[1], a[2], a[3]);
}
2.其他不变,改变声明项为
int a[4] = { 0, 1, 2, 3 };请看下面的应用那些正确那些错误?null*3.其他不变,改变声明项为
int a[4] = { 3, 8 };
4.其他不变,改变声明项为
int a[4] = { 2, 4, 6, 8, 10 };
5.其他不变,改变声明项为
int a[4] = { 2, 4, 6, d };
6.其他不变,改变声明项为
int n=4;
int a[n] = { 0, 1, 2, 3 };
输入和输出*输入和输出C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的。
数组和循环*数组和循环
for(i = 0; i < n; i++)
printf("%d ", a[i]);
数组下标作为循环变量,通过循环,逐个处理数组元素 null*
printf("please enter the data:\n");
for(i=0;i<10;i++)
scanf("%d",&array[i]);
printf("output the data:\n");
for(i=0;i<10;i++)
printf("%d ",array[i]);
printf("\n"); }
输入输出输入10个数,并将它们输出。 用数组解决前面的引例
----求一个班100个学生的平均成绩,然后统计高于平均分的人数。
*用数组解决前面的引例
----求一个班100个学生的平均成绩,然后统计高于平均分的人数。
null*#include
#define N 100
void main()
{int mark[N], i, n=0;
float aver = 0;
for( i =0;iaver) n=n+ 1;
for( i =0;i
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;
for(i = 0; i < 5; i++)
if(a[i] == x){
printf("Index is %d\n", i);
flag = 1;
break;
}
if(flag == 0) printf("Not Found\n");
return 0;
} 示例2 源程序Enter 5 integers: 2 9 8 1 9
Enter x: 9
Index is 1Enter 5 integers: 2 9 8 1 9
Enter x: 7
Not Found示例3输入一组数 求最小值*#include
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;
}示例3输入一组数 求最小值Enter n: 6
Enter 6 integers: 2 9 -1 8 1 6
min is -1示例3改进 求最小值及其下标*输入n, 再输入n个数, 输出最小值和它所对应的下标。
用index
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
最小值对应的下标示例3改进 求最小值及其下标求最小值及下标*#include
#define N 10
int main(void)
{ int i, index, n,min;
int a[N];
printf("Enter n: ");
scanf("%d", &n);
printf("Enter %d integers: ", n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
min=a[0];
index = 0;
for(i = 1; i < n; i++)
if(a[i] < min) {min=a[i];index = i;}
printf("min is %d\tsub is %d\n", min, index);
return 0;
}求最小值及下标Enter n: 6
Enter 6 integers: 2 9 -1 8 1 6
min is -1 sub is 2 练习: 交换最小值*输入n(n<10), 再输入n个数,将最小值与第一个数交换,输出交换后的n个数。
用index记录最小值对应的下标
a[index]就是最小值
最小值与第一个数交换
a[index] <==> a[0]练习: 交换最小值典型算法:一组数排序*排序的方法很多,主要有:
冒泡法
选择法
比较交换法
希尔法
插入法典型算法:一组数排序冒泡法*冒泡法排序过程: (主要的操作是比较和交换)
第一步:找到最大的数安置在最后一个位置上
具体方法:
比较第一个数与第二个数,若a[0]>a[1],则交换;然后比较第二个数与第三个数,若a[1]>a[2],则交换;依次类推,直至第n-1个数和第n个数比较为止。找到最大的数安置在最后一个位置上,称为第一轮排序。null*第二步:找到次大的数安置在第n-1个元素位置
具体方法:
抛开最后一个最大数,对剩余的前n-1个数进行第一步类似的操作,得到次大数放在第n-1位置,称为第二轮;
依次做第三轮,第四轮……,直到结束
算法的整体思路是让大的数不断地往下沉,小的数不断地往上冒,所以叫“冒泡排序法”
null*在整个冒泡排序算法中需要明确两点:
n个数排序需要几轮?
在第i轮时,需要比较交换多少次?null*int a[5] n
a[0] a[1] a[2] a[3] a[4]
第一轮 21 13 90 32 -1
13 21 90 32 -1 13 21 32 90 -1 13 21 90 32 -1 13 21 32 -1 90null*第二轮 : 13 21 32 -1 90 13 21 32 -1 90 13 21 32 -1 90 13 21 -1 32 90null*在整个冒泡排序算法中需要明确两点:
n个数排序需要几轮?
在第i轮时,需要比较交换多少次?n个数需要n-1轮
第i轮比较交换的次数是n-i次算法流程图*算法流程图变量、数组长度定义 for(j=0;j<10-i;j++) scanf ( "%d" , &a[i] ) for(i=0;i<10;i++) for(i=0;i<10;i++) a[j]>a[j+1]10 a[j]与a[j+1]交换 for(i=1;i<=10-1;i++) printf ( "%6d", a[i] )null*for( i=1; i<=N-1;i++)
{
}
#include
#define N 10
void main()
{
int a[N] , i , j , temp;
printf("请输入10个数:\n");
for( i = 0 ; i < N ; i++)
scanf("%d",&a[i]);
printf("\n");
printf("原始数据为:\n");
for( i = 0 ; i < N ; i++)
printf("%d ",a[i]);
排序过程
printf("\n排序后的数据为:\n");
for(i=0; i a[j+1] )
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
选择法:*选择法:算法
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
:
(1) 从n个数的序列中选出最小的数(递增),与第1个数交换位置;
(2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第 2个数交换位置;
(3)重复(1)n-1遍,最后构成递增序列。int a[5] n
a[0] a[1] a[2] a[3] a[4]
21 13 90 32 -1P 记录最小数的数组元素下标null*int a[5] n
a[0] a[1] a[2] a[3] a[4]
21 13 90 32 -1交换null*原序列
a[0] a[1] a[2] a[3] a[4]
21 13 90 32 -110个数中找第一个最小数下标的参考程序*10个数中找第一个最小数下标的参考程序 p=0;
for(j=1;j<10;j++)
if(a[j]
void main()
{ int i,j,p,c,a[10];
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{ p=i;
for(j=i+1;j<10;j++)
if(a[j]=j
i+j==N-1二维数组的使用:矩阵与二维数组示例1*示例1求两个3*4矩阵的和。参考程序如下:
main( )
{ int a[3][4],b[3][4];c[3][4];
int i,j;
printf("输入a矩阵的元素值\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
null*printf("输入b矩阵的元素值\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&b[i][j]);
for(i=0;i<3;i++)
for(j=0;j<4;j++)
c[i][j]=a[i][j]+b[i][j];
/*矩阵a和b的对应元素相加 */
/* 结果存放在c矩阵中 */null*printf("和矩阵为:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%5d", c[i][j]);
printf("\n");
}
}
null*示例2
将一个2*3矩阵转置null*示例3:求矩阵的最大值 *示例3:求矩阵的最大值 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵(假设最大值唯一)。
row 记录最大值的行下标
Col 最大值的列下标
max 最大值null* 1 2 3 4 9 8 7 10 -10 6 -5 2a234910源程序*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++){
for(j = 0; j < 2; j++)
printf("%4d", a[i][j]);
printf("\n");
}
row = col = 0;max=a[0][0];
for(i = 0; i < 3; i++)
for(j = 0; j < 2; j++)
if(a[i][j] > max){
max=a[i][j]; row = i; col = j;
}
printf("max = a[%d][%d] = %d\n", row, col, max);
return 0;
} 源程序Enter 6 integers:
3 2
10 -9
6 -1
3 2
10 -9
6 -1
max = a[1][0] = 10
*
用字符数组存放字符串
字符数组的定义及初始化
字符串的输入输出
用于字符串处理的函数
应用举例字符数组null*●什么是字符串?
字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符;
无字符串变量,用字符数组处理字符串
字符串结束标志:‘\0’
● C语言中没有字符串变量,字符串不是存放在一个变量中而是存放在一个字符型数组中。因此为了存放字符串,常常在程序中定义字符数组。例如:
char c[10];
null* 定义
char str[20];
初始化
逐个为数组中各元素指定初值字符。
char str[4] ={'w','e','l','l'};
对一个字符数组指定一个字符串初值。
char str[ ]={“Happy"};
char str[ ]=" Happy ";
定义及初始化null*字符数组的大小是双引号中所包括的
字符个数加1。null*char s[80]= "Happy";
字符串遇 '\0' 结束
第一个 '\0' 前面的所有字符和 '\0' 一起构成了字符串 "Happy”
'\0' 之后的其他数组元素与该字符串无关
字符串由有效字符和字符串结束符 '\0' 组成 对字符串的操作*对字符串的操作把字符串放入一维字符数组(存储)
对字符串的操作 ===> 对字符数组的操作
(1)数组元素的个数已知,一般用下标控制循环;
(2)没有显式地给出有效字符的个数,只规定在字符串结束符 '\0' 之前的字符都是字符串的有效字符,一般用结束符 '\0' 来控制循环
循环条件:s[i] != '\0' null*字符数组可以通过数组元素一个一个地进行输入输出,通过数组元素一个一个输入输出时,用格式符“%c”,
也可以对数组整体进行输入输出,而对数组整体输入输出时,用格式符“%s”。输入时将回车作为’\0’存入数组,输出时碰到’\0’结束.
null*字符串的输入和输出
逐个字符I/O: %c
整个字符串I/O: %s/* 用%c */
main()
{ char str[5];
int i;
for(i=0;i<5;i++)
scanf(“%c”, &str[i]);
for(i=0;i<5;i++)
printf(“%c”, str[i]);
}/* 用%s */
main()
{ char str[5];
scanf(“%s”, str);
printf(“%s”, str);
}\0示例null*#include
#define N 10
int main(void)
{ int i;
char a[N]="asdfg";
for(i=6;i<=9;i++)
a[i]=i;
printf("%s",a);
return 0;
}#include
#define N 10
int main(void)
{ int i;
char a[N];
scanf("%s",a);
for(i=0;i<=9;i++)
printf("%d ",a[i]);
return 0;
}输入示例输出示例回车变成’\0’遇到’\0’结束输出null*注意:%s不能完整地读入带空格的字符串。
读入带空格的字符串可以使用读字符串的函数gets(),它读入全部字符(包括空格),直到遇到回车符为止。包含在头文件 stdio.h
例如: char c[13];
gets (c);
键盘输入: How are you?
读入带空格字符串也可以用循环配合%c进行
for(i=0;i<=11;i++)
scanf(“%c”,&c[i]);
思考:写成scanf(“%s”,c); c中的值?碰到第一个空格结束输入
并将空格转化成’\0’存入注意:printf没有这种限制,可以输出任意串null*#include
void main()
{
char str[80];
int alphabet=0,digit=0 ; space=0 , other=0, i=0;
gets ( str ); for ( i = 0 ; str[i] != ‘\0’; i++ )
if (‘A’<= str[i] && str[i] <=‘Z’||‘a’<= str[i] && str[i] <=‘z’)/*判断字母*/
++ alphabet;
else if ( str[i] == ‘ ’ ) ++space;
else if ( str[i] <= ’9’ && str[i] >= ‘0’) ++digit;
else ++other; printf(“有%d个字母,%d个空格,%d个数字,%d个其他字符:\n”, alphabet, space, digit, other);
}
示例2 进制转换*输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。
示例2 进制转换进制转换 *进制转换 #include
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;
} Enter a string: 123
digit = 123字符串输入:
gets(s);
scanf(“%s”,s);示例3 阅读下列源程序,注意其输入与输出的处理方式。
*示例3 阅读下列源程序,注意其输入与输出的处理方式。
#include
void main()
{ int j;
char a[5][5]; /*二维char型数组*/
for(j=0;j<=4;j++) /*依次输入5行字符串*/
scanf("%s",a[j]);
printf("\n");
for(j=0;j<=4;j++)
{ printf("%s",a[j]); printf("\n"); }
}二维char型数组c[3][10],每行为一个一维char数组,第i+1行一维数组名为c[i]*二维char型数组c[3][10],每行为一个一维char数组,第i+1行一维数组名为c[i]示例4:对任意输入的五行字符串(每行不超过20个字符),比较大小,输出其值最大的字符串。*示例4:对任意输入的五行字符串(每行不超过20个字符),比较大小,输出其值最大的字符串。字符串比大小算法:
顺次比较对应字符,有一组字符不相等则大小确定,
后续字符不再比较;
若所有字符都相等,则字符串相等。
例如:abclk 与 abdk比较,结果: abclk < abdk五个字符找最大*五个字符找最大#include
#define N 6
int main(void)
{ int i;
char a[N],max;
printf("Enter 5 char:");
scanf("%s",a);
max=a[0];
for(i=1;i<=4;i++)
if(a[i]>max)max=a[i];
printf("%c",max);
return 0;
}字符串a[5][20],max[20];for(i=0;i<5;i++)
scanf(“%s”,a[i])将a[0]赋给max[20]如果a[i]串比max[20]串大,将a[i]赋给max[20]%s不能写成
max[20]=a[0]
a[i]>max[20]
串的赋值和串的比较需要函数实现null*功能:将字符串2拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:字符数组1必须足够大
拷贝时‘\0’一同拷贝
不能使用赋值语句为一个字符数组赋值字符串拷贝函数 strcpy(字符数组1,字符数组2)
例如: char str1[12]={“Turbo ”}; char str2[]={“c++”};
printf(“%s”, strcpy(str1,str2));
输出结果: c++null*字符串比较函数 strcmp (字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或‘\0’为止字符串比大小算法:
顺次比较对应字符,有一组字符不相等则大小确定,
后续字符不再比较;
若所有字符都相等,则字符串相等。
例如:abclk 与 abdk比较,结果: abclk < abdknull*strcmp (字符串1,字符串2)
函数返回值:int型整数
a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:字符串比较不能用“==”,必须用strcmp五个字符找最大*五个字符找最大#include
#define N 6
int main(void)
{ int i;
char a[N],max;
printf("Enter 5 char:");
scanf("%s",a);
max=a[0];
for(i=1;i<=4;i++)
if(a[i]>max)max=a[i];
printf("%c",max);
return 0;
}字符串a[5][20],max[20];for(i=0;i<5;i++)
scanf(“%s”,a[i])将a[0]赋给max[20]如果a[i]串比max[20]串大,将a[i]赋给max[20]%sstrcpy(max,a[0]);If(strcmp(a[i],max)>0)strcpy(max,a[i]);不能输入带空格的串,改为gets(a[i])参考程序如下:*参考程序如下:#include
#include
#define N 6
int main(void)
{ int i;
char a[5][20],max[20];
printf("Enter 5 char:");
for(i=0;i<5;i++)
gets(a[i]);
strcpy(max,a[0]);
for(i=1;i<=4;i++)
if(strcmp(a[i],max)>0)strcpy(max,a[i]);
printf("%s",max);
return 0;
}字符串函数全部放在string.h中null*下面两个包含在头文件 stdio.h
字符串输出函数 puts(字符数组名/字符串)
功能:向显示器输出字符串(输出完,换行)
说明:字符数组必须以‘\0’结束字符串输入函数 gets(字符数组名)
功能:从键盘输入一以回车结束的字符串放入字符
数组中 ,并自动加‘\0’
说明:输入串长度应小于字符数组长度其他的字符串处理函数包含在头文件 string.h
null*功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:字符数组1必须足够大
连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,
新串最后加‘\0’ 字符串连接函数 strcat (字符数组1,字符数组2)
例如: char str1[12]={“Turbo ”}; char str2[]={“c++”};
printf(“%s”, strcat(str1,str2));
输出结果: Turbo c++null*字符串长度函数 strlen (字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内字符串处理函数小结* 函数 功能 头文件
puts(str) 输出字符串 stdio.h
gets(str) 输入字符串(回车间隔)
strcpy(s1,s2) s2 ==> s1
strcat(s1,s2) s1 “+” s2 ==> s1
若 s1“==”s2, 函数值为0
strcmp(s1,s2) 若 s1 “>” s2, 函数值 >0 string.h
若 s1 “<” s2, 函数值<0
计算字符串的有效长度,
strlen(str) 不包括 ‘\0’字符串处理函数小结数组小节*数组小节一维数组定义和使用,常用算法排序
类型说明符 数组名[常量表达式];
例 int a[5];
二维数组定义和使用
数据类型 数组名[常量表达式][常量表达式];
例如:int a[2][3];
字符数组的定义和使用,字符串的处理
C语言中没有字符串变量,字符串不是存放在一个变量中而是存放在一个字符型数组中。因此为了存放字符串,常常在程序中定义字符数组。
例如: char c[10]=“hello”;