实验四
Posted jiyuan201088
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验四相关的知识,希望对你有一定的参考价值。
Part 1:数组数据结构
源代码 | 运行结果 | 数据类型 | 内存空间 |
#include <stdio.h> const int N=5; int main() { int a[N] = {1, 2, 3, 4, 5}; int i; for(i=0; i<N; i++) printf("%d: %d\\n", &a[i], a[i]); return 0; }
|
![]() |
int | 4字节 |
#include <stdio.h> const int N=5; int main() { char a[5] = {‘h‘,‘e‘,‘l‘,‘l‘,‘o‘}; int i; for(i=0; i<N; i++) printf("%d: %c\\n", &a[i], a[i]); return 0; }
|
![]() |
char | 1字节 |
#include <stdio.h> const int N=5; int main() { double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; int i; for(i=0; i<N; i++) printf("%d: %.2f\\n", &a[i], a[i]); return 0; }
|
![]() |
double | 8字节 |
由上述对比我们可以发现:虽然类型不同数组所占内存大小不同,但是它们的存放顺序总是连续的。
Part 2:一维数组的定义、初始化以及数组元素的引用方法
Ⅰ. 一维数组的声明形式法:数组元素的类型说明符+数组名称+[数组的大小]。
p.s.大小为n的一维数组,下标为0~n-1
Ⅱ.一维数组全体元素初始化的方式:各元素的值(也可以是表达式)顺序排在一对花括号里,用逗号分隔。
此外,利用数组下标的变化特性,使用for循环,可以使得输出数组元素的代码更简洁。
p.s.数组在初始化时也可以不写数组的大小。但只有当对所有数组元素初始化的时候,才可以省略数组大小。
Ⅲ.在对数组初始化时,如果只初始化一部分元素,那么剩余没有被初始化的元素值系统自动设为0。
Part 3:数组作为函数参数
// 示例:数组名作为函数实参 #include <stdio.h> const int N=5; void init(int a[],int n, int value); // 函数声明 int main() { int b[N],i; init(b,N,-1); // 函数调用 for(i=0;i<N;i++) printf("%3d",b[i]); return 0; } // 函数定义 // 函数功能描述: 把一个含有n个元素的整型数组的元素值全都设为value void init(int a[], int n, int value) { int i; for(i=0;i<n;i++) a[i] = value; }
结合程序可知,函数调用时,参数传递过程如下:
在main()函数中调用init(b,N,-1)之前,设内存空间示意图如左侧图所示,系统为整型数组b分配了一组连续内存空间,用于存放5个整型元素。假设,起始地址编号是0。在c语言中,数组名代表的是数组所占用的这段连续空间的首地址,这里,即b是0。
当发生函数调用时,即init(b,N,-1);被执行时,将发生函数调用,转入子函数init()去执行。结合右侧示意图,此时,编译系统为形式参数a,n,value分配空间,同时,把实际参数b,N,-1的值拷贝给形式参数a,n,value.由此,形式参数a,n,value分别获得了值0,5,-1。
(p.s.形参里出现的数组名,实际上是代表的是一个地址变量,用来存放地址。换句话说,实参数组b和形参数组a对应的是同一组内存空间)
p.s.注意:函数名作为参数时,实参和形参的书写形式
1、函数声明和函数定义中,函数名init后面括号里出现的是形式参数,数组名后面要加[ ]。
2、函数调用中,函数名init后面括号里出现的是实际参数,直接写数组名。
Part 4:用冒泡法对一组数据由小到大排序
假设要对n个数由小到大排序,使用冒泡法具体排序过程如下:
第1遍: 对n个数进行第1遍扫描
比较第1个数与第2个数,若a1>a2,则交换;此时,a2中存放a1和a2两个数当中的最大值。
比较第2个数与第3个数,若a2>a3,则交换;此时,a3中存放a2和a3两个数当中的最大值。
依次类推…
比较第n-1个数和第n个数,若an-1>an ,则交换;此时,an中存放an-1和an当中的最大值。
经过(n-1)次比较后,最大的数被放在an
第2遍: 前面n-1个数进行第2遍扫描:
…
经过(n-2)次比较后,第2大的数被放在an-1
… …
第n-1遍: 对前面2个数进行第n-1遍扫描
…
经过1次比较后,第2小的数被放a2
至此,排序过程结束。
总结: 用冒泡法对n个数小→大排序,
共需扫描(n-1)遍,第i遍扫描时需要比较(n-i)次
(中心思想:把一组数据中相邻的两个数进行比较,较大的数放到后面。)
示例:
// 对一组整型数据由小到大排序(采用冒泡排序算法) #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开始和结束的边界条件
Part 5:编程练习
- 练习1:补全程序,查找一组整型数据的最大值。
源代码:
#include <stdio.h> int findMax(int a[], int n); const int N=5; int main() { int a[N]; int max, i; printf("输入%d个整数: \\n", N); for(i=0;i<N;i++) scanf("%d",&a[i]); max=findMax(a,N); printf("数组a中最大元素值为: %d\\n\\n", max); return 0; } int findMax(int a[],int n){ int i,max; max=a[0]; for(i=0;i<N;i++){ if(a[i]>max) max=a[i]; } return max; }
运行结果:
- 练习2:补全程序,使用冒泡法对字符数组由大到小排序。
源代码:
#include <stdio.h> const int N=4; void output(char x[], int n); void rank(char x[],int n); int main() { char string[N] = {‘2‘,‘0‘,‘1‘,‘9‘}; int i; printf("排序前: \\n"); output(string, N); rank(string,N); printf("\\排序后: \\n"); output(string, N); printf("\\n"); return 0; } void output(char x[], int n) { int i; for(i=0; i<N; i++) printf("%c", x[i]); } void rank(char x[],int n){ int i,j; char temp; for(i=0;i<N;i++){ for(j=0;j<N-i-1;j++){ if(x[j]<x[j+1]){ temp=x[j]; x[j]=x[j+1]; x[j+1]=temp; } } } }
运行结果:
实验总结与体会
主要还是数组的下标范围时不时注意不到,还有就是对冒泡法的边界条件的认识不清。总之只有多练习才是一切的根本。
以上是关于实验四的主要内容,如果未能解决你的问题,请参考以下文章