实验四

实验结论

Part1: 数组数据结构

通过实验观察验证数据中数据是否是连续存放

 1 // 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的
 2 #include <stdio.h>
 3 const int N=5;
 4 int main() {
 5 int a[N] = {1, 2, 3, 4, 5}; // 定义一维数组a,包含5个整型数据,并对其初始化
 6 int i;
 7 // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值
 8 for(i=0; i<N; i++)
 9 printf("%d: %d\n", &a[i], a[i]);
10 return 0;
11 }

改动line5&line9

 1 // 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的
 2 #include <stdio.h>
 3 const int N=5;
 4 int main() {
 5 char a[5] = {'h','e','l','l','o'}; // 对demo.cpp的line5做修改
 6 int i;
 7 // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值
 8 for(i=0; i<N; i++)
 9 printf("%d: %c\n", &a[i], a[i]); // 对demo.cpp的line9做修改
10 return 0;
11 }

 1 // 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的
 2 #include <stdio.h>
 3 const int N=5;
 4 int main() {
 5 double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
 6 int i;
 7 // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值
 8 for(i=0; i<N; i++)
 9 printf("%d: %.2f\n", &a[i], a[i]);
10 return 0;
11 }

 

Part2: 一维数组的定义、初始化以及数组元素的引用方法

这个程序用于说明一维数组定义的方法,和数组元素的引用方法

 1 // 示例: 一维数组的定义以及数组元素的引用
 2 #include <stdio.h>
 3 int main() {
 4 int a[5]; // 定义一维数组a,包含5个元素,每个元素都是int类型
 5 // 通过数组名和下标的形式引用数组元素
 6 // 注意:数组下标从0开始,所以是0~4,而不是1~5
 7 a[0] = 1;
 8 a[1] = 9;
 9 a[2] = 8;
10 a[3] = 6;
11 a[4] = 0;
12 printf("a[0] = %d\n", a[0]);
13 printf("a[1] = %d\n", a[1]);
14 printf("a[2] = %d\n", a[2]);
15 printf("a[3] = %d\n", a[3]);
16 printf("a[4] = %d\n", a[4]);
17 return 0;
18 }

在上程序基础上做了两处改进:

1. 在定义数组的同时对所有元素赋初值,即初始化
2. 利用数组下标的变化特性,使用循环,使得输出数组元素的代码更简洁。

 1 // 示例: 一维数组的定义、初始化以及数组元素的引用
 2 #include <stdio.h>
 3 int main() {
 4 // 定义一维数组a,包含5个元素,每个元素都是int类型
 5 // 并对所有进行初始化
 6 int a[5] = {1, 9, 8, 6, 0};
 7 int i;
 8 // 利用循环输出数组元素
 9 for(i=0; i<5; i++)
10 printf("a[%d] = %d\n", i, a[i]);
11 return 0;
12 }

结果相同

这个示例说明在什么样的情况下,定义数组的时候才可以省略不写数组大小:

 1 // 示例: 一维数组的定义、初始化以及数组元素的引用
 2 #include <stdio.h>
 3 int main() {
 4 int a[] = {1, 9, 8, 6, 0}; // 当对所有数组元素初始化的时候,才可以省略数组大小
 5 int i,n;
 6 // 计算数组元素的个数
 7 n = sizeof(a) / sizeof(a[0]);
 8 // 利用循环输出数组元素
 9 for(i=0; i<n; i++)
10 printf("a[%d] = %d\n", i, a[i]);
11 return 0;
12 }

结果同上

使用sizeof(a)/sizeof(int)也可以。因为这里每一个数组元素是int型,sieof(int)计算出一个int型数据
占用的字节数

这个示例说明只对部分数组元素初始化:

 1 // 示例: 这个示例展示可以只对部分元素初始化
 2 #include <stdio.h>
 3 int main() {
 4 // 定义一维数组a,包含5个元素,每个元素都是int类型
 5 // 只对一部分元素初始化
 6 int a[5] = {1, 9}; // 1和9分别用于初始化a[0]和a[1]
 7 int i;
 8 // 利用循环输出数组元素
 9 for(i=0; i<5; i++)
10 printf("a[%d] = %d\n", i, a[i]);
11 return 0;
12 }

剩余没有被初始化的元素值,系统自动设为0

Part3: 数组作为函数参数

这个程序展示数组元素作为函数参数

 1 // 示例:数组元素作为函数参数
 2 #include <stdio.h>
 3 const int N=5;
 4 int main() {
 5 int score[N] = {99, 82, 88, 97, 85};// 定义数组score,包含5个int元素,并初始化
 6 int i;
 7 // 输出数组元素
 8 for(i=0; i<N; i++)
 9 printf("%d ",score[i]); // 数组元素score[i]作为实参
10 return 0;
11 }

仍然展示数组元素作为函数参数,print()用户自定义

 1 // 示例:数组元素作为函数参数
 2 #include <stdio.h>
 3 const int N=5;
 4 void print(int x); // 函数声明
 5 int main() {
 6 int score[N] = {99, 82, 88, 97, 85};
 7 int i;
 8 // 输出数组元素
 9 for(i=0; i<N; i++)
10 print(score[i]); // 数组元素score[i]作为实参
11 printf("\n");
12 return 0;
13 }
14 // 函数定义
15 // 功能描述:在屏幕上打印输出x的值
16 void print(int x) {
17 printf("%d ", x);
18 }

数组名作为函数实参

 1 // 示例:数组名作为函数实参
 2 #include <stdio.h>
 3 const int N=5;
 4 void init(int a[],int n, int value); // 函数声明
 5 int main() {
 6 int b[N],i;
 7 init(b,N,-1); // 函数调用
 8 for(i=0;i<N;i++)
 9 printf("%3d",b[i]);
10 return 0;
11 }
12 // 函数定义
13 // 函数功能描述: 把一个含有n个元素的整型数组的元素值全都设为value
14 void init(int a[], int n, int value) {
15 int i;
16 for(i=0;i<n;i++)
17 a[i] = value;
18 }

是形式参数,数组名后面要加[ ];实际参数,直接写数组名

Part4: 用冒泡法对一组数据由小到大排序

// 对一组整型数据由小到大排序(采用冒泡排序算法)
#include <stdio.h>
const int N=5;
void bubbleSort( int [], int); // 函数声明
int main() {
int i,a[N];
printf("请输入%d个整型数据: \n", N);
for(i=0; i<N; i++)
scanf("%d",&a[i]);
printf("排序前的数据: \n");
for(i=0; i<N; i++)
printf("%d ",a[i]);
printf("\n");
bubbleSort(a,N); // 调用函数bubbleSort()对数组a中的N个元素排序
printf("排序后的数据: \n");
for(i=0; i<N; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
// 函数定义
// 函数功能描述:对一组整型数据由小到大排序
// 形参描述:x是待排序的数组名,n是数组中元素个数
// 排序算法:冒泡法
void bubbleSort( int x[], int n) {
int i,j,t;
for (i=0; i<n-1; i++) {
for(j=0; j<n-1-i; j++) {
if( x[j] > x[j+1] ) {
t = x[j];
x[j] = x[j+1];
x[j+1] = t;
}
}
}
}
// 注意内外层循环i和j开始和结束的边界条件

Part5: 编程练习

补全程序,查找一组整型数据的最大值

 1 // 功能描述:输入一组整数,输出最大值
 2 #include <stdio.h>
 3 int findMax(int a[], int n); // 函数声明
 4 const int N=5;
 5 int main() {
 6 int a[N];
 7 int max, i;
 8 printf("输入%d个整数: \n", N);
 9 // 利用循环输入N个整数给数组a
10 for(i=0;i<N;i++)
11 {
12     scanf("%d",&a[i]);
13 }
14 // 调用子函数max求数组a的最大元素值,并赋值给max
15 max=findMax(a,N);
16 // 输出最大值
17 printf("数组a中最大元素值为: %d\n\n", max);
18 return 0;
19 }
20 // 函数定义
21 // 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
22 int findMax(int b[],int m)
23 {
24     int max=b[0],j;
25     for(j=1;j<m;j++)
26     {
27         if(b[j]>max)
28          max=b[j];
29     }
30     return max;
31 }

补全程序,使用冒泡法对字符数组由大到小排序

 1 #include <stdio.h>
 2 const int N=4;
 3 void output(char x[], int n); // 函数声明
 4 // 排序函数声明
 5 void bubbleSort(char x[],int n);
 6 int main() {
 7 char string[N] = {'2','0','1','9'};
 8 int i;
 9 printf("排序前: \n");
10 output(string, N);
11 // 调用排序函数对字符数组中的字符由大到小排序
12 bubbleSort(string,N);
13 printf("\n排序后: \n");
14 output(string, N);
15 printf("\n");
16 return 0;
17 }
18 // 函数定义
19 // 函数功能描述:输出包含有n个元素的字符数组元素
20 // 形参:字符数组,以及字符数组元素个数
21 void output(char x[], int n) {
22 int i;
23 for(i=0; i<N; i++)
24 printf("%c", x[i]);
25 }
26 // 函数定义
27 // 函数功能描述:对一组字符由大到小排序
28 // 形参:字符数组,以及字符数组元素个数
29 void bubbleSort(char x[],int n)
30 {
31     int i,j;
32     char t;
33     for(i=0;i<n-1;i++)
34     {
35         for(j=0;j<n-1-i;j++)
36         {
37             if(x[j]<x[j+1])
38             {
39                 t=x[j];
40                 x[j]=x[j+1];
41                 x[j+1]=t;
42             }
43         }
44     } 
45 } 

 

实验总结与体会

 这一章输出输入的这种形式比较常用:

printf:

for(i=0;i<N;i++)
 printf("%d",a[i]);


scanf:

for(i=0;i<N;i++)
 scanf("%d",&a[i]);

 

另外,在看完实验4课件第8页的demo3_3.cpp后,产生了这样的疑问:它的自定义函数为void型,无返回值,为何能将a[i]返回给主函数中的b[i]?随即在第九页找到了答案:

“正是因为实际参数中数组b的起始地址0被复制给了形式参数a,这样,在函数init()中,通过形式参数a这
个地址去对数组元素进行赋值操作的时候,实际上就是对实参数组b的赋值操作。换句话说,实参数组b和
形参数组a对应的是同一组内存空间”

 

接着,我认为函数名作为参数时,实参和形参的书写形式需要引起重视

“函数声明和函数定义中,函数名init后面括号里出现的是形式参数,数组名后面要加[ ]。即:

void init(int a[], int n, int value);
函数调用中,函数名init后面括号里出现的是实际参数,直接写数组名。即:“
init(b, N, -1);”

 

以上示例大都从实验4课件第8页的demo3_3.cpp中举出,因此demo3_3.cpp值得我更加重视。

 

在最后的“补全程序,使用冒泡法对字符数组由大到小排序”中,曾尝试在“bubbleSort"部分把Part4中“bubbleSort"的"if”部分直接粘贴,但结果与正确答案刚好相反(为“0129”),便将本文次代码的第37行中改为“<",方运行正确,只因两题的要求不同(从小到大与从大到小),还应多加注意。

 

https://www.cnblogs.com/WPA1/p/10771930.html

https://www.cnblogs.com/NyaNyaGoose/p/10771932.html

https://www.cnblogs.com/zxy-345/p/10771911.html

 

转载于:https://www.cnblogs.com/lizhangrui/p/10742443.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值