***BUPT2021秋计算导论第四次实验***
第四次实验
4.1 打印图形(一)
4.1
实验3_6_打印图形一 (100 分)
用’-‘(减号)、’+’(加号)、’|’(竖线)、’*’星号和空格打印方格。
输入格式:
只有一行,为用空格分隔的两个整数l,c(0<l,c<10)。其中l和c分别代表格子的行数和列数。请看输入样例。
输出格式:
每组测试用例输出一组(请看输出样例)。
输入样例:
2 3
输出样例:
下面是我写的代码,我的思路是将图案排列相同的行归纳在一起,依次从第一行到最后一行循环。代码如下,若有错误,望告知。
int main()
{
int c,l;//c代表行,l代表列
scanf("%d %d",&c,&l);
int i,j;//我的想法是从0 —— n-1 ,因为这样if判断条件写起来比较简洁,仔细体会就可以知道。
for (i=0;i<4*c+1;i++)//观察总行数与c的关系
{
if(i%4==0)//由于第一行与最后一行是相同规律,归纳在一起。
{
j =0 ;//初始化j ,通过j的数值来判断该打印什么字符
while(j<l+1+5*l)//我采用的while循环
{
if(j%6==0)//对第一类行进行观察,即首末为0和6的倍数就打印“|”;
{
printf("|");
if(j==6*l)//末尾时,应该加上换行符
{
printf("\n");
}
j++;
}
else if((j-1)%6==0)//依此了推,我才用for循环打印“*”;
{
int p =j;
for(;p<j+5;p++)
{
printf("*");
}
j=j+5;
}
}
}
else if(i%2==0&&i>0)//second
{
int j =0 ;
while (j<6*l+1)
{
if(j%6==0)
{
printf("|");
if(j==6*l)
{
printf("\n");
}
j++;
}
else if((j-1)%6==0)
{
int p =j;
for(;p<j+5;p++)
{
if(p==j+2)
{
printf("+");
}
else {
printf("-");
}
}
j=j+5;
}
}
}
else if((i+1)%2==0)//third
{
int j =0;
while(j<6*l+1)
{
if(j%3==0)
{
printf("|");
if(j==6*l)
{
printf("\n");
}
j++;
}
else {
printf(" ");
j++;
}
}
}
}
return 0;
}
在这里插入代码片
暴力法解决这类打印问题,思路很简单,但是比较麻烦。
4.2简单问题
4.2
/*实验3_1_简单问题 (100 分)
任意给定n个整数,求这n个整数序列的和、最小值和最大值。
输入格式:
第一行为一个整数n(0<n<100),代表要输入的整数个数;第二行为用空格分隔的n个整数。测试用例保证所有整数及求和结果等均可以用int存储。
输出格式:
只有一行,为三个空格分隔的,依次代表整数序列的和、最大值和最小值。
输入样例:
5
10 20 30 40 50
输出样例:
150 50 10*/
下面展示一些
源码如下,很简单,不接用解释了。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i ;
int num;
int a[100]={0};
for(i=0 ; i<n;i++)
{
scanf("%d",&num);
a[i]=num;
}
int sum = 0;
int max= a[0];
int min =a[0];
for(i= 0;i<n;i++)
{
sum = sum +a[i];
if(a[i]>max)
{
max = a[i];
}
if(a[i]<min)
{
min = a[i];
}
}
printf("%d %d %d\n",sum,max,min);
return 0;
}
4.3 密码文
4.3
/*实验3_2_密码文 (100 分)
已知一个英文单词,该单词中只包含大写字母“A—Z”与小写字母“a—z”。你的任务是将英文单词翻译成密码文。翻译规则是把所有字母用它后面的第三个字母替换,并假设字符a接在字符z后面,字符A接在字符Z后面。例如:zero将被翻译成chur。
输入格式:
只有一行,为一个长度不超过100,只包含英文大小写字母的字符串(以回车换行符‘\n’结尾)。
输出格式:
只有一行,为对应字符串的密码文。
输入样例:
AZazbf
输出样例:
DCdcei*/
#include<stdio.h>
int main()
{
char x;
int a[100]={0};
scanf("%c",&x);
while(x!='\n')
{
if(x>='a'&&x<'x')
{
x=x+3;
printf("%c", x);
}
else if(x>='A'&&x<'X')
{
x=x+3;
printf("%c", x);}
else if(x>='x'&&x<='z')
{
x= x-23;
printf("%c", x);
}
else if(x>='X'&& x<='Z')
{
x=x-23;
printf("%c", x);
}
scanf("%c",&x);
}
return 0;
}
此处需要注意的是,字符所以对应的acsii码值,并且对于x,y,z三个字符的特殊处理。
4.4确定成绩等级
将百分制成绩score按下列原则划分其等级:
score≥90等级为A;
80 ≤score<90,等级为B;
70≤score<80,等级为C;
60≤score<70,等级为D;
score<60,等级为E。
输入格式:
只有一个整数,代表成绩score。测试用例保证所有整数可以用int存储。
输出格式:
只有一行,当成绩小于0或大于100时为"The score is out of range!"(不包括引号),否则为输入的学生成绩对应的等级。
输入样例:
89
输出样例:
B*/
#include<stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
{
printf("The score is out of range!\n");
}
else {
if(score>=90)
{
printf("A\n");
}
else if(score>=80&&score<90)
{
printf("B\n");
}
else if (score>=70&&score<80)
{
printf("C\n");
}
else if (score>=60&&score<70)
{
printf("D\n");
}
else if(score<60)
{
printf("E\n");
}
}
return 0;
}
4.5质数统计
4.5
/*实验3_4_质数统计 (100 分)
现有若干行正整数,请你写一段程序分别统计每一行中有多少个质数。
输入格式:
第一行为一个整数n(0<n<=10),代表测试用例行数。后边是n行,每行为若干个用空格分隔的正整数。这些正整数的最后是-1,表示此行结束。
输出格式:
为n行,每行一个整数,对应于输入的每一行中质数的个数。
测试用例保证输入合法,且所有整数可以用int存储
输入样例:
2
37 54 18 92 39 45 8 84 75 15 33 83 85 54 81 33 89 -1
17 19 60 77 2 92 38 63 92 69 91 94 11 -1
输出样例:
3
4*/
#include<stdio.h>
int IsPrime(int );
int main()
{
int n ;
scanf("%d",&n);
int i = 0;
int a[10]={0};
int num;
for (;i<n;i++)
{
scanf("%d", &num);
while(num!= -1)
{
if(IsPrime(num))
{
a[i]++;
}
scanf("%d",&num);
}
}
for(i =0;i<n ;i++)
{
printf("%d\n", a[i]);
}
return 0;
}
int IsPrime (int n )
{
int i =2;
for ( ;i<= n-1;i++)
{
if(n%i ==0)
{
return 0;
}
}
return 1;
}
我写这道题时,使用数组和子函数的方法,所以写起来很简单。如果没有学到数组和子函数的话,可一次采用下面这种写法。
```c
#include<stdio.h>
int main()
{
int n ;
scanf("%d",&n);
int i ;
int a == 0;
int num;
for (i=0;i<n;i++)
{
scanf("%d", &num);
while(num!= -1)
{
int j ;
for ( j = 2 ; j < num ; j++ )
{
if(num %j == 0)
{
break ;
}
}
if ( j == num )
{
a ++ ;
}
scanf("%d",&num);
}
printf("%d\n", a) ;
}
return 0;
}
4.6整除与平方
4.6
/* 实验3_5_整除与平方 (100 分)
已知一个自然数,求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方s。s保证在int范围之内。
输入格式:
只有一行,为自然数n。
输出格式:
只有一行,为一个自然数,代表计算结果。
输入样例:
43
输出样例:
3969*/
#include<stdio.h>
int main()
{
int n ;
scanf("%d",&n);
int i ;
int sum=0;
for(i =1 ;i<n;i++)
{
if((i%3==0)&&(i%7==0))
{
sum = sum +i;
}
}
printf("%d", sum*sum);
return 0;
}
注意是和的平方,而不是平方的和。