【实验结论】

• 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/

https://www.cnblogs.com/chephie/

https://www.cnblogs.com/lxx13/