C语言 基于循环结构的程序设计(PTA)

一、实验目的

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      空格数逐渐增大就加行数,逐渐减小就减行数

 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码呀~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值