[关闭]
@Arbalest-Laevatain 2018-05-21T15:32:10.000000Z 字数 4094 阅读 1043

Anyview 第八章 指针

C语言


/******

【习题8.011】请编写函数func(char s[], char t[], int n),

由数组s中长度为n的字符序列构造其逆序列,并存储在数组t中。
例如,由给定字符序列s="are"求得逆序列t="era";由s="time"
求得t="emit"。
******/

  1. void func(char s[], char t[], int n)
  2. /* 数组s的前n个元素存放给定的字符序列,
  3. 数组t的前n个元素存放s的逆序列。
  4. 注意:数组的下标从0开始。
  5. */
  6. {
  7. int i;
  8. for (i=0;i<n;i++)
  9. {
  10. *(t+n-i-1)=*(s+i);
  11. }
  12. }

/******

【习题8.012】请编写函数func(char*s, char *t),由字符

串s构造其逆串t。例如,由给定串s="are"求得逆串t="era";
由s="time"求得t="emit"。
******/

  1. void func(char *s, char *t)
  2. /* s是给定字符串的起始地址,
  3. t是求得s的逆串的起始地址
  4. */
  5. {
  6. int i=0,j;
  7. while (*s)
  8. {
  9. i++;
  10. s++;
  11. }
  12. printf("%c\n",*s);
  13. for (j=0;j<i;j++)
  14. {
  15. *(t+j)=*(s-1-j);
  16. }
  17. }

/******

【习题8.015】对长度为n的字符串s1,除首、尾字符外,将

其余字符按ASCII码降序排列,组合成一个新的字符串s2。
******/

  1. void func(char *s1, char *s2, int n)
  2. /* s1为字符串的起始地址,
  3. s2为新字符串的起始地址,
  4. n为字符串的长度。
  5. 要求:s1串不能发生改变,
  6. s2串存放新的字符串。
  7. */
  8. {
  9. int i,j;
  10. *s2=*s1;
  11. *(s2+n-1)=*(s1+n-1);
  12. for (i=1;i<n-1;i++)
  13. {
  14. *(s2+i)=*(s1+i);
  15. }
  16. for (i=1;i<n-1;i++)
  17. {
  18. for (j=1;j<n-1-i;j++)
  19. {
  20. if (*(s2+j)<=*(s2+j+1))
  21. {
  22. char t=*(s2+j+1);
  23. *(s2+j+1)=*(s2+j);
  24. *(s2+j)=t;
  25. }
  26. }
  27. }
  28. }

/******

【习题8.016】对字符串s1,除首、尾字符外,将其余字符

按ASCII码降序排列,组合成一个新的字符串s2。
******/

  1. void func(char *s1, char *s2)
  2. {
  3. int i,j,n=0;
  4. char*s=s1;
  5. while (*s1)
  6. {
  7. n++;
  8. s1++;
  9. }
  10. s1=s;
  11. *s2=*s1;
  12. *(s2+n-1)=*(s1+n-1);
  13. for (i=1;i<n-1;i++)
  14. *(s2+i)=*(s1+i);
  15. for (i=1;i<n-1;i++)
  16. {
  17. for (j=1;j<n-1-i;j++)
  18. {
  19. if (*(s2+j)<=*(s2+j+1))
  20. {
  21. char t=*(s2+j+1) ;
  22. *(s2+j+1)=*(s2+j);
  23. *(s2+j)=t;
  24. }
  25. }
  26. }
  27. }

/******

【习题8.018】以字符串s第m(>=0)个字符开始的所有字符,

按升序的次序构成字符串t。
******/

  1. void substr(char *s, int m, char *t)
  2. /* s为字符串的起始地址,
  3. m>=0,
  4. t为新字符串的起始地址,
  5. 注意:字符串尾字符之后跟随着一个结束符‘\0’,
  6. 即ASCII码为0的字符,结束符不属于字符串。
  7. 要求:s串不能发生改变,
  8. t串存放新的字符串。
  9. */
  10. {
  11. do
  12. {
  13. *t=*s;
  14. s++;
  15. t++;
  16. } while (*s!='\0');
  17. }

/******

【习题8.020】在字符串s中查找字符c,如果找到,返回字符c

首次出现在字符串s中的位置指针;否则,返回空指针NULL。
******/

  1. char *match(char *s, char c)
  2. /* 返回字符在串s中首次出现的位置指针 */
  3. {
  4. int n=0;
  5. do
  6. {
  7. if (*s==c)
  8. return s;
  9. s++;
  10. n++;
  11. } while (*s!='\0');
  12. s=NULL;
  13. return s;
  14. }

/******

【习题8.033】编写函数,计算年份year中第yearday天相应的月

和日。例如,调用函数month_day(2000,61,&m,&d)之后,m=3,
d=1,即2000年的第61天是3月1日。
******/

  1. int month_day(int year, int yearday, int *pmonth, int *pday)
  2. /* year是年,
  3. yearday是天数,
  4. 若year和yearday合理,
  5. 则*pmonth和*pday是计算得出的月和日,函数返回1;
  6. 否则,函数返回0。
  7. */
  8. {
  9. int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  10. int i,z,y,flag=0;
  11. int *p1,*p2;
  12. if (year>0 && yearday>0)
  13. {
  14. if ((year%4==0 && year %100 !=0) || (year%400==0))
  15. {
  16. flag=1;
  17. }
  18. if (flag)
  19. {
  20. month[1]+=1;
  21. if (yearday>366)
  22. return 0;
  23. }
  24. else
  25. {
  26. if (yearday>365)
  27. return 0;
  28. }
  29. // z=yearday/31;
  30. i=0,z=0;
  31. y=yearday;
  32. while (y>0)
  33. {
  34. y-=month[i];
  35. i++;
  36. z++;
  37. }
  38. y+=month[i-1];
  39. if (y==0)
  40. {
  41. z-=1;
  42. y=month[z-1];
  43. }
  44. *pmonth=z;
  45. *pday=y;
  46. return 1;
  47. }
  48. return 0;
  49. }

/******

【习题8.044】请编写一个函数func,通过略去非数字字符,将字符串

s转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
******/

  1. long func(char *s)
  2. /* s是一个数字字符串的地址,
  3. 函数返回值为由s含有的数字字符转换得到的数(包含正负数情况)
  4. */
  5. {
  6. int i=0,flag=0,t=1;
  7. long n=0;
  8. char c,*tou;
  9. tou=s;
  10. while (*s!='\0')
  11. {
  12. c=*s;
  13. if (c=='-' && s==tou)
  14. {
  15. flag=1;
  16. *s++;
  17. continue;
  18. }
  19. if (c>='0' && c<='9')
  20. {
  21. n=(c-'0')+n*10;
  22. *s++;
  23. i++;
  24. }
  25. else
  26. {
  27. *s++;
  28. continue;
  29. }
  30. }
  31. if (flag)
  32. n=-n;
  33. return n;
  34. }

/******

【习题8.105】请编写一个函数findmax(int []s, int n),返回数组s中

n(>0)个整数中的最大值。注意:要求在函数中采用指针(而不是下标)来
处理数组元素。
******/

  1. int findmax(int s[], int n)
  2. /* 返回s中n(>0)个整数的最大值。
  3. 注意:要求在函数中采用指针(而不是下标)来处理数组元素。
  4. */
  5. {
  6. int max=*s;
  7. int *s0;
  8. for (s0=s+1;s0<s+n;s0++)
  9. {
  10. if (max<*s0)
  11. max=*s0;
  12. }
  13. return max;
  14. }

/******

【习题8.124】请编写一个函数min3adj(int s[], int n),数组s中

有n(>0)个整数,返回在s中相邻三个数的和中的最小值。
******/

  1. int min3adj(int s[], int n)
  2. /* 数组s含n(>=3)个整数,
  3. 返回在s中相邻三个数的和中的最小值。
  4. */
  5. {
  6. int i,j,k;
  7. int sum;
  8. sum=*(s+0)+*(s+1)+*(s+2);
  9. for (i=0,j=1,k=2;i<j<k;i++,j++,k++)
  10. {
  11. if (k==n)
  12. break;
  13. if (sum>*(s+i)+*(s+j)+*(s+k))
  14. sum=*(s+i)+*(s+j)+*(s+k);
  15. }
  16. return sum;
  17. }

/******

【习题8.203】编写函数,返回指针参数s所指向的字

符串的长度。例如,若该串为"I am a student.",
则函数返回值是15。注意:字符串结束符是'\0',不
计入长度。不允许调用库函数strlen()。
******/

  1. int func(char *s)
  2. {
  3. int n=0;;
  4. while (*s)
  5. {
  6. n++;
  7. s++;
  8. }
  9. return n;
  10. }

/******
【习题8.222】编写函数,复制指针参数s指向的字
符串到由指针参数t已经指向的存储区域。注意:
字符串结束符是'\0',不允许调用字符串库函数。
******/
void func(char *s, char *t)
{
while (*s)
{
*t=*s;
s++;
t++;
}
}

  1. /**********
  2. ##【习题8.231】编写函数,由指针参数s指向的字
  3. 符串中第i个字符开始的n个字符构造一个字符串,
  4. 并存储到到由指针参数t已经指向的存储区域。例
  5. 如,若s指向的串为"I am a student.",i=8,
  6. n=7,则t指向的串为"student"。注意:字符串
  7. 结束符是'\0',不允许调用字符串库函数。
  8. **********/
  9. ```c
  10. void func(char *s, int i, int n, char *t)
  11. {
  12. int a;
  13. for (a=i-1;a<i+n-1;a++)
  14. {
  15. *t=*(s+a);
  16. t++;
  17. }
  18. }
  19. <div class="md-section-divider"></div>

/******

【习题8.246】假设字符串中每个连续字母序列称为

“单词”。编写函数,在字符串s中顺序获取每个单
词,依次存入w指示的二维数组,并返回单词个数。
例如,若有s="I am a student",则w={"I","am",
"a","student"}。注意:字符串结束符是'\0',不
允许调用字符串库函数。
******/

  1. int func(char *s, char (*w)[10])
  2. {
  3. }
  4. <div class="md-section-divider"></div>

/******

【习题8.285】编写函数,依次对p指示的二维数组的

每一行元素值求和,并存入数组sum中。例如,若二维
数组的元素值依次为
{{45,38,-6,78},{34,48,70,4},{-9,0,4,20}},
则sum[0..2]={155,156,15}。
******/

  1. void func(int (*p)[4], int n, int *sum)
  2. /* 求二维数组中各行元素值的和 */
  3. {
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注