51 使用函数和指针对数据位置进行调整
输入10个整数,用其中最小的数与第一个数对换,用其中最大的数与最后一个对换,需要写出指定的三个函数完成,所有函数的参数均用指针。
#include <stdio.h>
#include <stdlib.h>
void input(int a[]);
void func(int a[]);
void output(int a[]);
int main()
{
int a[10];
input(a);
func(a);
output(a);
system("Pause");
return 0;
}
void input(int a[])
{
int i;
for(i=0;i<10;i++)
scanf("%d",a+i);
}
void output(int *p)
{
int i;
for(i=0;i<10;i++)
printf("%5d",*p++);
}
void func(int *p)
{
int maxv=p[0],maxi,minv=p[0],mini;
int i,t;
for(i=1;i<10;i++)
{
if(maxv<*(p+i))
{
maxv=*(p+i);
maxi=i;
}
if(minv>*(p+i))
{
minv=*(p+i);
mini=i;
}
}
if(maxi!=9)
{
t=p[9];
p[9]=p[maxi];
p[maxi]=t;
}
if(mini!=0)
{
t=p[0];
p[0]=p[mini];
p[mini]=t;
}
if(maxi==9&&mini==0)
{
t=p[maxi];
p[maxi]=p[mini];
p[mini]=t;
}
}
52 编写求字符串长度的函数
编写一个求字符串长度的函数(参数用指针),在主函数中输入字符串,并输出其长度。
#include <stdio.h>
#include <stdlib.h>
int size(char *);
int main()
{
char str[80];
gets(str);
printf("%d\n",size(str));
system("Pause");
return 0;
}
int size(char *s)
{
int i=0;
while(*s++!=0)
i++;
return i;
}
53 编写将矩阵转置的函数
编写一个函数(参数用指针)将一个3×3矩阵转置。
#include <stdio.h>
#define M 2 //此处可以改变数组大小
#define N 3
void trans(int (*a)[N],int(*b)[80]);
int main()
{
int a[M][N],b[80][80];
int *p1;
int i,j,t;
p1=a[0];
for(i=0;i<M;i++) //输入
for(j=0;j<N;j++)
scanf("%d",p1++);
p1=*a;
trans(a,b);
for(i=0;i<N;i++) //输出
{
for(j=0;j<M;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return 0;
}
void trans(int (*a)[N],int(*b)[80]) //转置
{
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
*(b[j]+i)=*(a[i]+j);
}
54 编写比较字符串的函数
#include <stdio.h>
#define M 80
#define N 80
int strcmp(char *s1,char *s2);
int main()
{
char a[M],b[N];
int x;
gets(a); //输入
gets(b);
x=strcmp(a,b);
puts(a);
if(x!=0)
{
if(x<0)
printf("< ");
else
printf("> ");
}
else
printf("= ");
puts(b);
return 0;
}
int strcmp(char *s1,char *s2) //比较
{
while(*s1&&*s2&&(*s1==*s2))
{
s1++;
s2++;
}
return *s1 - *s2;
}
55 编写判断字符串是否为回文的函数
#include <stdio.h>
#define N 5 //可在此处修改字符串长度
int fun(char *a);
int main()
{
char a[N];
gets(a); //输入字符串
int x;
x=fun(a);
if(x==1) //输出
printf("YES");
else
printf("NO");
return 0;
}
int fun(char *a) //判断是否为回文数
{
int i,x;
for(i=0;i<N;i++)
{
if(*(a+i)==*(a+N-1-i))
x=1;
else
{
x=0;
break;
}
}
return x;
}
56 编写删除相应位置特定字符的函数
编写删除除在前导位置外的其他的‘*’号的函数,不得使用C语言提供的字符串函数。
#include <stdio.h>
#include <conio.h>
void fun(char *a,char *h,char *p);
int main()
{
char a[80];
char *t,*f;
gets(a); //输入
t=f=a;
while(*t)t++; //为了保留前面的*
while(*f=='*')f++; //计算总共有多少个字符
fun(a,f,t);
puts(a); //输出
return 0;
}
void fun(char *a,char *h,char *p) //删除字符
{
int i=0;
char *k=a; //储存
while (k<h) //输出最前面的*
{
a[i]=*k;
k++;
i++;
}
while(k<p) //删除字符
{
if(*k!='*')
{
a[i]=*k;
i++;
}
k++;
}
while (*k)
{
a[i]=*k;
i++;
k++;
}
a[i]='\0'; //字符串结束
}
57 运行程序,了解变量的指针和指针变量的概念。
# include <stdio.h>
int main()
{
int a=5,b=5,*p;
p=&a;
printf("%d,%ud\n",a,p);
*p=8;
printf("%d,%ud\n",a,p);
p=&b;
printf("%d,%ud\n",a,p);
b=10;
printf("%d,%ud\n",a,p);
return 0;
}
58 运行程序,观察对应变量变化
# include <stdio.h>
int main()
{
int i,*p,s=0,a[5]={5,6,7,8,9};
p=a;
for(i=0;i<5;i++,p++)
s+=*p;
printf("\n s=%d",s);
return 0;
}
// 程序的功能是求出一维数组a[5]中各项的和。
// p指向&a[0]。
59 运行程序,掌握通过指针变量引用数组元素的各种方法
#include <stdio.h>
int main()
{
int i,s1=0,s2=0,s3=0,s4=0,*p,a[5]={1,2,3,4,5};
p=a;
for(i=0;i<5;i++)
s1+=p[i];
for(i=0;i<5;i++)
s2+=*(p+i);
for(p=a;p<a+5;p++)
s3+=*p;
p=a;
for(i=0;i<5;i++)
s4+=*p++;
printf("\n s1=%d,s2=%d,s3=%d,s4=%d",s1,s2,s3,s4);
return 0;
}
60 编写逆序排列数据的函数
编写逆序排列数据(要求用指针实现)的函数,并根据要求编写主函数。
#include <stdio.h>
#define N 10
void fun(int *a);
int main()
{
int a[N];
int *p=a;
int i;
for(i=0;i<N;i++) //输入
scanf("%d",p++);
p=a;
fun(a);
for(i=0;i<N;i++) //输出
printf("%4d",*p++);
return 0;
}
void fun(int *a) //倒序
{
int i,t;
for(i=0;i<N/2;i++)
{
t=*(a+i);
*(a+i)=*(a+N-1-i);
*(a+N-1-i)=t;
}
}