当前位置:   article > 正文

C语言 基于数组类型变量的程序设计(PTA)_c语言输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

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

一、实验目的

1.掌握数组的定义、赋值和输入输出的方法。

2.学习用数组实现相关的算法(如排序、求最大和最小值、对有序数组的插入等)。   

3.掌握C语言中字符数组和字符串处理函数的使用。

4.掌握在字符串中删除和插入字符的方法。

二、实验内容

1、求最大值及其下标

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

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

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

2、冒泡法排序

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。

输入格式:输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。

输出格式:在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

3、数组循环左移

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

4、将数组中的数逆序存放

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

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

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

5、查找整数

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:在一行中输出X的位置,或者“Not Found”。

6、矩阵运算

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

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

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

7、求矩阵各行元素之和

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

输入格式:输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。

输出格式:每行输出对应矩阵行元素之和。

8、字符串逆序

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

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

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

9、字符串转换成十进制整数

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:输入在一行中给出一个以#结束的非空字符串。

输出格式:在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

10、字符串循环左移

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:在一行中输出循环左移N次后的字符串。

三、实验源程序及结果截图

1、求最大值及其下标

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,i,j,max,a[10];
  5. do
  6. {
  7. scanf("%d",&n);
  8. }while(n <= 1 || n > 10); //限制输入的n的范围
  9. for(i = 0;i < n;i++)
  10. {
  11. scanf("%d",&a[i]); //通过循环输入数组a的初值
  12. }
  13. max = a[0]; //令max初值等于数组a的第一个值
  14. j = 0; // j表示max的值对应的数组a内的下标
  15. for(i = 0;i < n;i++)
  16. {
  17. if(a[i] > max)
  18. {
  19. max = a[i]; //通过循环使数组a的每一个数都与max进行比较,
  20. j = i; 当a[i]>max时将该值赋给max,并且将其下标i赋
  21. } 给j
  22. }
  23. printf("%d %d",max,j); //输出最大值及其对应的下标
  24. return 0;
  25. }

 

2、冒泡法排序

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int k,n,i,j,l,a[100];
  5. do
  6. {
  7. scanf("%d %d",&n,&k);
  8. }while(k < 1 || n > 100 || k >= n); //控制输入的n和k的大小
  9. for(i = 0;i < n;i++)
  10. {
  11. scanf("%d",&a[i]); //通过循环输入数组a的初值
  12. }
  13. for(i = 0;i < k;i++) //扫描k次
  14. {
  15. for(j = 0;j < n - i - 1;j++) //每一次扫描,扫描第i+1个数后面的所有数
  16. { 即循环n - i - 1
  17. if(a[j+1] < a[j])
  18. {
  19. l = a[j+1];
  20. a[j+1] = a[j]; //如果前一个数大于后一个数则进行交换
  21. a[j] = l;
  22. }
  23. }
  24. }
  25. for(i = 0;i < n;i++)
  26. {
  27. if(i != n - 1) //当输出的数不是数组的最后一个数时输出数字加空格
  28. printf("%d ",a[i]);
  29. else //当输出的数是数组的最后一个数时仅输出数字
  30. printf("%d",a[i]);
  31. }
  32. return 0;
  33. }

 

3、数组循环左移

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,m,i,j,lin,a[100];
  5. do
  6. {
  7. scanf("%d %d",&n,&m);
  8. }while(n > 100 || n < 1 || m < 0); // 控制输入的n和m的大小
  9. for(i = 0;i < n;i++)
  10. {
  11. scanf("%d",&a[i]); //通过循环输入数组a的初值
  12. }
  13. for(i = 0;i < m;i++) //循环m次使数组内容左移m次
  14. {
  15. lin = a[0]; //把数组a的第一个值赋给临时变量lin
  16. for(j = 0;j < n-1;j++) //利用循环使数组a第2到第n个数左移一位
  17. {
  18. a[j] = a[j+1];
  19. }
  20. a[n-1] = lin; //将lin的值赋给数组a的最后一个数
  21. }
  22. for(i = 0;i<n;i++)
  23. {
  24. if(i != n-1) //当输出的数不是数组的最后一个数时输出数字加空格
  25. printf("%d ",a[i]);
  26. else //当输出的数是数组的最后一个数时仅输出数字
  27. printf("%d",a[n-1]);
  28. }
  29. return 0;
  30. }

 

4、将数组中的数逆序存放

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,i,lin,a[10];
  5. do
  6. {
  7. scanf("%d",&n);
  8. }while(n<1 || n>10); //控制n的范围
  9. for(i = 0;i < n;i++)
  10. {
  11. scanf("%d",&a[i]); //通过循环输入数组a的初值
  12. }
  13. for(i=0;i < n/2;i++)
  14. {
  15. lin = a[i]; //将数组a的第i个数的值赋给变量lin
  16. a[i] = a[n-1-i]; //将与第i个数关于中心对称的数即第n-i-1个数的值赋给第i个数
  17. a[n-1-i] = lin; //将lin的值赋给第n-i-1个数
  18. }
  19. for(i = 0;i<n;i++)
  20. {
  21. if(i != n-1) //当输出的数不是数组的最后一个数时输出数字加空格
  22. printf("%d ",a[i]);
  23. else //当输出的数是数组的最后一个数时仅输出数字
  24. printf("%d",a[i]);
  25. }
  26. return 0;
  27. }

 

5、查找整数

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,x,i,j=0,a[20];
  5. do
  6. {
  7. scanf("%d %d",&n,&x);
  8. }while(n > 20 || n <= 0); //控制n的范围
  9. for(i = 0;i < n;i++)
  10. {
  11. scanf("%d",&a[i]); //通过循环输入数组a的初值
  12. }
  13. for(i=0;i<n;i++)
  14. {
  15. if(a[i] == x)
  16. {
  17. printf("%d",i); //如果数组a中存在x则输出该数
  18. j++; // j 的初值为0,若存在则j加一,若不存在则j=0
  19. }
  20. }
  21. if(j == 0) //若j=0 则说明不存在该数
  22. printf("Not Found");
  23. return 0;
  24. }

 

 

6、矩阵运算

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,i,j,sum = 0,a[10][10];
  5. do
  6. {
  7. scanf("%d",&n);
  8. }while(n <= 1 || n > 10); //控制n的范围
  9. for(i = 0;i < n;i++)
  10. {
  11. for(j = 0;j < n;j++)
  12. {
  13. scanf("%d",&a[i][j]); //通过循环输入数组a的初值
  14. }
  15. }
  16. for(i = 0;i < n-1;i++)
  17. {
  18. for(j = 0;j < n-1;j++)
  19. {
  20. if(i + j != n - 1) // i+j不等于 n-1即为除副对角线、最后一列最后一行的数
  21. sum = sum + a[i][j]; //求和
  22. }
  23. }
  24. printf("%d",sum); //输出和
  25. return 0;
  26. }

 

7、求矩阵各行元素之和

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,m,i,j,sum[6]={0,0,0,0,0,0},a[6][6];
  5. do
  6. {
  7. scanf("%d %d",&m,&n);
  8. }while(n<1 || n>6 || m<1 || m>6); //控制n和m的范围
  9. for(i = 0;i < m;i++)
  10. {
  11. for(j = 0;j < n;j++)
  12. {
  13. scanf("%d",&a[i][j]); //通过循环输入数组a的初值
  14. }
  15. }
  16. for(i = 0;i < m;i++) //共有m行,循环求和m次
  17. {
  18. for(j = 0;j < n;j++)
  19. {
  20. sum[i] = sum[i] + a[i][j]; //求第i+1行的和并赋值到数组sum的第i个数
  21. }
  22. printf("%d\n",sum[i]); //输出各行的和
  23. }
  24. return 0;
  25. }

 

8、字符串逆序

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char ch[81]; //定义字符数组ch
  6. int i,j,lin,n;
  7. gets(ch); //输入字符数组ch的初值
  8. n = strlen(ch); //n等于ch的长度
  9. for(i = 0;i < n/2;i++) //进行倒序
  10. {
  11. lin = ch[i]; //将数组ch的第i个数的值赋给变量lin
  12. ch[i] = ch[n-1-i]; //将与第i个关于中心对称的数即第n-i-1个数的值赋给第i个
  13. ch[n-1-i] = lin; //将lin的值赋给第n-i-1个数
  14. }
  15. puts(ch); //输出ch
  16. return 0;
  17. }

 

9、字符串转换成十进制整数

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. char a[100000];
  6. char b[140000];
  7. int zhuanhuan(char s,int i,int len); //声明函数zhuanhuan
  8. int main()
  9. {
  10. int i = 0,j = 0;
  11. int flag = 0;
  12. scanf("%s",a); //输入字符串a
  13. int len = strlen(a); //定义并将a的长度赋值给变量len
  14. while(i < len) //通过循环对字符串a进行逐字符转换
  15. {
  16. if(flag == 0 && j == 0 && a[i] == '-') //当第一个字符为“-”时
  17. {
  18. flag = 1;
  19. i++;
  20. }
  21. if(a[i] >= '0'&&a[i] <= '9') //当字符为数字时
  22. {
  23. b[j++] = a[i];
  24. i++;
  25. }
  26. else if((a[i] >= 'a'&&a[i] <= 'f')||(a[i] >= 'A'&&a[i] <= 'F')) //当字符为字母时
  27. {
  28. b[j++] = a[i];
  29. i++;
  30. }
  31. Else //当字符为其他字符时
  32. i++;
  33. }
  34. int sum = 0;
  35. len = strlen(b);
  36. i = 0;
  37. int m;
  38. while(i < len)
  39. {
  40. m = zhuanhuan(b[i],i,len);
  41. sum = sum+m;
  42. i++;
  43. }
  44. if(flag == 1&&sum!=0)
  45. printf("-");
  46. printf("%d\n",sum); // 输出转换完后的值
  47. return 0;
  48. }
  49. int zhuanhuan(char s,int i,int len) //字符为不同内容时的转换
  50. {
  51. if(s >= '0'&&s <= '9')
  52. return (s-'0')*pow(16,(len-i-1));
  53. if(s == 'a'||s == 'A')
  54. return 10*pow(16,(len-i-1));
  55. if(s == 'b'||s == 'B')
  56. return 11*pow(16,(len-i-1));
  57. if(s == 'c'||s == 'C')
  58. return 12*pow(16,(len-i-1));
  59. if(s == 'd'||s == 'D')
  60. return 13*pow(16,(len-i-1));
  61. if(s == 'e'||s == 'E')
  62. return 14*pow(16,(len-i-1));
  63. if(s == 'f'||s == 'F')
  64. return 15*pow(16,(len-i-1));
  65. return 0;
  66. }

 

10、字符串循环左移

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char ch[101]; //定义字符数组ch
  6. int a,len,temp,i,j;
  7. gets(ch); //输入字符数组ch的初值
  8. scanf("%d",&a); //输入变量a的初值(需要移动的位数)
  9. len = strlen(ch); //变量len等于字符数组ch的长度
  10. for(i = 0;i < a;i++) //循环a次使数组内容左移a次
  11. {
  12. temp = ch[0]; //把数组ch的第一个值赋给临时变量temp
  13. for(j = 0;j < len - 1;j++) //利用循环使数组ch第2到第len个值左移一位
  14. {
  15. ch[j] = ch[j + 1];
  16. }
  17. ch[len - 1] = temp; //将temp的值赋给字符数组ch的最后一个值
  18. }
  19. printf("%s",ch); //输出移动后的结果
  20. return 0;
  21. }

 

四、实验的分析与思考

1、求最大值及其下标

先定义一个最大值max,并将第一个数的值赋给最大值max,然后利用循环使每一个数字与max进行对比,如果大于max则将其赋值给max,并将其下标赋给变量j。

2、冒泡法排序

先定义一个临时变量lin,并将第一个数的值赋给最大值lin,然后利用循环使每一个数字与下一个数字进行对比,如果前一个数大于后一个数则进行交换。最后输出结果。

3、数组循环左移

定义一个临时变量lin,将第一个值赋给lin,然后将后面的数依次向左移动一位。循环指定次数。

4、将数组中的数逆序存放

以数组中中间的数为中心,将两端的数进行对换。

5、查找整数

定义一个变量,并赋初值为0,当数组中存在要查找的数时该变量加一,若最终该变量为0,则说明不存在该数字。

6、矩阵运算

找出矩阵除副对角线、最后一列和最后一行以外的所有元素之间的关系,然后进行求和。

7、求矩阵各行元素之和

定义一个和的数组,每个元素代表一行的和,分别对每行求和,然后输出。

8、字符串逆序

以字符数组中中间的字符为中心,将两端的字符进行对换。

9、字符串转换成十进制整数

如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数,应首先对其进行判断,然后根据字符类型进行分类,最后转换成十进制数并求和,输出。

10、字符串循环左移

定义一个临时变量temp,将第一个值赋给temp,然后将后面的字符依次向左移动一位。循环指定次字符。

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

闽ICP备14008679号