这篇文章就接着上一篇继续和大家分享实验报告中可能出现的简单编程题,希望对恰巧看到的你有所帮助。
目录
1.打印图示菜单,输入对应的序号后,执行打印提示:按任意键返回该菜单,继续选择选择菜单1求两个数的和2求两个数的差3求两个数的商和余数4求两个数的倒数之和0退出系统
2.计算式子1-1/2+1/5-1/10+1/17-…。要求计算误差小于1/1000.提示:通项公式为:(-1)^n(1/(n²+1)),n=0,1,2,3,…。
3.输入30个字符,分别统计其中数字、英语字母以及其他字符的个数。
4.分别使用单循环和双循环结构计算S=∑(n=1到10)n!,输出结果。
7.观察数列1,2,1,3,2,5,3,8…,求出该数列前二十项,然后逆序输出。
8.将一个一维数组a[9]中的各元素的值按行顺序放入二维数组b[3][3]中。
10.将方阵S(大小n*n)对角线上的元素置为1,其余元素置为0。
1.打印图示菜单,输入对应的序号后,执行打印提示:按任意键返回该菜单,继续选择
选择菜单
1求两个数的和
2求两个数的差
3求两个数的商和余数
4求两个数的倒数之和
0退出系统
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,sum,sum2,ch;
int n=1;
scanf("%d%d",&a,&b);
printf("1求两个数的和\n2求两个数的差\n3求两个数的商和余数\n4求两个数的倒数之和\n0退出系统\n");
for (;1<=n<=4;)
{
scanf("%d",&n) ;
switch(n)
{
case 1:
{
printf("求两个数的和\n");
sum=a+b;
printf("%d\n",sum);
printf("按任意键返回菜单,继续选择\n");
scanf("%c",&ch);
break;
}
case 2:
{
printf("求两个数的差\n");
sum=a-b;
printf("%d\n",sum);
printf("按任意键返回菜单,继续选择\n");
scanf("%c",&ch);
break;
}
case 3:
{
printf("求两个数的商和余数\n");
sum=a/b;
sum2=a%b;
printf("%d\n%d\n",sum,sum2);
printf("按任意键返回菜单,继续选择\n");
scanf("%c",&ch);
break;
}
case 4:
{
printf("求两个数的倒数之和\n");
sum=1/a+1/b;
printf("%d\n",sum);
printf("按任意键返回菜单,继续选择\n");
break;
default:
printf("退出系统\n");
// scanf("%c",ch);
break;
}
}
}
return 0;
}
这一题从代码上来看多少有些麻烦,但实际上你仔细看会发现很多部分是比较无脑的重复(因为这个题干要求要有打印提示,所以不同选择却有相同的部分)。当然这个代码归根结底来说是不够高效和简洁的,属于符合初学者风格那种,大家可以想想用什么办法可以简化?(提示:自定义函数的使用,枚举常量的使用等等)当然这里也出现了有些在此之前没有出现的知识点,比如switch语句的使用,里面的break,default,case,还有for循环语句使用等等。大家也可以自己试试do while语句,看看和for语句有什么区别,会不会更好看呢?当然前面的知识点大家都是要掌握的,后面我也会整理。不过,还是建议大家主动去搜索,去了解。
2.计算式子1-1/2+1/5-1/10+1/17-…。要求计算误差小于1/1000.提示:通项公式为:(-1)^n(1/(n²+1)),n=0,1,2,3,…。
#include<stdio.h>
int main()
{
int n,sign;
double sum,t;
sum=1.0;n=1;sign=1;t=1.0;
while(t>0.001)
{
t=(double) 1/(n*n+1);
sign*=-1;
sum+=(double)sign*t;
n++;
}
printf("n=%d result=%1f",n-1,sum);
return 0;
}
这个倒是没有特别的地方主要是理解题干,然后根据题意写出符合的代码。不过,我这里用了一个强制类型转换,大家可以自行选择代码实现。
3.输入30个字符,分别统计其中数字、英语字母以及其他字符的个数。
#include<stdio.h>
int main()
{
int i;
char n;
int n1=0;
int n2=0;
int n3=0;
char ch[30];
printf("请输入30个字符\n");
for(i=0;i<=29;i++)
{
scanf("%c",&ch[i]);
n=ch[i];
if(n>='a'&&n<='z'||n>='A'&&n<='Z')//如何判断一个数组中有几个数字字符,字母字符的方式:直接比较其,具体表现为左边步骤 须知&& ||
n1++;
else if(n>='0'&&n<='9')
n2++;
else
n3++;
}
printf("字母字符个数:n1=%d\n数字字符个数:n2=%d\n其他字符个数:n3=%d\n",n1,n2,n3);
return 0;
}
这个题目其实有助于我们加深对于字符的理解,尤其是关于不同的字符判断方式最初也是让我眼前一亮,后面也是越发认识到ASCII值和字符的关系。而且大家也可以打打空格和回车,这些尝试有助于大家对于scanf的理解。总之,这题还是一道比较好玩的题。
4.分别使用单循环和双循环结构计算S=∑(n=1到10)n!,输出结果。
#include<stdio.h>
int main()
{
int n=1,i,sum=0,a;
for(i=1;i<=10;i++)
{
a=1;
for(n=1;n<=i;n++)
{
a*=n;
}
sum+=a;
}
printf("阶乘累加=%d",sum);
return 0;
}
这里是一个双循环,主要是将阶乘的计算和阶乘的累加分别用两个循环表示,这样的话计算的时间比较就,就是时间复杂度高。
#include<stdio.h>
int main()
{
int n=1,i,sum=0;
for(i=1;i<=10;i++)
{
n*=i;
sum+=n;
}
printf("阶乘累加=%d",sum);
return 0;
}
这里是单循环,即一个循环既计算阶乘,同时累加求其和。其实,我们仔细想想,比如5的阶乘和4的阶乘在循环中的区别就是乘没乘该循环的,所以完全可以合二为一,这样还让代码更简洁,效率也高。大家可以自己尝试尝试,所以我们在写代码前要仔细思考,建立好模型。
5.编制程序,输出九九乘法表。
#include<stdio.h>
int main()
{
int i,n,sum;
for(i=1;i<=9;i++)
{
printf("\n");
for(n=1;n<=i;n++)
{
sum=i*n;
printf("%d*%d=%-2d ",n,i,sum);
}
}
return 0;
}
这题其实又简单挺多的,就是简单的循环结构嵌套,里面值得我们注意的应该是%-2d,这里是一个让打印出来的九九乘法表更漂亮的技巧。大家还是可以去搜搜看,当然后面会比较系统地将这些格式字符到底都是什么意思的。
6.输出如下所示的菱形字符图形。
#include<stdio.h>
int main()
{
int i,j,x;
for(i=1;i<=5;i++)
{
printf("\n");
for(j=10-2*i;j>=0;j--)
{
printf(" ");
}
for(x=2*i-1;x>0;x--)
{
printf(" 0");
}
}
for(i=4;i>=0;i--)
{
printf("\n");
for(j=10-2*i;j>=0;j--)
{
printf(" ");
}
for(x=2*i-1;x>0;x--)
{
printf(" 0");
}
}
return 0;
}
这个也是对循环结构的考察,就是大家需要先搞清楚这个菱形的结构特点,有什么规律,至于代码,聪明的你可能很容易就敲出来了。
7.观察数列1,2,1,3,2,5,3,8…,求出该数列前二十项,然后逆序输出。
#include<stdio.h>
int main()
{
int c,d,i,n=2;
int arr[20];
int a=arr[0]=1;
int b=arr[1]=2;
for(i=0;i<=9;i++)
{
c=arr[n]=b-a;
d=arr[n+1]=b+c;
a=c;
b=d;
n+=2;
}
for(n=19;n>=0;n--)
{
printf("%d\n",arr[n]);
}
return 0;
}
这题本质上也是让我们找规律的,但是由于这些数据之间有一定的联系,我们又需要在最后逆序输出,所以,我们就要使用一种新的数据类型——数组来将这些数组存放在一起。同样,这里也先不详细将数组,会在后面文章再介绍的。当然,大家也要注意我们把arr[0]赋值给a,改变a不影响arr[0]哦,仔细品品。
8.将一个一维数组a[9]中的各元素的值按行顺序放入二维数组b[3][3]中。
#include<stdio.h>
int main()
{
int arra[9]={1,2,3,4,5,6,7,8,9};
int arrb[3][3]={0};
int i=0,j=0,n=0;
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
if(n<9)
arrb[i][j]=arra[n++];
printf("%d ",arrb[i][j]);
}
printf("\n");
}
return 0;
}
这道题是通过一种简单的方式让我们对二维数组有点初步的认识,实不相瞒在最初我对数组的理解也是有偏差的,因为数组元素的调用是从0开始,而并非1,而且数组类型中[n]中n是数组中元素的个数。
9.找出矩阵M中的最大值以及其所在的行和列。
#include<stdio.h>
int main()
{
int x,y;
printf("请先输入矩阵M的横和列\n");
scanf("%d%d",&x,&y);
int M[x][y];//变量在之前版本是不能用于定义数组的
int max,i,j;
printf("请输入矩阵M的值:\n");
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
scanf("%d",&M[i][j]);
}
printf("打印矩阵M:\n");
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
printf("%d",M[i][j]);
}
printf("\n");
}
int row=0,col=0;
max=M[0][0];
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
if(max<M[i][j])
{
max=M[i][j];
row=i;
col=j;
}
}
}
printf("该数组最大的元素值是:%d\n",max);
printf("最大对应的行:%d\n最大对应的列:%d\n",row+1,col+1);
return 0;
}
这个题中矩阵的数据也是存在内在联系的,加上要找到最大值及其所在行和列,所以也是要建立数组的。在这个题中特别值得注意的是,①求最大值 ②所求行和列与其在数组中下标的关系。
10.将方阵S(大小n*n)对角线上的元素置为1,其余元素置为0。
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
char s[n][n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)//为了方便下面j==i=0,改成j=0开始
{
if(j==n-i-1||j==i)//假定n=5,则第一行为1的是s[0][0]和s[0][4]
{
s[i][j]=1;
printf("%d ",s[i][j]);
}
else
{
s[i][j]=0;
printf("%d ",s[i][j]);
}
}
printf("\n");
}
return 0;
}
这题其实比较值得注意的是数组的建立,即在定义数组时使用变量,从而达到方阵为自己想要的效果。当然,后面关于数组建立和使用中也会详细介绍。其余的话,就是要分析题干要求,寻找方阵特点和规律。