NEFU锐格实验三[指针与数组]
扯犊子
恭喜来到指针的世界呵呵,有一说一我也不咋会(主要不清楚写出来的符不符合教学和考试要求),因为ACM训练的时候都用全局变量的来着(所以你们考试要是指针实在整不来就用全局变量吧)
不过全局变量和指针又不是上下级关系学了一个另外一个就不用了,所以还是好好学吧。
为了锻炼指针运用能力,我就尽量不用全局变量写一下,但是吧,有种奇怪的感觉:我不清楚题目希望我哪里运用一下指针hh。
知识点
题目 | 知识点 |
---|---|
5872 | 指针实现交换/排序 |
5875 | 指针实现数组的输入和数据过滤 |
5873 | 指针实现输入数据过滤 |
5876 | 指针代替字符串数组下标 |
5877 | 指针实现插入排序 |
5878 | 指针代替二维数组下标 |
5879 | 指针实现字符串截取 |
题目
5872
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
int main()
{
int a,b,c;
int *p1,*p2,*p3;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
p1=&a;p2=&b;p3=&c;
if(a>b)swap(p1,p2);
if(a>c)swap(p1,p3);
if(b>c)swap(p2,p3);
printf("%d %d %d\n",a,b,c);
}
return 0;
}
5875
#include <stdio.h>
#include <stdlib.h>
#define N 105
void solve(int *p,int n,int x)
{
for(int i=0;i<n;i++)
if(*(p+i)>=x)printf("%d ",*(p+i));
printf("\n");
}
int main()
{
int array[N];
int n,x;
int *p=array;
while(scanf("%d %d",&n,&x)!=EOF)
{
for(int i=0;i<n;i++)scanf("%d",p+i);
solve(p,n,x);
}
return 0;
}
5873
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 105
bool check(int *p,int min,int max)
{
if(*p>=min&&*p<=max)return 1;
return 0;
}
int main()
{
int input;
int n,min,max;
int *p=&input;
while(scanf("%d %d %d",&n,&min,&max)!=EOF)
{
bool flag=1;
for(int i=0;i<n;i++)
{
scanf("%d",p);
if(check(p,min,max))
{
printf("1 %d\n",*p);
flag=0;
break;
}
}
if(flag)printf("0 %d\n",input);//这里可以知道input和*p是等效的,当然这么写是为帮助各位熟悉指针,也可以只用一个
}
return 0;
}
5876
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 105
int main()
{
char str[N];
while(scanf("%s",str)!=EOF)
{
int num=0;
bool f=0;//标记正负
char *p=str;//字符串数组首地址
while(*p!='\0')
{
if(*p>='0'&&*p<='9')num=num*10+*p-'0';
else if(*p=='-')f=1;
else break;//遇到其他字符跳出
++p;
}
num=f?(-num):num;
printf("%d\n",num);
}
return 0;
}
5877
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 105
int main()
{
double array[N];
double x;
int n;
while(scanf("%d",&n)!=EOF)
{
scanf("%lf",&x);
for(int i=0;i<n;i++)scanf("%lf",&array[i]);
double *p=array;
int i;//定义在for外面方便标记
for(i=0;i<n;i++)
{
if(*(p+i)<x)printf("%.2lf ",*(p+i));
else
{
printf("%.2lf ",x);
break;
}
}
for(;i<n;i++)printf("%.2lf ",*(p+i));
printf("\n");
}
return 0;
}
5878
这个比较难,建议查阅资料了解一下行指针和列指针
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 15
void solve(double a[][N],int n,int m)
{
double (*p)[N]=&a[0];//行指针,指向第0行
double ans=0;
int x,y;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(*(*(p+i)+j)>ans)//*(*(p+i)+j)表示第i行j列元素
{
ans=*(*(p+i)+j);
x=i;y=j;
}
}
}
printf("%.2lf %d %d\n",ans,x+1,y+1);
}
int main()
{
double a[N][N];
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%lf",&a[i][j]);
solve(a,n,m);
}
return 0;
}
5879
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 105
void solve(char str[],char ans[],int n,int m)
{
char *p=str;
char *q=ans;
for(int i=n-1;i<m;i++)
{
*q=*(p+i);
++q;
}
}
int main()
{
int n,m;
char str[N];
char ans[N];
while(scanf(" %s %d %d",str,&n,&m)!=EOF)
{
memset(ans,0,sizeof ans);//清空ans
solve(str,ans,n,m);
printf("%s\n",ans);
}
return 0;
}