C语言 实验五 任务报告
📝实验五 任务报告
✨实验总结
😟遇到的问题:
这次报告本来已经写好了的,但是宿舍突然停电,电脑直接关闭,我也没开自动保存,真是一个悲惨的故事。导致只有先交上去再修改😥
🧐解决方法:
重新写一遍
🤔反思:
要养成随时保存的习惯
✨实验内容
🕐任务一
📃代码:
#include <stdio.h>
#include "stdlib.h"
#define N 5
int main()
{
int a[N]={1,2,3,5,8};
printf("通过数组名及下标直接访问数组元素:\n");
for (int i = 0; i < N; ++i)
{
printf("a[%d]的地址为:%d,值为:%d\n",i,&a[i],a[i]);
}
printf("通过地址间接访问数组元素:\n");
for (int i = 0; i < N; ++i)
{
printf("a[%d]的地址为:%d,值为:%d\n",i,a+i,a[i]);
}
return 0;
}
🎨截图:
🤓反思:
通过截图可以清楚的看到数组的每个元素地址都相差4个字节,刚好是定义int所分配的字节数,因此数组在内存中是连续存放的;
就本例而言,我认为a+i和&a[i]、*(a+i)和a[i]是等价的,但是仅仅只针对一维数组。换做是二维数组就明显不等价了。
🕑任务二
代码:
#include <stdio.h>
#include <stdlib.h>
#define line 4
#define col 3
int main()
{
int a[line][col]={1,2,3,5,8,13,21,34,55,89,144,233};
printf("通过数组名及下标直接访问数组元素:\n");
for (int i = 0; i < line; ++i)
{
for (int j = 0; j < col; ++j)
{
printf("a[%d][%d]的地址为:%d,值为:%d\n",i,j,&a[i][j],a[i][j]);
}
}
printf("通过地址间接访问数组元素:\n");
for (int i = 0; i < line; ++i)
{
for (int j = 0; j < col; ++j)
{
printf("a[%d][%d]的地址为:%d,值为:%d\n",i,j,a+i,a[i][j]);
}
}
return 0;
}
截图:
反思:
观察一下,二维数组的确是按照行的顺序存放的a[3][0]
到a[3][3]
的地址都是一样的,整个数组由m行组成,每一行又由n列组成。
也同样是只针对二维数组而言,这些形式是等价的。
🕒任务三
📃代码:
#include <stdio.h>
#include "stdlib.h"
#define N 5
int main()
{
int a[N];
int *p;
for (p = a; p < a + N; ++p)
{
scanf("%d",p);
}
for (p = a;p < a+N; ++p)
{
printf("%d ",*p);
}
printf("\n");
p=a;
for (int i = 0; i < N; ++i)
{
scanf("%d",p+i);
}
for (int i = 0; i < N; ++i)
{
printf("%d ",*(p+i));
}
printf("\n");
return 0;
}
🎨截图:
🤓反思:
指针变量在使用时一定要有指向的地址,否则指向不明确,程序会出错;
指向a[3];
p = a;
这一行之后的p+i
并未改变p的指向,所以全部指向a[0]
🕓任务四
📃代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[2][3]={1,2,3,5,6,11};
int *p;
int (*q)[3];
for(p=a[0];p<(a[0]+6);++p)
{
printf("%d ",*p);
}
printf("\n");
for(q=a;q<a+2;++q)
{
for (int i = 0; i < 3; ++i)
{
printf("%d ",*(*q+i));
}
}
printf("\n");
return 0;
}
🎨截图:
🤓反思:
for(p=a[0];p<(a[0]+6);++p)
可以换为for(p=&a[0][0]; p<&a[0][0] + 6; p++)
,由任务2可得对于二维数组,&a[0][0]
与a[0]
等价;
*q+j
表示a[0]+j
,*(q+j)
表示a[j]
;
指向一维数组的指针变量
设一维数组为a[n]
定义方法: *指针变量名
,即 *p
这个p
一般指向的一维数组的首地址,即p=a
,或者p=&a[0]
;p,a,&a[0]
均指向同一单元,它们是数组a的首地址,也是0 号元素a[0]
的首地址。p+1,a+1,&a[1]
均指向1号元素a[1]
。类推可知a+i,a+i,&a[i]
。
指向二维数的指针变量
定义方法:(*指针变量名)[长度]
即 (*P)[n]
把二维数组a 分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4]
它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a[0]
,其值等于a,a[0]
,或&a[0][0]
等。而p+i
则指向一维数组a[i]
。从前面的分析可得出*(p+i)+j
是二维数组i行j 列的元素的地址,而*(*(p+i)+j)
则是i行j列元素的值。
A、E、D、F、G、B、C
🕔任务五
📃代码:
5.1
#include <stdio.h>
#include <stdlib.h>
#define N 5
int bisearch(int x[],int n,int item);
int main()
{
int a[N]={1,12,65,123,644};
int index,key;
printf("数组a中的数据:\n");
for (int i = 0; i < N; ++i)
{
printf("%d,",a[i]);
}
printf("\n");
printf("输入待查找的数据项:");
scanf("%d",&key);
index=bisearch(a,N,key);
if(index>=0)
printf("%d在数组中,下标为%d\n",key,index);
else
printf("%d不在数组中\n",key);
return 0;
}
int bisearch(int x[],int n,int item)
{
int low,high,mid;
low=0;
high=n-1;
while (low<=high)
{
mid=low+(high-low)/2;
if (x[mid]==item)
return mid;
else if (x[mid]>item)
high=mid-1;
else
low=mid+1;
}
return -1;
}
5.2
#include <stdio.h>
#include <stdlib.h>
#define N 5
int bisearch(int *x,int n,int item);
int main()
{
int a[N]={1,12,65,123,644};
int index,key;
for (int j = 0; j < 3; ++j)
{
printf("数组a中的数据:\n");
for (int i = 0; i < N; ++i)
{
printf("%d,",a[i]);
}
printf("\n");
printf("输入待查找的数据项:");
scanf("%d",&key);
index=bisearch(a,N,key);
if(index>=0)
printf("%d在数组中,下标为%d\n",key,index);
else
printf("%d不在数组中\n",key);
}
return 0;
}
int bisearch(int *x,int n,int item)
{
int low,high,mid;
low=0;
high=n-1;
while (low<=high)
{
mid=(low+high)/2;
if (*(x+mid)==item)
return mid;
else if (x[mid]>item)
high=mid-1;
else
low=mid+1;
}
return -1;
}
🎨截图:
5.1
5.2
🤓反思:
二分查找是一种效率较高的查找方法。但是要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
🕕任务六
📃代码:
6.1
#include <stdio.h>
#include <stdlib.h>
void input(int x[],int n);
void output(int x[],int n);
void select_sort(int x[],int n,int order);
int main()
{
int N;
printf("请输入数组的元素个数:");
scanf("%d",&N);
int a[N];
printf("请依次输入%d个数:",N);
input(a,N);
printf("排序前的数据:\n");
output(a,N);
select_sort(a,N,1);
printf("排序后的数据:\n");
output(a,N);
return 0;
}
void input(int x[],int n)
{
for (int i = 0; i < n; ++i)
{
scanf("%d",&x[i]);
}
}
void output(int x[],int n)
{
for (int i = 0; i < n; ++i)
{
printf("%d ",x[i]);
}
printf("\n");
}
void select_sort (int x[],int n,int order)
{
int temp,p,i,min;
for (int j = 0; j < n; ++j)
{
min=x[j];
for (i = j; i < n; ++i)
{
if(min>=x[i])
{
min=x[i];
p=i;
}
}
temp=x[p];
x[p]=x[j];
x[j]=temp;
}
if (order)
{
int t;
for (int i = 0; i < n/2; ++i)
{
t=x[i];
x[i]=x[n-i-1];
x[n-i-1]=t;
}
}
}
6.2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
#define order 1
void output(char x[][20],int n);
void select_sort(char x[][20],int n,int o);
int main()
{
char name [][20]={"Jay","Z","Jobs","Bill","Trump"};
printf("输出初始名单:\n");
output(name,N);
select_sort(name,N,order);
printf("按字典序输出名单:\n");
output(name,N);
return 0;
}
void output(char x[][20],int n)
{
for (int i = 0; i < n; ++i)
{
printf("%s ",x[i]);
}
printf("\n");
}
void select_sort (char x[][20],int n,int o)
{
char temp[20],min[20];
int i,j,p;
for (j = 0; j < n; ++j)
{
strcpy(min,x[j]);
for (i = j; i < n; ++i)
{
if(strcmp(min,x[i])>=0)
{
strcpy(min,x[i]);
p=i;
}
}
strcpy(temp,x[p]);
strcpy(x[p],x[j]);
strcpy(x[j],temp);
}
if (o)
{
char t[20];
for (int i = 0; i < n/2; ++i)
{
strcpy(t,x[i]);
strcpy(x[i],x[n-i-1]);
strcpy(x[n-i-1],t);
}
}
}
🎨截图:
6.1
6.2
🤓反思:
感觉代码有点多余,但是想优化又无从下手,如果能有评论指出就好了。