数组小结
DESCRIPTION
数组小结. (1) 数组是多个同类型变量的集合,通常与循环语句结合使用,用于批量数据处理。 (2) 数组按维数分,可分为一维数组、二维数组和多维数组 ( 三维及以上 ) ,其中二维数组相当于一个多行多列的矩阵;数组按类型分,可分为数值型数组、字符型数组、结构体数组等。 (3) 数组可以在定义时对其赋值,称为数组的初始化。使用时,数组元素通过下标来引用,数组下标从 0 开始。. 用一维数值和二维数值求最值的区别. 【 例 5-6】 输入一个 8 个整数的一维数组,求该数组中最大的元素值以及最大元素所在的下标。. #include void main() - PowerPoint PPT PresentationTRANSCRIPT
数组小结
(1) 数组是多个同类型变量的集合,通常与循环语句结合使用,用于批量数据处理。
(2) 数组按维数分,可分为一维数组、二维数组和多维数组 ( 三维及以上 ) ,其中二维数组相当于一个多行多列的矩阵;数组按类型分,可分为数值型数组、字符型数组、结构体数组等。
(3) 数组可以在定义时对其赋值,称为数组的初始化。使用时,数组元素通过下标来引用,数组下标从 0开始。
用一维数值和二维数值求最值的区别
【例 5-6 】输入一个 8 个整数的一维数组,求该数组中最大的元素值以及最大元素所在的下标。
#include <stdio.h>void main(){
int i,max,r,a[8];//max 、 r 分别存放最大元素值、下标max=-10000000; for(i=0;i<8;i++){
scanf("%d",&a[i]);if(max<a[i]){
max=a[i];r=i;
}}printf(" 最大元素值: %d ,下标: %d\n",max,r);
}
【例 5-6 】输入一个 3×4 的矩阵,按行、列输出该矩阵,并求该矩阵中最大的元素值以及最大元素所在的行、列下标。
void main()
{
int i,j,max,row,col,a[3][4];//max 、 row 和col 分别存放最大元素值、行和列max=-10000000;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{scanf("%d",&a[i][j]);
if(max<a[i][j])
{max=a[i][j];row=i; col=j;}
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)printf("%6d",a[i][j]);
printf("\n");
}
printf(" 最大元素值: %d ,行下标:%d ,列下标: %d\n",max,row,col);
}
【例 5-11 】从键盘输入一个字符串,找出其中 ASCII 码值最大
的字符并输出该字符及其 ASCII 码值。 #include <stdio.h>void main(){
char a[20],max=0;int i=0;scanf("%s", a);while(a[i]) {
if(a[i]>max)max=a[i];
i++;}printf("%c,%d\n",max,max);
}
排序冒泡比较交换排序选择排序
【例 5-13 】从键盘输入一批学生的信息到学生信息管理系统中,然后按总分由高到低进行排序。
编程思路:排序在现实生活中有着广泛的应用,排序的方法很多,其中冒泡排序法是一种比较著名的排序算法。假设按从小到大的顺序排序,冒泡排序法的基本思想如下:
从第一个数开始,依次比较相邻的两个数,将小数放在前面,大数放在后面,第一趟结束时,最大的数被排到了最后;
第二趟,再从第一个数开始,采用相同的方法,一直比较到倒数第二个数为止(倒数第一的位置上已经是最大的了),第二趟结束时,次大的数被排到了倒数第二的位置上;…;
重复以上过程,直至排完为止。该方法之所以称为“冒泡排序”,是因为排序过程中
总是大的数像石头一样“沉底”,小的数像水中气泡一样“上升”,每一趟都将剩余数中最大的一个数沉底。
以 5 3 4 2 1 0 这六个数的排序为例,说明冒泡排序的过程。
3 4 2 1 0 5
第一趟3 5 4 2 1 0
5 3 4 2 1 0
3 4 5 2 1 0
3 4 2 5 1 0
3 4 2 1 5 0
3 4 2 1 0 5
第三趟2 3 1 0 4 5
3 2 1 0 4 5
2 1 3 0 4 5
2 1 0 3 4 5
1 2 0 3 4 5
2 1 0 3 4 5
1 0 2 3 4 5
3 4 2 1 0 5
3 2 4 1 0 5
3 2 1 4 0 5
3 2 1 0 4 5
0 1 2 3 4 5
1 0 2 3 4 5
第四趟 第五趟
第二趟
• 通过以上分析可以看出,如果有 n 个数,最多经过多少趟完成排序?第 i 趟排序中进行两两比较的次数为多少?
• 这样,可以采用二重循环来实现冒泡排序。• 外循环:控制排序的趟数,循环控制变量 i 的取
值范围是 1≤i ≤ n-1 。• 内循环:控制每一趟两两比较的次数,由于数组
的下标从 0 开始,为方便处理,将循环控制变量 j的取值范围设为: 0 ≤ j < n-i 。
#define N 6#include <stdio.h>void main(){ int x[N],i,j,temp;
printf(" 请输入 %d 个数据 :",N);for(i=0;i<N;i++)
scanf("%d",&x[i]);for(i=1;i<=N-1;i++) // 控制趟数
for(j=0;j<N-i;j++) // 控制每一趟的比较次数
if(x[j]>x[j+1]){ temp=x[j];
x[j]=x[j+1]; x[j+1]=temp;
}printf(" 排序结果为 :");for(i=0;i<N;i++)
printf("%d ",x[i]);}
如果需要将数据由大到小进行排序,则上述程序应如何修改?
【例 5-14 】从键盘输入 N 个数,采用比较交换排序法将这 N 个数按从小到大的顺序排序。
编程思路:将第一个数顺序与其后的每个数进行比较,如果某个数比它小,则两者交换。
第一趟结束时,最小的数被排到了第一个位置上;第二趟从第二个数开始,将第二个数顺序与其后的
每个数进行比较,如果某个数比它小,则两者交换,第二趟结束时,次小的数被排到了第二个位置上;…;
重复以上过程,经过 N-1 趟的比较,可将 N 个数排好。
以 5 3 4 2 1 0 这六个数的排序为例,说明比较交换排序的过程
045321
第一趟354210
534210
354210
254310
154320
054321
第三趟014532
015432
013542
012543
012453
012543
012354
054321
035421
025431
015432
012345
012354
第四趟 第五趟
第二趟
#include <stdio.h>#define N 6void main(){ int x[N],i,j,temp;
printf(" 请输入数据 :");for(i=0;i<N;i++)
scanf("%d",&x[i]);for(i=0;i<N-1;i++) // 要选择的趟数
for(j=i+1;j<N;j++) // 控制每一趟的比较次数if(x[i]>x[j]) // 比较、交换{ temp=x[i];
x[i]=x[j]; x[j]=temp;
}printf(" 排序结果为 :");for(i=0;i<N;i++)
printf("%d ",x[i]);}
【例 5-15 】从键盘输入 N 个数,采用选择排序法将这 N 个数按从小到大的顺序排序。
编程思路:首先从要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后从剩下的数当中再选出一个最小的数与第二个位置的数交换;…;如此继续,直至倒数第二个数和最后一个数比较完为止。
下面以 5 3 4 2 1 0 这六个数的排序为例,说明选择排序的过程,如图 5-5 所示。
第一趟排序前 排序后
5 3 4 2 1 0
0 3 4 2 1 5
第二趟排序前 排序后
0 1 4 2 3 5
0 3 4 2 1 5
第三趟排序前 排序后
0 1 2 4 3 5
0 1 4 2 3 5
第四趟排序前 排序后
0 1 2 4 3 5
0 1 2 3 4 5
第五趟排序前 排序后
0 1 2 3 4 5
0 1 2 3 4 5
#define N 6#include <stdio.h>void main(){ int x[N],i,j,min,temp; // 变量 min 用来保存本趟最小数的下标
printf(" 请输入 %d 个数据 :",N);for(i=0;i<N;i++)
scanf("%d",&x[i]);for(i=0;i<N-1;i++) // 要选择的趟数{ min=i; // 先假设 x[i] 是最小数,如果后面有更小的数再调整
for(j=i+1;j<N;j++) // 找出本趟的最小数if(x[min]>x[j]) min=j;// 将最小数的下标保存到 min 中
if(i!=min)// 如果 x[i] 不是最小数,就将最值和当前数交换{ temp=x[i];
x[i]=x[min];x[min]=temp;
}}printf(" 排序结果为 :");for(i=0;i<N;i++)
printf("%d ",x[i]);}
移动
【例 5-6 】输入一个 8 个整数的一维数组,将各数顺序向后移
一位,最后一个数移到最前面,并输出。
#include <stdio.h>void main(){
int i,t,a[8];//max 、 r 分别存放最大元素值、下标for(i=0;i<8;i++)
scanf("%d",&a[i]);t=a[7];for(i=7;i>0;i--)
a[i]=a[i-1];a[0]=t;for(i=0;i<8;i++)
printf("%d ",a[i]);}
顺序向前移一位,最第一个数移到最后?
字符串
9. 从键盘输入字符串,将下标为偶数位置上的字符按顺序复制到另外一个字符数组中并输出。
#include <stdio.h>void main(){ int i=0,j=0;
char s1[80],s2[80];printf(" 请输入 1 个字符串 :");scanf("%s", s1);while(s1[i]!='\0'){ if (i%2==0)
{ s2[j]=s1[i];i++;j++;
}else
i++;}s2[j]='\0'; // 添加字符串结束标志printf("%s\n",s2);
}
9. 从键盘输入字符串及任一字符,查找该字符在字符串中第一次出现的位置。#include <stdio.h>#include <string.h>void main(){
char a[20],c;int i=0;scanf("%c",&c);scanf("%s",a);while(a[i]!='\0') { if(a[i]==c)
{printf("%d\n",i+1);break;
}i++;
}if(a[i]=='\0')
printf(" 没找到! \n"); }
9. 从键盘输入两个字符串,将第二个字符串连接到第一个字符串的后面,并输出连接后的结果。要求:不能调用字符串库函数strcat() 。
#include <stdio.h>void main(){ int i=0,j=0;
char s1[80],s2[80];printf(" 请输入第 2 个字符串 :");scanf("%s", s1);scanf("%s", s2);while(s1[i]!='\0')// 计算字符串 1 的长度值
i++; while(s2[j]!='\0')// 将字符串 2 连接在字符串 1 之后{
s1[i]=s2[j];i++;j++;
}s1[i]='\0'; // 添加字符串结束标志printf(" 连接后的字符串为 :%s\n",s1);
}
一维数值与二维数值混合使用
3 从键盘上输入一个 M×N 的二维数组,求该数组各行的平均值,将结果放到一个一维数组中,并输出。
#include <stdio.h>#define M 3#define N 4void main(){
int i,j;float a[M][N],b[M],sum;printf(" 请输入 %d×%d 的矩阵 :",M,N);for(i=0;i<M;i++){
sum=0;for(j=0;j<N;j++){
scanf("%f",&a[i][j]); sum=sum+a[i][j];// 在接收第 i 行输入的同时求和
}b[i]=sum/N; // 求每行的平均值并放入数组 b 中
}for(i=0;i<M;i++)
printf("%4.2f ",b[i]);}