当前位置:   article > 正文

浙江大学 PTA 函数 第六部分 求最大值及其下标 将数组中的数逆序存放 找出不是两个数组共有的元素 矩阵运算 方阵循环右移 计算天数 查找指定字符  字符串逆序_7-2 求最大值及其下标 分数 20 作者 季江民 单位 浙江大学 找出给定的n个数中的最

7-2 求最大值及其下标 分数 20 作者 季江民 单位 浙江大学 找出给定的n个数中的最

 

练习7-2 求最大值及其下标 (20 分)

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

输入格式:

输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

输入样例:

  1. 6
  2. 2 8 10 1 9 10

输出样例:

10 2
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*函数:找出数组中的最大值及其下标*/
  4. void find_max(int *p,int n)
  5. {
  6. int i=0,max_f,sign_d;
  7. max_f=*p;//假设数组的首位为最大值并记录下标
  8. sign_d=0;
  9. while(++i<n)//遍历数组
  10. if(*(p+i)>max_f)//分别与最大值 max_f 比较
  11. {
  12. max_f=*(p+i);//找到更大值 赋给 max_f
  13. sign_d=i;//记录最大值下标
  14. }
  15. printf("%d %d\n",max_f,sign_d);//输出结果
  16. }
  17. /*函数:获取 n 个值的数组*/
  18. void input_sz(int *p,int n)
  19. {
  20. printf("Input %d integer:\n",n);
  21. int i,j;
  22. for(i=0;i<n;i++)
  23. {
  24. scanf("%d",&j);
  25. *(p+i)=j;
  26. }
  27. }
  28. int main(int argc, char *argv[]) {
  29. int n;
  30. printf("input a positive integer: ");
  31. scanf("%d",&n);//读入正整数 n
  32. int a[n];//创建数组
  33. input_sz(a,n);//调用函数
  34. find_max(a,n);//调用函数
  35. system("pause");
  36. return 0;
  37. }

练习7-3 将数组中的数逆序存放 (20 分)

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入格式:

输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

输入样例:

  1. 4
  2. 10 8 1 2

输出样例:

2 1 8 10
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*函数:逆序*/
  4. void Reverse_order(int *p,int n)
  5. {
  6. int i=0,temp;
  7. while(i<n)//遍历数组,首尾逐一调换
  8. {
  9. temp=*(p+i);
  10. *(p+i)=*(p+n-1);
  11. *(p+n-1)=temp;
  12. i++;//首部后移
  13. n--;//尾部前移
  14. }
  15. }
  16. /*函数:获取数组*/
  17. void input_sz(int *p,int n)
  18. {
  19. //printf("Input %d integer:\n",n);
  20. while(n-->0)//循环输入 n 项
  21. scanf("%d",&*(p++));
  22. }
  23. /*函数:输出数组*/
  24. void output_sz(int *p,int n)
  25. {
  26. while(n-->1)//循环输出前 n-1
  27. printf("%d ",*(p++));
  28. printf("%d",*p);//输出最后 1
  29. printf("\n\n");//完成输出
  30. }
  31. int main(int argc, char *argv[])
  32. {
  33. //printf("input a positive integer: ");
  34. int n;
  35. scanf("%d",&n);//读入正整数 n
  36. int a[n];//创建数组
  37. input_sz(a,n);//调用函数
  38. Reverse_order(a,n);//调用函数
  39. output_sz(a,n);//调用函数
  40. system("pause");
  41. return 0;
  42. }

练习7-4 找出不是两个数组共有的元素 (20 分)

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

  1. 10 3 -5 2 8 0 3 5 -15 9 100
  2. 11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int Count=0;//全局变量记录输出次数
  4. /*查找元素是否为数组中的元素*/
  5. int compare_zish(int x,int *pa,int n)
  6. {
  7. int i,count_s=0;//每次循环,计数器归零
  8. for(i=0;i<n;i++) //遍历数组 a[n] 之前的元素
  9. if(*(pa+i)==x) //元素已经存在于数组 a 中
  10. {
  11. count_s++;//已经存在,找计数器 +1
  12. break;//进入下次循环,取消重复比较
  13. }
  14. return count_s;
  15. }
  16. int compare_shuchu(int pa)
  17. {
  18. if(Count==0) //首次输出
  19. printf("%d",pa);
  20. else //非首次输出,先输出 '空格'
  21. printf(" %d",pa);
  22. Count++; //输出计数器 +1
  23. }
  24. /*查找不是两数组共有的元素*/
  25. void find_shuzu(int *pa,int na,int *pb,int nb)
  26. {
  27. int i;
  28. for(i=0;i<na;i++)//数组 a 的元素,不在数组 b 中
  29. if(!compare_zish(*(pa+i),pa,i)&&!compare_zish(*(pa+i),pb,nb))
  30. compare_shuchu(*(pa+i));
  31. }
  32. /*函数:获取数组*/
  33. void input_sz(int *p,int n)
  34. {
  35. int i;
  36. for(i=0;i<n;i++)//循环输入 n 项
  37. scanf("%d",&*(p+i));
  38. }
  39. /*主函数*/
  40. int main(int argc, char *argv[])
  41. {
  42. int a[20],b[20];//创建数组
  43. int na;
  44. scanf("%d",&na);//读入正整数 n
  45. input_sz(a,na);//调用输入函数
  46. int nb;
  47. scanf("%d",&nb);//读入正整数 n
  48. input_sz(b,nb);//调用输入函数
  49. /*调用函数,顺序输出数组 a 中元素不是两数组共有的元素*/
  50. /*自身元素相同,不重复查找*/
  51. find_shuzu(a,na,b,nb);
  52. find_shuzu(b,nb,a,na);
  53. printf("\n\n");//输出结束,换行
  54. return 0;
  55. }

练习7-7 矩阵运算 (20 分)

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

  1. 4
  2. 2 3 4 1
  3. 5 6 1 1
  4. 7 1 8 1
  5. 1 1 1 1

输出样例:

35
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*函数:计算*/
  4. int js_sz(int **p,int n)
  5. {
  6. int i,j,result=0;
  7. for(i=0;i<n-1;i++)//双层循环遍历二位数组,i<n-1 最后一行
  8. for(j=0;j<n-1;j++)//j<n-1 去掉最后一列
  9. if(j+i+1!=n)//不在反对角线的数值则求和
  10. result+=*(*(p+i)+j);
  11. printf("%d\n",result);//循环完毕,输出结果
  12. }
  13. /*函数:获取数组*/
  14. int input_sz(int **p,int n)
  15. {
  16. int i,j;
  17. for(i=0;i<n;i++)//循环输入 n 项
  18. for(j=0;j<n;j++)
  19. scanf("%d",&*(*(p+i)+j));
  20. return n;
  21. }
  22. /*函数:输出数组*/
  23. /****输出函数不在练习要求的范围内****
  24. void output_sz(int **p,int n)
  25. {
  26. int i,j;
  27. for(i=0;i<n;i++)
  28. for(j=0;j<n;j++)//循环输出前 n-1
  29. if(j==n-1)
  30. printf("%2d\n",*(*(p+i)+j));
  31. else
  32. printf("%2d ",*(*(p+i)+j));
  33. printf("\n");//完成输出
  34. }
  35. ****输出函数不在练习要求的范围内****/
  36. int main(int argc, char *argv[])
  37. {
  38. int i,n;
  39. scanf("%d",&n);//读入正整数 n
  40. int a[n][n];//创建数组
  41. /*二级指针和二位数组并不是对应关系,需要动态申请二位数组对应行数的指针数组*/
  42. int **p=NULL;//定义二级指针
  43. p=(int **)malloc(sizeof(int *)*n);//要访问的数组有 n 行,所以申请 n 个一维指针变量。
  44. for(i = 0; i < n; i ++)
  45. {
  46. p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。
  47. }
  48. input_sz(p,n);//调用输入函数,获取数组 a
  49. //output_sz(p,n);//调用输出函数 ,输出数组 a
  50. js_sz(p, n);/*调用函数,计算*/
  51. // printf("\n\n");//输出结束,换行
  52. // system("pause");
  53. free(p);//释放为p申请的内存
  54. return 0;
  55. }

练习7-8 方阵循环右移 (20 分)

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

输入样例:

  1. 2 3
  2. 1 2 3
  3. 4 5 6
  4. 7 8 9

代码(扩展了,循环左移)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*函数:输出数组*/
  4. void output_sz(int **p,int n)
  5. {
  6. int i,j;
  7. for(i=0;i<n;i++)//循环输出
  8. for(j=0;j<n;j++)
  9. if(j==n-1)
  10. printf("%2d \n",*(*(p+i)+j));//行末换行
  11. else
  12. printf("%2d ",*(*(p+i)+j));
  13. //printf("\n");//完成输出,换行
  14. }
  15. /*函数:循环移动*/
  16. int yid_sz(int **p,int m,int n)
  17. {
  18. int i,j,k,t;
  19. for(i=0;i<n;i++)//行循环
  20. {
  21. for(j=0;j<m;j++)//移动次数控制
  22. {
  23. /******循环左移******/
  24. /* k=0;
  25. t=p[i][k];
  26. for(;k<n;k++)
  27. p[i][k]=p[i][k+1];
  28. p[i][n-1]=t;
  29. */
  30. /******循环右移******/
  31. /**/ k=n-1;
  32. t=*(*(p+i)+k);
  33. for(;k>0;k--)
  34. *(*(p+i)+k)=*(*(p+i)+k-1);
  35. p[i][0]=t;
  36. /**/
  37. }
  38. }
  39. }
  40. /*函数:获取数组*/
  41. int input_sz(int **p,int n)
  42. {
  43. int i,j;
  44. for(i=0;i<n;i++)//循环输入 n*n 项
  45. for(j=0;j<n;j++)
  46. scanf("%d",&*(*(p+i)+j));
  47. return n;
  48. }
  49. /*主函数*/
  50. int main(int argc, char *argv[])
  51. {
  52. int i,m,n;
  53. scanf("%d%d",&m,&n);//读入正整数 n
  54. int a[n][n];//创建数组
  55. /*二级指针和二位数组并不是对应关系,需要动态申请二位数组对应行数的指针数组*/
  56. int **p=NULL;//定义二级指针
  57. p=(int **)malloc(sizeof(int *)*n);//要访问的数组有 n 行,所以申请 n 个一维指针变量。
  58. for(i = 0; i < n; i ++)
  59. {
  60. p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。
  61. }
  62. input_sz(p,n);//调用输入函数,获取数组 a
  63. // output_sz(p,n);
  64. yid_sz(p,m,n);/*调用函数,计算*/
  65. output_sz(p,n);//调用输出函数 ,输出数组 a
  66. // printf("\n\n");//输出结束,换行
  67. // system("pause");
  68. free(p);
  69. return 0;
  70. }

练习7-9 计算天数 (15 分)

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

代码:(除题目要求用 '/' 分隔外,实现在英文状态下,任意非数字字符分隔)

 

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. /*非闰年月份日期计算*/
  5. int month_d(int i)
  6. {
  7. //默认为非闰年,按照 228 天计算当前月之前累积天数
  8. int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  9. int sum=0;
  10. while(--i>0) sum+=a[i];
  11. return sum;
  12. }
  13. /*增加闰年天数*/
  14. int year_r(int year)
  15. {
  16. return (year%4==0&&year%100!=0||year%400==0)>0?1:0;//闰年 1 非闰年 0
  17. }
  18. /*函数:字符串按分隔符转化 年 月 日 为数字*/
  19. //英文输入法下任意非数字字符分隔
  20. int ymd_sz(char *p,int *qd)
  21. {
  22. while(*p++!='\0')
  23. if(*p-'0'>=0&&*p-'0'<=9)
  24. *qd=*qd*10+(*p-'0');
  25. else
  26. *qd++;
  27. }
  28. /*输入函数*/
  29. void input_sz(char *p)
  30. {
  31. char c,*pc;
  32. pc=p;
  33. printf("Input a data (yyyy/mm/dd)\n");
  34. //输入结束,回车,在新的一行 输入Ctrl+z 结束输入
  35. printf("finished < Ctrl+z >.\n");
  36. while((c=getchar())!=EOF)
  37. *pc++=c;
  38. }
  39. /*主函数*/
  40. int main(int argc, char *argv[])
  41. {
  42. char *p,ap[11]={0}; //定义字符串及指针,存放输入字符串
  43. p=ap;
  44. int *qd,bqd[3]={0};//定义数组及指针,存放 年 月 日
  45. qd=bqd;
  46. input_sz(p);//调用输入函数,获取字符串 a
  47. ymd_sz(p,qd);//字符串转化
  48. printf("%d\n",year_r(qd[0])+month_d(qd[1])+qd[2]);//输出天数
  49. system("pause");
  50. return 0;
  51. }

练习7-10 查找指定字符 (15 分)

本题要求编写程序,从给定字符串中查找某指定的字符。

输入格式:

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。

输出格式:

如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。

输入样例1:

  1. m
  2. programming

输出样例1:

index = 7

输入样例2:

  1. a
  2. 1234

输出样例2:

Not Found
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. /*函数:查找字符,记录最大下标*/
  5. int find_sz(char mac,char *p)
  6. {
  7. int i=0,j=0;
  8. while(*(p+i)!='\0') //遍历字符串
  9. {
  10. if(*(p+i)==mac)//找到字符
  11. j=i;//记录下标
  12. i++;
  13. }
  14. return j;
  15. }
  16. /*输出函数*/
  17. void output_sz(int n)
  18. {
  19. if(n>0)
  20. printf("index = %d\n",n);
  21. else
  22. printf("Not Found\n");
  23. }
  24. /*输入函数*/
  25. void input_sz(char *p)
  26. {
  27. //printf("Input a string:\n");
  28. gets(p);
  29. }
  30. /*主函数*/
  31. int main(int argc, char *argv[])
  32. {
  33. char mac,*p,ap[81]={0};
  34. p=ap;
  35. //printf("Input a char for find: ");
  36. mac=getchar();//输入要查找的字符
  37. fflush(stdin);//清除缓存,准备接收字符串
  38. input_sz(p);//调用输入函数,获取字符串 ap
  39. output_sz(find_sz(mac,p));//输出查找字符结果
  40. //system("pause");
  41. return 0;
  42. }

练习7-11 字符串逆序 (15 分)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:

Hello World!

输出样例:

!dlroW olleH
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. /*函数:查找字符,记录最大下标*/
  5. void Reverse_order(char *p,int n)
  6. {
  7. int i=0,j;
  8. j=n-1;
  9. char cp;
  10. while(i<j) //遍历字符串
  11. {
  12. cp=*(p+i);
  13. *(p+i)=*(p+j);
  14. *(p+j)=cp;
  15. j--;
  16. i++;
  17. }
  18. }
  19. /*输出函数*/
  20. void output_sz(char *p)
  21. {
  22. puts(p);
  23. }
  24. /*输入函数*/
  25. void input_sz(char *p)
  26. {
  27. //printf("Input a string:\n");
  28. gets(p);
  29. }
  30. /*主函数*/
  31. void main(int argc, char *argv[])
  32. {
  33. char *p,ap[81]={0};
  34. p=ap;
  35. fflush(stdin);//清除缓存,准备接收字符串
  36. input_sz(p);//调用输入函数,获取字符串 ap
  37. Reverse_order(p,strlen(ap));//调用函数,逆序字符串
  38. output_sz(p);//输出逆序字符串
  39. //system("pause");
  40. }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/800676?site
推荐阅读
相关标签
  

闽ICP备14008679号