指针
一、PTA实验作业
1、7-2在数组中查找指定元素
本题PTA提交列表
设计思路
本题让我们输出一个数组中存在的一个数,要输入repeat次,需要一次循环,输入N个数,再一个循环,然后让子函数判断是否有这个数,如果有返回这个数,然后输出这个数,不然输出NOT FOUND。
代码
#include<stdio.h>
int search(int *p,int n,int x);
int main()
{
int x,n,i,flag=0,repeat,d;
scanf("%d",&repeat);
for(d=1;d<=repeat;d++)
{
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
flag=search(a,n,x);
if(flag>=0)
printf("index = %d\n",flag);
else
printf("Not found");
}
}
int search(int *p,int n,int x)
{
int i;
for(i=0;i<n;i++)
if(x==*(p+i))
return i;
return -1;
}
错误样例
这里我犯了一个错误,因为数组是从0开始的,而我在第15行写的是>0,这使当flag=0时输出不了,导致了错误。
7-3使用函数的选择法排序
本题PTA提交列表
设计思路
这题让我们排序用选择排序法,首先要repeat次需要1个循环,用选择排序法,再输出就行了。
代码
#include<stdio.h>
void sort(int *p,int n);
int main()
{
int repeat,n,i,b;
scanf("%d",&repeat);
for(b=0;b<repeat;b++)
{
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("After sorted: ");
sort(a,n);
printf("\n");
}
}
void sort(int *p,int n)
{
int j,k,c,min;
for(j=0;j<n;j++)
{
min=j;
for(k=j;k<n;k++)
{
if(*(p+min)>*(p+k)){
c=*(p+min);
*(p+min)=*(p+k);
*(p+k)=c;
}
}
printf("%d",*(p+min));
if(j!=n-1)
printf(" ");
}
}
错误样例
这题我的输出格式不对,每行输出完要换行,而我没有换行。
6-2移动字母
PTA提交列表
设计思路
这题我让3个数记录最后3个字符,再让剩下的字母前移,再把后面的3个数接到已经移动的字母上。
代码
void Shift( char s[] )
{
char *p,i,a,b,c,x;
x=strlen(s);
p=&s[0];
a=*p;
b=*(p+1);
c=*(p+2);
for(i=3;i<x;i++)
*(p+i-3)=*(p+i);
*(p+x-3)=a;
*(p+x-2)=b;
*(p+x-1)=c;
}
错误样例
这里我没有定义n,这里的n应该换成X。
代码互评
互评同学:谢晔晖
代码图
优缺点
晔晖的代码是直接移动,运用2个循环把字母直接移动,而我的代码是先记录字符,再移动字符,在把已经移动的字母补到字符串上。
我更喜欢晔晖的代码,因为他的代码更加简单,他直接移动,显得更加简单,思路更加清晰,给人一种更厉害的感觉。
本周总结
指针:就是内存中的一个存储单元的地址,即内存单元的编号。
指针变量:是一个能存放地址值的变量。通过它存放的地址值能间接访问它所指向的变量。
指针可以在子函数里对一个数组进行改变,很方便。