本人C语言现已学习到结构体
本次所取习题来源于:教材(我支持版权的喔)
题目一
1,用指向指针的指针的方法对5个字符串排序后输出
我的答案如下:
#include<stdio.h>
#include<string.h>
void fun1(char *p[],int a);
main()
{
char *p[5]={"you","are","a","good","boy"};
int i,j;
fun1(p,5);
for(i=0;i<5;i++)
printf("%s\n",p[i]);
}
void fun1(char *p[],int a)
{
int i,j;
char*h;
for(i=0;i<a-1-i;i++)
for(j=0;j<a-1-i;j++)
if(strcmp(p[j],p[j+1])>0)
{
h=p[j];
p[j]=p[j+1];
p[j+1]=h;
}
}
本题涉及指针数组的内容,指针数组内的每一个元素都是一个指针变量,分别指向不同的字符串。
注意这里的字符串位于内存里的常量区,是无法改变的
同时我们也用到了一个字符公式,即strcmp(比较两个字符串的大小)(从首字符开始比较ASCII码)
strcmp(str1,str2)
str1 > str2 则返回值大于0;
str1 < str2 则返回值小于0
str1 = str2 则返回值等于0
最后通过改变数组内各元素的指向,就可以由小到大的将个支付串排列出来啦。
题目二
2,找到一个二维数组中的鞍点,即该位置上的元素在改行上最大,该列上最小,也可能没有鞍点。
我的答案如下:
#include<stdio.h>
#define n 3
main()
{
int i,j,a[][n]={4,5,6,1,2,3,7,8,9};
int(*q)[n];
int max,min,swap,x=0,y=0;
q=a;
for(i=0;i<n;i++)
{
j=0;
max=q[i][j];
for(j=0;j<n;j++)
if(q[i][j]>max)
{
max=q[i][j];
x=j;
}
min=q[0][x];
for(j=0;j<n;j++)
if(q[j][x]<min)
{
min=q[j][x];
y=j;
}
if(min==max)
{
printf("鞍点为%d\n",min);
printf("其坐标为第%d行,第%d列\n",y+1,x+1);
break;
}
}
if(min!=max)
printf("there are no point");
}
这道题太难受了,在没有完全理解指针的情况下,只能照葫芦画瓢的将它晦涩的描绘出来,而且在上课的时候我还没有完全答出来,看来是拿不到优秀了。
回去后一顿猛学,简单的修改了一下。
修改后:
#include<stdio.h>
#define n 3
void fun1(int (*q)[n]);
main()
{
printf("please input a 3*3 matrix\n");
int a[n][n];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
fun1(a);
}
void fun1(int (*q)[n])
{
int max,min,swap,x=0,y=0,i,j;
for(i=0;i<n;i++)
{
j=0;
max=q[i][j];
for(j=0;j<n;j++)
if(q[i][j]>max)
{
max=q[i][j];
x=j;
}
min=q[0][x];
for(j=0;j<n;j++)
if(q[j][x]<min)
{
min=q[j][x];
y=j;
}
if(min==max)
{
printf("鞍点为%d\n",min);
printf("其坐标为第%d行,第%d列\n",y+1,x+1);
break;
}
}
if(min!=max)
printf("there are no point");
}
可能起来还差不多,可是本人的思想还是发生了一定的变化的呀。
这里用到了一个行指针指向了我原来输入进去的数组,行指针状态之下,q[i][j]=a[i][j],但要注意这里的q!=a,因为一个是变量,一个是常量。
接下来的操作就简单了呀,按原思路就可以完美解决了。