题目1.
1.输入三个整数,按由小到大的顺序输出
注意指针输出数据要加*,就是输出的时候没有加*把地址输出了一堆乱码
题目2.
输入三个字符串,按由小到大的顺序输出
复习了strcmp和strcpy的用法
出现了一个问题:我定义了一个函数sort(char **p1,int m) 定义一个数组a[3][100] 一个指向数组的指针*p[3] 当我第一次调用sort的时候输入sort(p[3],3)报错,报错原因是候选函数不可行:第一个参数没有从“char*”到“char**”的已知转换 应当这样调用:sort(p,3)
因为我调用的是这个指向指针的指针 不是该指针所指向的指针(即数组)
题目3.
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换,写3个函数,1⃣️输入10个数2⃣️进行处理3⃣️输出10个数
下图是我写的实现处理的代码,没有实现交换的目的
输入
7 2 1 90 87 27 36 71 12 23
输出
12 2 1 90 87 27 36 71 7 -225771319 (lldb)
为什么?
void huan(int *p1,int a[],int m)
{
p1=a;
int min1,max1;
for(int i=0;i<m-1;i++)
{ for(int j=1;j<m;j++)
{
if(*(p1+j)<*(p1+i))
{
min1=j;
max1=i;
}
else
{
min1=i;
max1=j;
}
}
}
int t;
t=*(p1+min1);
*(p1+min1)=*p1;
*p1=t;
t=*(p1+max1);
*(p1+max1)=*(p1+10);
*(p1+10)=t;
}
查错运用了在纸上写出每步循环结果的方法 发现循环到最后记录的是最后两个输入的数据的大/小.
还有一个致命的问题,也是一串负数的来源:p1+10,应该是p1+9,a[10]最后一个数据应为a[9],天啊噜好粗心
这是改正之后的代码:
void huan(int *a,int n)
{
int min=*a,max=*a,max1,min1,temp,i;
for(i=0;i<n;i++)
{
if(min>*(a+i))
{min=*(a+i);min1=i;}
if(max<*(a+i))
{max=*(a+i);max1=i;}
}
if(min!=*a)
{
temp=*(a+min1);
*(a+min1)=*a;
*a=temp;
}
if(max!=*(a+9))
{
temp=*(a+max1);
*(a+max1)=*(a+9);
*(a+9)=temp;
}
其实找最大/最小数不是排序问题,根本用不到两次循环,一次就足够
4.有n个整数,使前面各数顺序后移m个位置,最后m个数变成最前面m个数,写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数
思路一:直接新开一个数组 计算好哪个数最后会移到哪位 将数移动到新开数组中的对应位数直接输出
这是我写出的代码,但是有错误
输入:1 2 3 4 5 6 7 8 9 10
3
输出:89101234560
void chang(int*p1,int*p2,int m,int n)//m为数字个数,n为后退位数
{
for(int i=0;i<m;i++)//需要移动的数字个数
{
if((n+i)<(m-1))//应改为<=并且去掉else的条件
{
*(p2+i+n)=*p1;
}
if((n+i)>(m-1))
{
*(p2+i+n-m)=*p1;
}
else
{ *p2=*p1;}/*出错原因:当计算到7时,6+3=9,满足else条件,直接等于a[0],其实是不对的,7应该位于a[9]位,在考虑运算条件时没有考虑周全,写else条件想表达的意思是如果移动位数等于数字个数的话,可以直接不用计算,数据挨个平移到b数组,若想实现这个条件,应该写为*(p2+i)=*p1;*/
p1++;
}
}
7去哪里了?(出错原因在代码中注释)
思路二:每次循环都记录最后一个数字,其余数字从倒数第二个开始各退一位
void chang(int*p1,int m,int n)//m为数字个数,n为后退位数
{
int last;
for(int i=0;i<n;i++)
{
last=*(p1+m-1);
for(int k=0;k<m-1;k++)
{
*(p1+m-1-k)=*(p1+m-2-k);
}
*p1=last;
}
}
5.有n个人围成一圈,顺序排号,从第一个人开始报数(从1-3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号
(1).需要两个计数器,计数器一计数是第几个人,计数器二计数报数
(2).注意计数器的清零
这是我写的错误函数,能计算2-6个人的正确数值,但是7以上就错误
为什么?
int chang(int*p1,int m)
{
int j=0,k=0;//j计数人数,k计数报数
while(1)
{
for(int i=0;i<m;i++)
{
if(*(p1+i)==0)
{
continue;
}
if(*(p1+i)!=0)
{
j=*(p1+i);
k++;
}
if(k==3)
{
*(p1+i)=0;
k=0;
}
}
if(k==1)
break;
}
return j;
}
因为忽略了最后剩下n个人,n人最后一人报数为1,达到while循环退出条件的情况
最终新增了一个记录退出人数的计数器,结果正确
int chang(int*p1,int m)
{
int j=0,k=0,w=0;//j计数人数,k计数报数,w记录退出人数
while(1)
{
for(int i=0;i<m;i++)
{
if(*(p1+i)==0)
{
w++;
}
if(*(p1+i)!=0)
{
j=*(p1+i);
k++;
}
if(k==3)
{
*(p1+i)=0;
k=0;
}
}
if(w==(m-1))
break;
w=0;
}
return j;
}
磨了半小时,不容易
6.写一函数,求一字符串的长度,在main函数里输入字符串,并输出其长度
int changgg(char*p1)
{
int k=0;
for(int i=0;;i++)
{
if(*(p1+i)=='\0')
{break;}
k++;
}
return k;
}
没什么好说的,注意输入前给数组清空,和最后的判断条件,空字符为'\0'
7.有一字符串,包含n个字符,写一函数,将此字符串中从第m个字符开始的全局字符复制成为另一个字符串
先在主函数里定义两个全为空字符的数组,用两个指针分别指向它们
void changgg(char*p1,char*p2,int m)
{
int k=0;
for(int i=0;;i++)
{
if(*(p1+i)=='\0')
{break;}
k++;
}
for(int e=0;e<k-m;e++)
{
*(p2+e)=*(p1+m+e);
}
}