实验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片段定位)