【实验结论】
• Part 1 数组数据结构
验证数组数据元素数据在内存中的连续存放特性。
程序源码 |
运行结果截图 |
数据类型 |
内存空间 |
1 1 #include <stdio.h> 2 2 const int N=5; 3 3 int main() { 4 4 int a[5] = {1,2,3,4,5}; 5 5 int i; 6 6 for(i=0; i<N; i++) 7 7 printf("%d: %d\n", &a[i], a[i]); 8 8 return 0; 9 9 }
|
|
int |
4个字节 |
1 1 #include <stdio.h> 2 2 const int N=5; 3 3 int main() { 4 4 char a[5] = {'h','e','l','l','o'}; 5 5 int i; 6 6 for(i=0; i<N; i++) 7 7 printf("%d: %c\n", &a[i], a[i]); 8 8 return 0; 9 9 }
|
|
char |
1个字节 |
1 #include <stdio.h> 2 const int N=5; 3 int main() { 4 double a[5] = {1.0,2.0,3.0,4.0,5.0}; 5 int i; 6 for(i=0; i<N; i++) 7 printf("%d: %.2f\n", &a[i], a[i]); 8 return 0; 9 }
|
|
double |
8个字节 |
从运行结果可以看到,无论数组元素数据是何类型,每个数据占多数内存空间,它们他们在内存中的存放顺序总是连续的。
• Part 2 一维数组的定义、初始化以及数组元素的引用方法
程序源码 |
运行结果截图 |
结论 |
1 #include <stdio.h> 2 int main() { 3 int a[5]; 4 a[0] = 1; 5 a[1] = 9; 6 a[2] = 8; 7 a[3] = 6; 8 a[4] = 0; 9 printf("a[0] = %d\n", a[0]); 10 printf("a[1] = %d\n", a[1]); 11 printf("a[2] = %d\n", a[2]); 12 printf("a[3] = %d\n", a[3]); 13 printf("a[4] = %d\n", a[4]); 14 return 0; 15 }
|
|
①一维数组的声明形式法: 数组元素的类型说明符 数组名称 [数组的大小] ②数组下标从0开始,所以是0~4,而不是1~5。 |
1 #include <stdio.h> 2 int main() { 3 int a[5] = {1, 9, 8, 6, 0}; 4 int i; 5 for(i=0; i<5; i++) 6 printf("a[%d] = %d\n", i, a[i]); 7 return 0; 8 }
|
|
①一维数组全体元素初始化的方式:各元素的值(也可以是表达式)顺序排在一对花括号里,用逗号分隔。 ②利用数组下标的变化特性,使用for循环,可以使得输出数组元素的代码更简洁。 |
1 #include <stdio.h> 2 int main() { 3 int a[] = {1, 9, 8, 6, 0}; 4 int i,n; 5 n = sizeof(a) / sizeof(a[0]); 6 for(i=0; i<n; i++) 7 printf("a[%d] = %d\n", i, a[i]); 8 return 0; 9 }
|
|
①当对所有数组元素初始化的时候,才可以省略数组大小。 ②表达式sizeof(a) / sizeof(a[0])用于计算数 组元素的个数。其中:sizeof(a)计算数组a占用的总的字节数 ;sizeof(a[0])计算数组元素a[0]占用的字节数。
|
1 #include <stdio.h> 2 int main() { 3 int a[5] = {1, 9}; 4 int i; 5 for(i=0; i<5; i++) 6 printf("a[%d] = %d\n", i, a[i]); 7 return 0; 8 }
|
|
①在对数组初始化时,如果只初始化一部分元素,那么剩余没有被初始化的元素值系统自动设为0。 |
• Part 3 数组作为函数参数
示例demo3_3.cpp(数组名作为函数实参和形参):
程序源码 | 运行结果截图 |
1 #include <stdio.h> 2 const int N=5; 3 void init(int a[],int n, int value); // 函数声明 4 5 int main() { 6 int b[N],i; 7 8 init(b,N,-1); // 函数调用 9 10 for(i=0;i<N;i++) 11 printf("%3d",b[i]); 12 13 return 0; 14 } 15 16 void init(int a[], int n, int value) { 17 int i; 18 for(i=0;i<n;i++) 19 a[i] = value; 20 }
|
![]()
|
说明:(1)数组作为函数的形参的语法为:
[const] 元素类型 数组名[ ] 或者 [const] 元素类型 *变量名
(2)数组名后的[ ]不能省略,[ ]的含义是参数是一个数组,是一个集合的名称,而非普通变量名称。当函数被调用时,实参数组将首地址作为参数传递给形参数组,这样,形参数组和实参数组对应同一个存储区域,而非副本。
(3)数组作为参数时,实参中只需写实参数组名,不能再取其地址了。如:
sum(x,y,10,z);
sum(&x,&y,10,&z); /*错误!x,y,z已经是数组名*/
(4)用数组名作为函数参数时,要求形参和对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,则会报错。
(5)函数调用、参数传递的过程:就本题而言,当发生函数调用时,即init(b,N,-1);被执行时,将发生函数调用,转入子函数init()去执行。此时,编译系统为形式参数a,n,value分配空间,同时,把实际参数b,N,-1的值拷贝给形式参数 a,n,value.由此,形式参数a,n,value分别获得了值0,5,-1。
• Part 4 用冒泡法对一组数据由小到大排序
程序源码:
1 #include <stdio.h> 2 const int N=5; 3 void bubbleSort( int [], int); // 函数声明 4 int main() { 5 int i,a[N]; 6 7 printf("请输入%d个整型数据: \n", N); 8 for(i=0; i<N; i++) 9 scanf("%d",&a[i]); 10 11 printf("排序前的数据: \n"); 12 for(i=0; i<N; i++) 13 printf("%d ",a[i]); 14 15 printf("\n"); 16 17 bubbleSort(a,N); // 调用函数bubbleSort()对数组a中的N个元素排序 18 19 printf("排序后的数据: \n"); 20 for(i=0; i<N; i++) 21 printf("%d ",a[i]); 22 23 printf("\n"); 24 25 return 0; 26 } 27 28 void bubbleSort( int x[], int n) { 29 int i,j,t; 30 31 for (i=0; i<n-1; i++) { 32 for(j=0; j<n-1-i; j++) { 33 if( x[j] > x[j+1] ) { 34 t = x[j]; 35 x[j] = x[j+1]; 36 x[j+1] = t; 37 } 38 } 39 } 40 }
运行结果截图:
程序分析:(1)算法思想:把一组数据中相邻的两个数进行比较,较大的数放到后面。 这样,经过一轮以后,最大的数就放到了最后。
把剩余的数进行两两比较,经过第2轮后,第2大的数就放到了倒数第二的位置。
……如此循环,若数组中有n个元素,则一共进行n-1次扫描,从而对数组元素实现了升序的排列。
(2)排序过程:在一趟冒泡排序中,从第一个记录开始,扫描整个待排序序列 ,在一趟扫描中,最终必然将最大的元素排在待排序序列 的末尾,这也是最大元素应该在的位置,第一趟时会将整个记录中最大元素排在最后一个位置a[n-1];然后进行第二趟,重复上述过程, 结果将次大记录放在第a[n-2]上,......重复上述过程,直至整个数组余下一个记录为止。
若在某一趟的冒泡排序过程中,一个逆序也没找到,则可以直接结束整个排序过程,所以冒泡排序过程最多只进行n-1趟。
• Part 5 编程练习
♢练习一:补全程序,查找一组整型数据的最大值。
程序源码:
1 #include <stdio.h> 2 int findMax(int a[], int n); 3 const int N=5; 4 int main() { 5 int a[N]; 6 int max, i; 7 printf("输入%d个整数: \n", N); 8 for(i=0;i<N;i++) 9 scanf("%d",&a[i]); 10 max=findMax(a,N); 11 printf("数组a中最大元素值为: %d\n\n", max); 12 return 0; 13 } 14 int findMax(int a[], int n) 15 { 16 int num,m,i; 17 num=sizeof(a)/sizeof(int); 18 m=a[0]; 19 for(i=0;i<n;i++) 20 { 21 if(a[i]>m) 22 m=a[i]; 23 } 24 return m; 25 }
运行结果截图:
♢练习二:补全程序,使用冒泡法对字符数组由大到小排序。
程序源码:
1 #include <stdio.h> 2 const int N=4; 3 void output(char x[], int n); 4 void rank(char x[]) ; 5 6 int main() { 7 char string[N] = {'2','0','1','9'}; 8 int i; 9 printf("排序前: \n"); 10 output(string, N); 11 rank(string); 12 printf("\n排序后: \n"); 13 output(string, N); 14 printf("\n"); 15 return 0; 16 } 17 18 void output(char x[], int n) { 19 int i; 20 for(i=0; i<N; i++) 21 printf("%c", x[i]); 22 } 23 void rank(char x[]) 24 { 25 int num,i,j; 26 char t; 27 num=sizeof(x)/sizeof(char); 28 for(j=0;j<num-1;j++) 29 for(i=0;i<num-j-1;i++) 30 if(x[i]<x[i+1]) 31 { 32 t=x[i]; 33 x[i]=x[i+1]; 34 x[i+1]=t; 35 } 36 }
运行结果截图:
♢选做:尝试编写一个输入函数,完成字符串输入。然后,修改main()程序,在其中调用输入函数,使 得,程序可以在运行时对用户输入的任意字符进行由大到小排序。
程序源码:
1 #include <stdio.h> 2 const int N=5; 3 void output(char x[], int n); 4 void rank(char x[]) ; 5 void input(char x[], int n); 6 int main() { 7 char string[N]; 8 input(string,N); 9 printf("\n排序前: \n"); 10 output(string, N); 11 rank(string); 12 printf("\n排序后: \n"); 13 output(string, N); 14 printf("\n"); 15 return 0; 16 } 17 void input(char x[], int n){ 18 int i; 19 printf("请输入五个字符:\n"); 20 for(i=0;i<N;i++) 21 scanf("%c,",&x[i]); 22 } 23 void output(char x[], int n) { 24 int i; 25 for(i=0; i<N; i++) 26 printf("%c ", x[i]); 27 } 28 void rank(char x[]) 29 { 30 int num,i,j; 31 char t; 32 num=sizeof(x)/sizeof(char); 33 for(j=0;j<num-1;j++) 34 for(i=0;i<num-j-1;i++) 35 if(x[i]<x[i+1]) 36 { 37 t=x[i]; 38 x[i]=x[i+1]; 39 x[i+1]=t; 40 } 41 }
运行结果截图:
【实验总结与体会】
本次实验接触的数组,按我的理解,就是一群相同数据类型又有一定的相互联系的变量的集合,在解决数目较多的同类型数据时很实用。实验中踩的最多的坑就是数组元素的起始下标为0,从0到数组元素个数-1,特别是在冒泡排序法中,双层循环边界条件的处理在加上数组的起始下标这个问题,导致一开始理解起来就比较混乱,后来把中间过程和边界条件在纸上梳理一下就清楚了很多。
----------------------------------------------------------------------------------------------------------------------
给别人的评论:
https://www.cnblogs.com/mittttty/