实验4

Posted ability-1206

tags:

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

part.1  验证性部分

1.数据中的数据是连续存放的,5个地址连续

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

  技术图片

改变数组类型:

char型

#include <stdio.h>
const int N=5;
    int main() {
    char a[N] = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘};
    int i;

    for(i=0; i<N; i++)
    printf("%d: %c\\n", &a[i], a[i]);
    return 0;
}

  技术图片注意:字母要用单引号以表示字符常量

double型

#include <stdio.h>
const int N=5;
    int main() {
    double a[N] = {1,2,3,4,5};
    int i;

    for(i=0; i<N; i++)
    printf("%d: %.2lf\\n", &a[i], a[i]);
    return 0;
}

  技术图片(为什么实验4里%d是改成%.2f,而不是%.2lf ?)

 

part.2 

一维数组的定义,注意下标从0开始

#include <stdio.h>
int main() {
    int a[5];
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    a[3] = 4;
    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;
}

  技术图片

下面用循环输出,并对数组初始化

#include <stdio.h>
int main() {
    int a[5]={1,2,3,4,0};
    int i=0;
    
    while(i++<5)
    printf("a[%d] = %d\\n", i-1, a[i-1]);

    return 0;
}

  技术图片

利用循环,程序结构更加清楚。

对数组所有元素初始化时可以省略数组大小不写。

数组也可以部分初始化,从下标为0的数组向后依次初始化,剩下的未被初始化的数组系统自动赋值为0。

(数组a【 】括号里的数是要一个常量。在part.1中,a[N]中N是一个常量;a[5]中5是常量;但a[ i ]中i是一个变量,即使它有值,为什么它还能输出 ?)

 

part.3 数组作为函数参数

一.数组元素作为函数参数

1.如part.1中的程序,数组作为printf()函数的实际参数。

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]); 
    printf("\\n");
    return 0;
}

void print(int x) {
    printf("%d ", x);
}

  技术图片

 

二. 数组名作为函数参数

#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()中,int a[ ]表示的是数组地址,主函数中b(可以改成 &b[0] )是数组b[0]的地址,所以对a[ ]初始化就相当于对b[ ]初始化。

数组a[ ]作为形式参数。

 

part.4 冒泡法对一组数据排序

#include<stdio.h>
const int N=5;
void px(double b[],int n);
int main(){
	
	double a[N];
	
	printf("请输入%d个数据:\\n",N);
	for(int i=0;i<N;i++){
	    scanf("%lf",&a[i]);
    }
    
    px(a,N);
    
    printf("从小到大:"); 
    for(int i=0;i<N;i++)
	printf ("%lf\\t",a[i]);
	printf("\\n");
    
	printf("从大到小:");
	for(int i=N-1;i>N-6;i--)
	printf ("%lf\\t",a[i]);
	printf("\\n");
	
	return 0;
}

void px(double b[],int n){      //从小到大排序
    int i,j;
    double m;
    for(j=0;j<n-1;j++){
	
	for(i=0;i<n-1-j;i++){
		if(b[i]>b[i+1]){
			m=b[i];
			b[i]=b[i+1];
			b[i+1]=m;
		}
	} 
}
 
}

  技术图片

5个数的排序,每次循环把最大的数往后排

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);
	
	// 利用循环输入N个整数给数组a
    for(i=0;i<N;i++)
    scanf("%d",&a[i]);

    // 调用子函数max求数组a的最大元素值,并赋值给max
    max=findMax(a,N);

    // 输出最大值
    printf("数组a中最大元素值为: %d\\n\\n", max);
    return 0;
}
    // 函数定义
    // 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
int findMax(int a[],int n){
	int i;
	for(i=0;i<n-1;i++)
		if(a[i]>a[i+1])
	    a[i+1]=a[i];	
	
	return a[n-1];
	
}

  技术图片技术图片

找最大值只要用冒泡法把最大值移到最后,最后那个元素就是最大值。

 

2.使用冒泡法从大到小

#include <stdio.h>
const int N=4;
void output(char x[], int n); // 函数声明
    
	// 排序函数声明
void sort(char a[],int n);
    
int main() {
    char string[N] = {‘2‘,‘0‘,‘1‘,‘9‘};
    int i;
    printf("排序前: \\n");
    output(string, N);

    // 调用排序函数对字符数组中的字符由大到小排序
    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]);
}

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

  技术图片

和part.4方法一样,比较的是字符对应的ASCII码的大小。

 

选做:

一个输入函数input(),在part.5第二题基础上做些修改

#任意字符从大到小

#include <stdio.h>
const int N=8;
void output(char x[], int n);//输出函数声明
void input(char x[],int n);//输入函数声明 
void sort(char a[],int n);// 排序函数声明
    
int main() {
    char string[N];
    
    input(string,N); 

    printf("排序前: \\n");
    output(string, N);

// 调用排序函数对字符数组中的字符由大到小排序
    sort(string,N);

    printf("\\n排序后: \\n");
    output(string, N);
    printf("\\n");
    return 0;
}
// 函数定义
// 函数功能描述:输入包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void input(char x[],int n){	
	int i;
	printf("请输入%d个字符:\\n",N);
    for(i=0; i<N; i++)
    x[i]=getchar();		
} 

// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
    int i;
    for(i=0; i<N; i++)
    printf("%c", x[i]);
}
// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
void sort(char b[],int n){
	int i,j;
	char m;
    for(j=0;j<n-1;j++){
	    for(i=0;i<n-1-j;i++){
		    if(b[i]<b[i+1]){
			    m=b[i];
			    b[i]=b[i+1];
			    b[i+1]=m;
		    }
	    } 
    }
 
}

  技术图片

字符对应的ASCII码                                                      1.注意空格也是一个字符,而且空格ASCII码为0。。。

@      64                                                                        2.要比较多少字符,改变N的值就好了。

f      102

5      53

P      80

#      35

=      61

*      42

[      91

 

感想:数组用起来比以前方便多了,不用设多个变量,自己更容易理清程序逻辑。     

  

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

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

JSP 设计教师与学生不同登陆界面(带验证码)

使用 React 实验性中继片段:缺少属性 '"$fragmentRefs"'

chapter1.高通量序列实验简介:设计与生物信息学分析

VSCode自定义代码片段4——cli的终端命令大全

web代码片段