一、实验目的
1.学习循环语句for、while和do-while语句的使用方法。
2.学习用循环语句实现各种算法,例如穷举法、迭代法等。
二、实验内容
1 找出最小值
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔.。输出格式:在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
2 打印九九口诀表
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表
输出格式:输入在一行中给出一个正整数N(1≤N≤9)
输入格式:输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐
3 计算阶乘和
对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。
输入格式:输入在一行中给出一个不超过10的正整数N。
输出格式:在一行中输出S的值。
4 求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
5 统计学生成绩
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
• 大于等于90分为A;
• 小于90且大于等于80为B;
• 小于80且大于等于70为C;
• 小于70且大于等于60为D;
• 小于60为E。
输入格式:输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。 输出格式:在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
6 特殊a串数列求和 (20分)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
7 水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
8 打印沙漏 (20分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
三、实验源程序及结果截图
1 找出最小值
#include <stdio.h>
int main()
{
int n,i = 0,j,min;
do
{
scanf("%d ",&n);
}while(n <= 0); //控制n的范围
for(i = 0;i < n;i++)
{
scanf("%d ",&j); //输入n个整数
if(i == 0)
{
min = j; //令第一个数等于min
}
else
{
if(j < min) //如果j比min小则把j的值赋给min
{
min = j;
}
}
i++;
}
printf("min = %d",min); //输出最小值
return 0;
}
2 打印九九口诀表
#include <stdio.h>
int main()
{
int N,i,j;
do
{
scanf("%d",&N);
}while(N <= 0); //控制N的范围
for(i = 1;i <= N;i++) //控制打印的行数
{
for(j = 1;j <= i;j++) //控制每一行的geshu
{
printf("%d*%d=%-4d",j,i,i*j);
}
printf("\n"); //控制换行
}
return 0;
}
3 计算阶乘和
#include <stdio.h>
int main()
{
int N,sum = 0,S,i,j;
do
{
scanf("%d",&N);
}while(N <= 0 || N > 10); //控制N的范围
for(i = 0;i < N;i++) //外层循环控制累乘的个数
{
for(j = 0;j <= i;j++) //内层循环控制每一个累乘的终点
{
S = S * (j + 1);
}
sum = sum + S; //对累乘求和
S = 1; //初始化S
}
printf("%d",sum); //输出总和
return 0;
}
4 求整数段和
#include <stdio.h>
int main()
{
int A,B,i,j = 1,sum = 0;
do
{
scanf("%d %d",&A,&B);
}while(A<-100||A>100 || B<-100||B>100||A>B); //控制A和B的范围
for(i = A;i <= B;i++,j++) //从A到B的所有数
{
printf("%5d",i); //输出数字并占五个字符宽度右对齐
sum = sum + i; //求和
if(j % 5 == 0)
printf("\n"); //每五个数换行
}
if((j - 1) % 5 != 0) //如果最后一行不足五个数输出换行
printf("\n");
printf("Sum = %d",sum);
return 0;
}
5 统计学生成绩
#include <stdio.h>
int main()
{
int N,i,j,a=0,b=0,c=0,d=0,e=0; //定义各级初值
do
{
scanf("%d",&N);
}while(N > 1000 || N <= 0); //控制N的范围
for(i = 0;i < N;i++)
{
scanf("%d",&j);
if(j >= 90)
{
a++; //成绩大于90时a加一
}
else if(j >= 80 && j < 90)
{
b++; //成绩大于80小于90时b加一
}
else if(j >= 70 && j < 80)
{
c++; //成绩大于70小于80时b加一
}
else if(j >= 60 && j < 70)
{
d++; //成绩大于70小于60时b加一
}
else
{
e++; //成绩小于60时e加一
}
}
printf("%d %d %d %d %d",a,b,c,d,e);
return 0;
}
6 特殊a串数列求和
#include <stdio.h>
int main()
{
int a,n,i;
double s = 0.0,x = 0.0;
do
{
scanf("%d %d",&a,&n);
}while(a<=0 || a > 9 || n <= 0 || n > 9); //控制a和n的范围
for(i = 0;i < n;i++)
{
x = x*10 + a; //计算每一个aa……a的值
s = s + x; //求和
}
printf("s = %.0lf",s); //输出整数
return 0;
}
7 水仙花数
#include <stdio.h>
#include <math.h>
int main()
{
int N,i,j,k,s=1,sum=0,e,a;
scanf("%d",&N);
for(i=pow(10,N-1);i<pow(10,N);i++) //查找所有N位数
{
e=i;
for(k=1;k<=N;k++)
{
a=i%10; //求个位数
i=i/10;
for(j=1;j<=N;j++)
{
s=s*a; //算a的N次方
}
sum=sum+s;
s=1;
}
if(sum==e) //如果符合条件
{
printf("%d\n",e);
}
sum=0;
i=e;
}
return 0;
}
8 打印沙漏
#include <stdio.h>
int main()
{
int N,i,j=0,m,n,sum=0;
char c;
scanf("%d %c",&N,&c);
for(i=1;1+2*(i*i-1)<=N;i++)
{
j++;
}//算最大上半部分沙漏的行数
for(m=1;m<=j;m++)//打印上半部分沙漏
{
for(n=1;n<=2*j-m;n++)
{
if(n<=m-1)//每一行打印不同的空格数和字符数
printf(" ");
else
{
printf("%c",c);
sum++;//记录下打印了多少字符
}
}
printf("\n");
}
for(m=1;m<j;m++)//打印下半部分沙漏
{
for(n=1;n<=j+m;n++)
{
if(n<=j-1-m)//每一行打印不同的空格和字符
printf(" ");
else
{
printf("%c",c);
sum++;//记录下打印了多少字符
}
}
printf("\n");//换行
}
printf("%d",N-sum);//输出剩余的字符数
return 0;
}
四、实验的分析与思考
1、 找出最小值
先令第一个数等于最小值,然后通过循环比较后面的数,小于最小值则赋值给最小值。
2 打印九九口诀表
利用双重循环分别对行和列进行控制。
3 计算阶乘和
先利用循环进行阶乘运算,然后求和。
4 求整数段和
把两个数中间的数打印出来,一个数字占五位并记录打印的次数,每当打印次数为5的倍数的时候,换行一次,当打印总次数为五的倍数的时候最后不换行。
5 统计学生成绩
根据学生的成绩通过循环进行和条件的比较,符合条件则相应数加一。
6 特殊a串数列求和
先利用循环求出aa...a的值,再求和
7 水仙花数
把每一位数都算出来,利用循环来求他们的N次方,再求和,判断是否符合条件。
8 打印沙漏
先算出能打印沙漏的上半部分行数的最大值,然后在根据数量关系打印上半部分沙漏,之后再根据数量关系打印下班部分沙漏。
假设N=5,上半部分最大行数为j=3
行数 空格 字符 sum 所以行数于sum的关系为sum=N+1-行数
1 0 5 5 空格数于行数的关系为空格数等于行数-1
2 1 3 4
3 2 1 3
行数 空格 字符 sum 所以行数于sum的关系为sum=行数+j
1 1 3 4 空格数于行数的关系为空格数等于j-1-行数
2 0 5 5 空格数逐渐增大就加行数,逐渐减小就减行数