实验结论
- Part1
运行结果中每个地址之间差4个字节,似乎就可以下定论“数组中每个元素之间差4个字节”,然而事实真的是如此吗?
#include <stdio.h> int main() { double a[5] = {1.2, 2.3, 3.4, 4.5, 5.6}; // 定义一维数组a,包含5个浮点型数据,并对其初始化 int i; // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 for(i=0; i<5; i++) printf("%d: %lf\n", &a[i], a[i]); return 0; }
不妨运行如上代码,看看每个地址之间的差值
- Part2-4
数组作为函数参数时有很多写法,int a[],int *a等等,请注意:当二维数组a[][]作为参数时,a[][x]中的x必须填写,而第一个空则可不填。
正如pdf所说,形参的数组名代表的是一个地址变量,因此会有如下的区别。
#include<stdio.h> void swap(int x,int y) { int z; z=x; x=y; y=z; } int main() { int a,b; a=10; b=20; swap(a,b); printf("a=%d\tb=%d\n",a,b); return 0; }
此处就和数组的调用截然不同。
请另外注意:
(a+i)是整个第i行的地址
*(a+i)就表示第i行首元素的地址
*(a+i) + j 就是 &a[i][j]
*( *(a+i) + j) 就是a[i][j]元素的值
对排序的整理如下:
①简单排序法
#include <stdio.h> void sort(int a[ ],int n) //简单选择排序法 { int k; for(int i=0; i<n-1; i++) {k=i; for(int j=i+1;j<n;j++) if(a[k]>a[j]) k=j;//此处将a[k]和a[k+1],a[k+2],……a[n-1]进行比较找出最小的那个 if(k!=i) {temp=a[i]; a[i]=a[k]; a[k]=temp;}}//此处将最小的放在了a[i] } void print(int b[ ], int n) {for( int i=0; i<n; i++) printf(“%6d”, b[i]);} void main() {int a[ ]={6,3,1,2,5,0,9,3,7,6}; sort(a,10); print(a,10); }
②冒泡排序法
#include <stdio.h>
void sort(int a[ ], int n)
{int temp;
for( int i=0; i<n-1; i++)
{for( int j=0; j<n-i-1; j++)
{if(a[j]>a[j+1])
{temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;}}
}}
void print(int b[ ], int n)
{for(int i=0; i<n ; i++)
{printf("%6d", b[i]);}
}
int main()
{int a[10]={6,7,4,10,2,5,9,8,3,1};
sort(a,10);
print(a,10);
return 0;
}
③插入排序法
#include <stdio.h> #include <conio.h> void main() {int i, n, x; void insert(int *, int , int *); int a[ ]={-3,2,6,9,14,19}; n=6; scanf(“%d”,&x); insert(a,x,&n); for( i=0; i<n; i++) printf(“%d”, a[i]);} void insert(int *b, int y, int *m) //插入排序法 {int i,j, k; for(i=*m-1; i>=0; i--) {if(y<*(b+i)) *(b+i+1)=*(b+i); else break; } *(b+i+1)=y; (*m)++; }
- Part5
// 功能描述:输入一组整数,输出最大值 #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 // 补足程序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 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; }
运行结果如下所示:
#include <stdio.h> const int N=4; void output(char x[], int n); // 函数声明 // 排序函数声明 void px(char x[],int n);// 补足代码1 int main() { char string[4] = {'2','0','1','9'}; int i; printf("排序前: \n"); output(string, N); // 调用排序函数对字符数组中的字符由大到小排序 px(string,N);// 补足代码2 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 px(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; } } } }// 补足代码3
运行结果如下所示:
实验总结与体会
遗忘了很多基础知识,犯了很多错,也有些错误至今没有正面解决但是采用其他办法避开了,we need something brand new~