实验4 数组

Posted 1623449-w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验4 数组相关的知识,希望对你有一定的参考价值。

Part 1

demo1:观察可得五个元素的地址是连续的,每个元素占四个字节。改变数组中的数据不会对数据在内存中的连续存放性造成影响。

以下给出实验用代码及结果

// 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的 
#include <stdio.h> 
const int N=5;
int main() {
    int a[N]={1,2,3,4,5} ;  // 定义一维数组a,包含5个整型数据,并对其初始化,5个元素初始值分别是1,2,3,4,5 

    int i;
    
    // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 
    for(i=0; i<N; i++)
        printf("%d: %d\\n", &a[i], a[i]);

    return 0;
} 

技术图片

 Part2

demo2_1

这里emmm没啥好说的

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

    return 0;
}

 技术图片

也可以将也第四行改为为int a[5]={1,9,8,6,0},然后删去8-12行(即demo2_2的代码,这里就不进行演示了)。

 demo2_3:

// 示例: 一维数组的定义、初始化以及数组元素的引用 
#include <stdio.h> 
int main() {
    int a[] = {1, 9, 8, 6, 0};  
    int i,n;
    
    n = sizeof(a) / sizeof(a[0]);
    
    // 利用循环输出数组元素 
    for(i=0; i<n; i++) 
        printf("a[%d] = %d\\n", i, a[i]);

    return 0;
}

对demo2_2再次进行了改进,运行结果不变。

利用数组初始化的知识让系统自动计算数组的大小。

【n = sizeof(a) / sizeof(a[0]);】原理为用数组的存储空间的大小除以数组中第一个元素占用存储空间的字节数。得出数组大小。

 demo2_4:

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

    return 0;
}

技术图片

可以看出,如果初始化的元素数个数小于数组的长度,则其余元素初始化为0值。

Part3 

demo3_1

// 示例:数组元素作为函数参数
#include <stdio.h>
const int N=5;

int main() {
    int score[N] = {99, 82, 88, 97, 85}; // 定义一个数组score,包含5个int元素,并初始化
    int i;
    
    // 输出数组元素 
    for(i=0; i<N; i++)
        printf("%d ",score[i]);  // 数组元素score[i]作为实参 
    
    return 0;
} 

技术图片

在该程序中,const关键字限定了声明的变量值为常量,使其在程序运行时不做改变。

 另外在for循环中,数组元素score[i]作为标准库函数printf()的实参实现打印输出。

 demo3_2

// 示例:数组元素作为函数参数
#include <stdio.h>
const int N=5;
void print(int x);  // 函数声明 
int main() {
    int score[N] = {99, 82, 88, 97, 85};
    int i;
    
    // 输出数组元素
    for(i=0; i<N; i++)
        print(score[i]);   // 数组元素score[i]作为实参 
    
    printf("\\n");

    return 0;
} 

// 函数定义
// 功能描述:在屏幕上打印输出x的值
void print(int x) {
    printf("%d ", x);
} 

在3_1的基础上,自定义了一个函数printf()用于打印输出,score[i]仍作为参数调用。

 demo3_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;
}

技术图片

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

函数调用中,函数名init后面括号里出现的是实际参数,直接写数组名即可

Part4 补全程序Ⅰ

// 功能描述:输入一组整数,输出最大值 
#include <stdio.h>
int findMax(int a[], int n); // 函数声明
int findMax(int a[],int n){
    int i,max;
    for(i=0;i<n;i++){
        if(a[i]>max){
            max=a[i];
        }
    }
    return max;
}
const int N=5;
int main() {
    int a[N];
    int max, i;
    
    printf("输入%d个整数: \\n", N);
        
    // 利用循环输入N个整数给数组a 
    // 补足程序1 
    for(i=0;i<N;i++){
        scanf("%d",&a[i]);
    }    
    // 调用子函数max求数组a的最大元素值,并赋值给max 
    // 补足程序2 
    max=findMax(a,N);
    
    // 输出最大值
    printf("数组a中最大元素值为: %d\\n\\n", max); 
        
    return 0;
} 

// 函数定义
// 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
// 补足函数findMax()的实现部分3 

技术图片

Part 5  补全程序Ⅱ

#include <stdio.h>
const int N=4;
void output(char x[], int n);  // 函数声明 
// 排序函数声明
// 补足代码1 
// 。。。 
void sort(char x[],int n);

int main() {
    char string[N] = {2,0,1,9};
    int i;
    
    printf("排序前: \\n");
    output(string, N);
    
    // 调用排序函数对字符数组中的字符由大到小排序 
    // 补足代码2 
    sort(string,N);
    
    printf("\\n排序后: \\n"); 
    output(string, N);
    
    printf("\\n");
    
    return 0;    
} 

// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
    int i;
    
    for(i=0; i<N; i++)
        printf("%c", x[i]);
} 

// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
// 补足代码3 
void sort(char x[],int n){
    int i,j,t;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(x[j+1]>x[j]){
                t=x[j];
                x[j]=x[j+1];
                x[j+1]=t;
            }
    }
    }
}

技术图片

 

 实验总结与体会:

1.通过本次实验更加深刻的理解了数组的相关内容。

2.在实验中仍会出现漏【;】等问题,多亏了软件的检查功能。今后要更加小心些。

3.补全程序仍然是我苦手之处,不过这次没有借鉴别人的程序,全程都是自己独立完成,还是挺有成就感的。

4.还是不太能理解在自定义的函数中什么时候需要【return (字符)】。

以上是关于实验4 数组的主要内容,如果未能解决你的问题,请参考以下文章

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

实验4 数组

实验4 函数和数组

以下代码片段的时间复杂度是多少?

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法