220 likes | 304 Views
实验四 数组程序设计. 一、实验目的. 掌握一维数组和二维数组的定义、引用、初始化和输入输出方法。 掌握与数组有关的算法(查找和排序算法) 良好编程风格之标识符命名. 二、实验内容. 数组是一组相关的存储单元,这些存储单元具有相同的名字和数据类型。 要引用数组的某个特定的存储单元(元素),需要说明数组名和该特定元素在数组中的序号。数组的下标是从 0 开始的,因此,用 C[0] 引用数组 C 的第 1 个元素,用 C[1] 引用数组 C 的第 2 个元素, C[i-1] 引用数组 C 的第 i 个元素。. 二、实验内容. 一维数组的定义格式为 :
E N D
一、实验目的 • 掌握一维数组和二维数组的定义、引用、初始化和输入输出方法。 • 掌握与数组有关的算法(查找和排序算法) • 良好编程风格之标识符命名
二、实验内容 • 数组是一组相关的存储单元,这些存储单元具有相同的名字和数据类型。 • 要引用数组的某个特定的存储单元(元素),需要说明数组名和该特定元素在数组中的序号。数组的下标是从0开始的,因此,用C[0]引用数组 C的第1个元素,用C[1]引用数组C的第2个元素,C[i-1]引用数组C的第i个元素。
二、实验内容 • 一维数组的定义格式为: 类型说明符 数组名[常量表达式]; • 在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。 • 组的下标是从0开始的,因此,用C[0]引用数组 C的第1个元素,用C[1]引用数组C的第2个元素,C[i-1]引用数组C的第i个元素。
一维数组的定义 • 一维数组的定义格式为: 类型说明符 数组名[常量表达式]; • 在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。 • 常量表达式可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
一维数组的定义 • 以下程序段,给出了一维数组的几种定义方法,判断哪些是正确的,哪些是错误的 • 常量表达式可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
以下程序段,给出了一维数组的几种定义方法, 判断哪些是正确的,哪些是错误的 main() { int n; scanf("%d" ,&n); int a[n]; } main() { const int n=4; int a[n] = {1, 2, 3, 4}; ... }
4.main() { int a[2+2*4] ... } 3.#include <stdio.h> #define M 10 main() { int a[M]; ... } 5.#include <stdio.h> #define M 2 #define N 8 main() { int a[M+N]; ... } 6. main() { int a[] = {1, 2, 3, 4, 5}; int b[6] = {1, 2, 3, 4, 5}; static int c[6] = {1}; .. }
7. • main() • { • char a[] = {‘1’, ‘2’, ‘3’, ‘4’, ‘5’}; • char b[] = “This is a string.”; • ... • }
2.生成指向数组的指针 - 通过指定数组名,可以生成一个指向数组第一个元素的指针。 int *p; int sample[10]; p = sample; • 可以使用&运算符来指定数组第一个元素的地址。 p=&sample[0]
3.一维数组作为函数的参数 - 在C中,不能把整个数组作为一个参数传递给函数, 可以通过指定数组名而不是下标,把一个指向数组的指针传递给函数。 int main(void) • 可以使用&运算符来指定数组第一个元素的地址。 p=&sample[0]
3.一维数组作为函数的参数 - 在C中,不能把整个数组作为一个参数传递给函数, 可以通过指定数组名而不是下标,把一个指向数组的指针传递给函数。 int main(void) { int i[10]; func(i); ...... }
有三种方式声明一维数组作为函数形参: - 作为一个指针 void func (int *x); //pointer - 作为一个固定长度的数组 void func (int x[10]); //sized array int i[10]; func(i); ...... }
有三种方式声明一维数组作为函数形参: - 作为一个指针 void func (int *x); //pointer - 作为一个固定长度的数组 void func (int x[10]); //sized array - 作为一个不定长的数组 void func (int x[]); //unsized array
定义二维数组的一般形式是: 类型说明符 数组名[常量表达式1][ 常量表达式2]; • 二维数组的初始化 - 在定义数组时对数组进行初始化, - 作为一个不定长的数组 void func (int x[]); //unsized array
二维数组的定义 • 定义二维数组的一般形式是: 类型说明符 数组名[常量表达式1][ 常量表达式2]; • 二维数组的初始化 - 在定义数组时对数组进行初始化, int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; int a[2][3] = {1, 2, 3, 4, 5, 6}; - 定义时初始化可以省略第一维的大小,例如: int a[][3] = {1, 2, 3, 4, 5, 6}; //等价于 int a[2][3] = {1, 2, 3, 4, 5, 6};
二维数组的定义 • 二维数组作为函数的输入参数 如果你向函数传递二维数组: int array[NROWS][NCOLUMNS]; f(array); 那么函数的声明必须匹配: int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; int a[2][3] = {1, 2, 3, 4, 5, 6}; - 定义时初始化可以省略第一维的大小,例如: int a[][3] = {1, 2, 3, 4, 5, 6}; //等价于 int a[2][3] = {1, 2, 3, 4, 5, 6};
二维数组作为函数的输入参数 如果你向函数传递二维数组: int array[NROWS][NCOLUMNS]; f(array); 那么函数的声明必须匹配: void f(int a[][NCOLUMNS]) { ... } 或者 void f(int (*ap)[NCOLUMNS]) /* ap 是个数组指针 */
应用举例 1. 输入以下程序,调试并修改错误,参考程序如下: • #include <stdio.h> • void main(void) • { • int i, a[5]; • for (i = 0; i <= 5; i++) • { • printf("Please input the %dth number:",i+1); • scanf("%d",&a[i]); • for (i = 0; i <= 5; i++) • { • printf("the %dth number is %d:",i+1,a[i]); • } • } • }
#include <stdio.h> #define N 10 int main(void) { int i, j; int t; //中间变量 int min; //记录符合位置i的最小的数的位置 int data[N]={3,6,2,5,8,1,0,4,7,9}; for (i = 0; i < N-1; i++) { min=i; 2. 输入并运行下面的程序,该程序实现了排序算法
for (j = i+1; j < N; j++) { if (data[j] < data[min]) { min = j; } } if (min != i) { t = data[i]; data[i] = data[min]; data[min] = t; } } 2. 输入并运行下面的程序,该程序实现了排序算法
for (i = 0; i < N; i++) { printf("%d", data[i]); } } 1)调试程序使之能正常运行,若希望从大到小排序,需如何修改程序? 2)如果希望看到程序运行过程中,数据是如何一步一步完成排序的,需在程序中的什么位置增加什么代码? 2. 输入并运行下面的程序,该程序实现了排序算法