c/c++从入门到入土(12)
开始时间2023-05-14 23:01:13
结束时间2023-05-15 13:06:16
前言:学习数组,少不了练习,让我们通过实验,在实践中出真知。
实验四 数组程序设计
函数题
第一题 应用字符数组反序字符串
一、问题描述
程序应用字符数组存储用户输入的一行字符(长度小于80),并将该字符串按照反序重新存放于原字符数组中,要求完善程序代码。 裁判测试程序样例: #include <stdio.h> int main(){ const int N=80; char a[N]; gets(a); { /* 请在这里填写答案 */ } printf("%s\n",a); } 输入格式: 请输入一行字符(字符个数小于80)。 输出格式: 输出反序存放的字符串。 输入样例: Students are required to be in school by 8:00. 输出样例: .00:8 yb loohcs ni eb ot deriuqer era stnedutS 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
这个题相对简单,从裁判样例中知道,字符数组长度为80,且已给字符数组赋值。函数要求是将字符数组反序,它的意思是比如说将我爱你,变为你爱我。首先我们要做的第一件事是通过strlen函数获取字符数组的长度,随着i++,j--,将首元素和尾元素交换。最后将数组输出即可。
三、源代码
int i,j,k; j=strlen(a)-1; for(i=0;i<j;i++,j--) { k=a[i]; a[i]=a[j]; a[j]=k; }
第二题 应用字符数组统计字符
一、问题描述
程序应用字符数组存储从键盘输入的一行英文(100个以内),统计各个字符出现的次数。请完善程序。 裁判测试程序样例: #include <stdio.h> int main(){ char c[100]; gets(c); { /* 请在这里填写答案 */ } return 0; } 输入格式: 请输入一行字符(字符个数小于100)。 输出格式: 统计个字符的数量,一行一个字符地按照以下格式输出数量不为0的字符及其数量: <字符>--><数量> 输入样例: Having an active youngster about the house can be quite wearing. 输出样例: -->10 .-->1 H-->1 a-->6 b-->2 c-->2 e-->7 g-->3 h-->2 i-->4 n-->5 o-->3 q-->1 r-->2 s-->2 t-->5 u-->4 v-->2 w-->1 y-->1 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
从裁判样例中我们知道,题目将字符存入长度为100的字符c数组,再从输出样例中可知,收集字母顺序为从小到大按ascll码排序。我们要做的事情首先将c数组按照ascll码顺序从小到大排序,比如说abcabc变为aabbcc,这时候我们要用到冒泡排序。排序排好了,那么我们先在另外一个数组中将数组c中具有的各类元素一一放置其中,接着记录各元素出现的个数,在一个循环中,c数组中的元素与该数组特定元素相同,统计变量加一。最后按照格式将其输出。
三、源代码
int b[100]={0}; char m; char a[100];//用于存储不重复的字符 int i,j=0; int num=1; int e=0;//输出次数的结束标志 for(i=0,m=c[i];c[i]!='\0';i++)//按照ASCII码升序入c数组 { for(j=i+1;c[j]!='\0';j++) { if(c[i]>c[j]) { m=c[i]; c[i]=c[j]; c[j]=m; } } } j=1; a[0]=c[0]; for(i=0;c[i+1]!='\0';i++)// 存储不重复的字符到a数组 { if(c[i]!=c[i+1]) { a[j]=c[i+1]; j++; } } for(i=0,j=0;c[i]!='\0';i++) { if(a[j]==c[i]) { b[j]+=1; } else { i--; j++; continue; } } for(i=0;c[i]!='\0',b[i]!=0;i++) { printf("%c-->%d\n",a[i],b[i]); }
第三题 逆序数组
一、问题描述
(谭浩强,《C程序设计(第四版)》,清华大学出版社,P168,第5题) 程序应用数组存储用户输入的正整数序列(个数不大于20)。并在原数组空间完成逆序存放,要求完善程序代码。 裁判测试程序样例: #include <stdio.h> #define N 20 int main(){ int i=0,a[N]; do{ scanf("%d",a+i); }while(a[i++]>0); { /* 请在这里填写答案 */ } for(i=0; a[i]>0; i++) printf("%5d",a[i]); return 0; } 输入格式: 一行中输入若干正整数,数据间以空格为间隔,负数表示输入结束。 输出格式: 输出逆序后的整数序列,每个数显示格式:占5位,右对齐。。 输入样例: 10 11 12 13 14 15 -5 输出样例: 15 14 13 12 11 10 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
在裁判样例中我们知道,将所需要的整数序列给了数组a,题目的要求是我们要做到逆序输出。什么是逆序输出?比如说将我爱你变为你爱我。说到这儿,就和第一题差不多了。
三、源代码
int b[100], k=0; for(;i>=0;i--){ b[k]=a[i]; k++; } for(int j=2;j<k;j++){ if(b[j]>0) a[j-2]=b[j]; a[k]=-1; }
编程题
第一题 应用数组求解最值问题
一、问题描述
请应用数组存储用户输入的10个实数,编写算法输出这个数组中的最大值和最小值。 输入格式: 请在一行中输入10实数,数据间以空格为间隔。 输出格式: 对每一组输入的实数,以以下格式输出这组实数中的最值: Min=<最小数> Max=<最大数> 输入样例: 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 输出样例: Min=0.000000 Max=9.000000 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
首先输入实数序列,然后按照冒泡排序分别提取最小值和最大值,最后按格式输出。
三、源代码
#include<stdio.h> int main() { float a[10]; float j=10.0,k; int i; for(i=0;i<10;i++) { scanf("%f",&a[i]); } for(i=0;i<10;i++) { if(a[i]>k){ k=a[i];} } for(i=0;i<10;i++) { if(a[i]<j){ j=a[i];} } printf("Min=%.6f\n",j); printf("Max=%.6f\n",k); return 0; }
第二题 应用数组排序数列
一、问题描述
请应用数组存储用户输入的10个整数,编写算法将该数组按照从小到大的顺序排列好。用户再输入1个整数,编写代码把它插入原数列中,要求仍然保持从小到大有序。 编写程序时应考虑到所插入数的各种可能性(比原来所有的数都小;比原来所有的数都大;在最大数和最小数之间)。 输入格式: 请在一行中输入10整数,数据间以空格为间隔。 再在一行中输入1个待插入的整数。 输出格式: 将插入前后排好的有序序列分别在一行内输出,每个数的显示格式:占3位,右对齐。 输入样例: 10 9 8 7 6 5 4 3 2 1 8 输出样例: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 8 9 10 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
首先输入一个整型数组和一个整型数字。用冒泡排序从小到大将该整型数组排序。再用一个个寻找需要插入的位置,最后输出。
三、源代码
#include<stdio.h> int main() { int a[11]; int i,j,b,k,flag=0,temp; for(i=0;i<10;i++) { scanf("%d",&a[i]); } scanf("%d",&b); for(i=0;i<10;i++) { k=i; for(j=i+1;j<10;j++) { if(a[j]<a[k]) { k=j; } } if(k!=i) { temp =a[k]; a[k]=a[i]; a[i]=temp; } } for(i=0;i<10;i++) { printf("%3d",a[i]); } printf("\n"); for(i=0;i<11;i++) { if(a[i]>b) { k=a[i];a[i]=b;flag=1; } if(flag==1)break; } if(flag==1) {for(i=i+1;i<11;i++) { j=a[i]; a[i]=k; k=j; } } for(i=0;i<11;i++) printf("%3d",a[i]); if(flag==0) printf("%d",b); printf("\n"); return 0; }
第三题 应用字符数组求子串
一、问题描述
应用字符数组存储从键盘输入一行字符(100个以内),用户输入整数i和n的值,编写算法输出该字符串中从第i个字符开始的n个字符。 提示:若i<1则认为i=1,若字符串剩余的字符不够n个则输出剩余的全部字符。 输入格式: 第一行输入一行字符(字符个数小于100)。 第二行输入2个整数,以空格间隔,第1个数为i的值,第2个数为n的值。 输出格式: 输出该字符串中从第i个字符开始的n个字符。 输入样例: I love China! 8 8 输出样例: China! 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
第一步,获取字符数组。接着获取i和n。很简单,循环起始变量i确定,往后输出n个字符即可。
三、源代码
#include<stdio.h> #include<string.h> int main() { char str[100]; int i,n,a,j; gets(str); scanf("%d%d",&i,&n); if(i<1) i=1; for(j=i;str[j]!='\0';j++) { } if(j<n) { for(j=i-1;str[j]!='\0';j++) { printf("%c",str[j]); } } else { for(j=i-1;j<i+n-1;j++) { printf("%c",str[j]); } } printf("\n"); return 0; }
第四题 筛法求素数
一、问题描述
(谭浩强,《C程序设计(第四版)》,清华大学出版社,P168,第1题) 用户输入整数n(1<n<1000),应用筛法求不大于n的所有素数。 输入格式: 一行中输入1个整数。 输出格式: 按照一行10个的格式输出不大于n的所有素数,其中每个素数的显示格式为:占5位,右对齐。 输入样例1: 100 输出样例1: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 输入样例2: 1000 输出样例2: error data 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
按照题目要求,输入一个整数n,在输入后我们需要进行判断。整个整数要在1~1000之间否则输出error data。截止我们要做的便是找素数的过程,众所周知,当一个数的因数只有1和自己本身那这个数便是素数。换句话说,如果我们从一一直遍历到它本身,若不存在一个数,使得目标数字取余该数不为零,那么我们可以说这个数为素数。值得一提,为了简化程序运算流程,我们只需遍历到目标数字的完全平方数,若一到完全平方数找不到因数,那么完全平方数到目标数字也找不到因数。
三、源代码
#include<stdio.h> int main(){ int n,i,m,t=0; scanf("%d",&n); if(n>=1000||n<=1) printf("error data"); else { for(m=2;m<=n;m++) { int p=1; for(i=2;i<m;i++) if(m%i==0) {p=0;break;} if(p==1) {printf("%5d",m);t++;continue;} if(t%10==0) { printf("\n"); } } } return 0; }
第五题 杨辉三角形
一、问题描述
(谭浩强,《C程序设计(第四版)》,清华大学出版社,P168,第6题) 输出n(0<n<21)行杨辉三角形,n由用户输入。 输入格式: 一行中输入1个整数。 输出格式: 输出n(0 < n < 21)行杨辉三角形,每个数的显示格式:占6位,右对齐。 比如3行杨辉三角形输出为: 1 1 1 2 1 1 3 3 1 输入样例1: 3 输出样例1: 1 1 1 2 1 1 3 3 1 输入样例2: 0 输出样例2: error data 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
这个杨辉三角看起来有点奇怪,且看源代码。
三、源代码
#include<stdio.h> int main() { int i,j,n; int arr[21][22]; scanf("%d",&n); if(n<=0||n>=21) printf("error data"); else { for(i=0;i<n;i++) { for(j=0;j<n+1;j++) arr[i][j]=1; } arr[0][1]=1; for(i=0;i<n;i++) arr[i][0]=1; for(i=1;i<n;i++) for(j=1;j<i+1;j++) arr[i][j]=arr[i-1][j-1]+arr[i-1][j]; for(i=0;i<n;i++) { for(j=0;j<=i+1;j++) printf("%6d",arr[i][j]); printf("\n"); } } return 0; }
第六题 查找鞍点
一、问题描述
(谭浩强,《C程序设计(第四版)》,清华大学出版社,P169,第8题) 对于给定的整数矩阵A[5,5],设计算法查找出所有的鞍点。 提示:鞍点的特点:列上最小,行上最大。 输入格式: 输入5行5列整数,同行数据间以空格为间隔。 输出格式: 在一行中以以下格式输出矩阵中的所有鞍点,每个鞍点的显示格式为: [<鞍点的行坐标>,<鞍点的列坐标>,<鞍点的值>] 输入样例: 11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 8 15 10 11 20 25 输出样例: [3,0,8][3,4,8] 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
寻找一个东西,目的性很强,在现阶段也很容易做到。 鞍点的特点是列上最小,行上最大。
三、源代码
#include<stdio.h> int main() { int i,j,max,min,d,k; int a[5][5]={0},b[5]={0},c[5]={0},e[10]={0}; for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<5;i++) { max=a[i][0]; for(j=0;j<5;j++) { if(a[i][j]>max) { max=a[i][j]; } } b[i]=max; } for(j=0;j<5;j++) { min=a[0][j]; for(i=0;i<5;i++) { if(a[i][j]<min) { min=a[i][j]; } } c[j]=min; } //for(i=0;i<5;i++) //printf("%d\n",b[i]); //for(j=0;j<5;j++) //printf("%d\n",c[j]); for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(c[j]==b[i]) { printf("[%d,%d,%d]",i,j,c[j]); } } } }
第七题 折半查找
一、问题描述
(谭浩强,《C程序设计(第四版)》,清华大学出版社,P169,第9题) 应用数组存储用户输入的10个整数,程序首先将其按照从小到大的顺序排序好并存储在原数组中,然后运用折半查找算法在该数组中查找用户输入的待查找整数。 输入格式: 第1行输入10个整数,数据间以空格为间隔。‘ 第2行输入1个待查找整数。 输出格式: 第1行中输出排序后的数组序列,每个数的显示格式为:占5位,右对齐。 第2行中输出查找时每次比较的数组元素的下标,每个下标的显示格式为:占5位,右对齐。 第3行输出查找的结果,查找成功时输出“Success”,查找失败时输出“Fail”。 输入样例1: 1 3 5 7 9 11 13 15 17 19 7 输出样例1: 1 3 5 7 9 11 13 15 17 19 4 1 2 3 Success 输入样例2: 11 13 15 17 19 9 7 5 3 1 0 输出样例2: 1 3 5 7 9 11 13 15 17 19 4 1 0 Fail 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
二、设计思路
什么是折半查找?折半查找是一种高效的查找方法,它的查找过程为首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
三、源代码
#include<stdio.h> #include<math.h> int main() { int a[10]={0},i,j,m=1,n,min,l=0,r=9; for(i=0;i<10;i++) { scanf("%d",&a[i]); } scanf("%d",&n); for(i=0;i<9;i++) { min=a[i]; for(j=i+1;j<10;j++) { if(min>a[j]) { min=a[j]; a[j]=a[i]; a[i]=min; } } } for(i=0;i<10;i++) { printf("%5d",a[i]); } printf("\n"); while(m!=l&&m!=r) { m=(l+r)/2; if(a[m]<n) { l=m+1; } else if(a[m]>n) { r=m-1; } printf("%5d",m); if(m==0) { break; } } printf("\n"); if(a[m]==n) printf("Success"); else printf("Fail"); printf("\n"); return 0; }