C博客作业02—循环结构

0.展示PTA总分(0----2)

截图展示2次题目集:单循环和嵌套循环题目集,排名分数截图。


1.本章学习总结(2分)

1.1 学习内容总结

整理这两周学习主要知识点,并能对每个知识点介绍简单案例或语法

1.嵌套循环

顾名思义,就是循环之中套有循环,从而达到多次重复运算,获得结果的目的。


//判断N位数中所有水仙花数

#include 
#include 
int main()
{
    double N;   //输入要求的几位数;
    int a;   //N位数的下界;
    int t;   //临时变量,储存;
    int i = 0;   //循环数;
    int s = 0;   //各位数立方的和;

    scanf("%lf", &N);
    a = pow(10, N - 1);   //计算立方;
    t = a;
    while (N >= 3 && N <= 7)   //主循环;判断输入位数范围;
    {
        while (pow(10, N - 1) <= a && pow(10, N) >= a )   //子循环;判断范围之间的数是否符合;
        {
            t = a;
            while (i < N)   //孙子循环;计算位数立方和;
            {
                s = s + pow(t % 10, N);
                t /= 10;
                i++;
            }
            i = 0;
            if (a == s)
            {
                printf("%d\n", a);
            }
            a++;
            s = 0;
        }
        break;
    }

    return 0;
}

         同样的,for循环,do_while循环也是相同的。
  • (1)这里要注意两个语句,break语句和continue语句区别。
    • break语句跳出的是整个循环,它不仅可以在循环语句中使用,同样的,switch语句中仍然可用它跳出。它会使整个语句结束。
    • continue语句跳出的是本次循环,即遇见它本循环语句结束,但是它不能出现在switch语句中。
  • (2)循环条件
    • 在做题过程中可故意制造一些死循环,如while(1)循环体语句中用一个if语句判断条件是否成立,再用break跳出,节省了循环条件的控制。
    • 同样的,for(;;) ( for ()也可以 )中没有循环条件,所以就是无条件循环,就是只能通过循环体中的内容来跳出循环。

2.函数

1.自定义函数

  • 使用优点
    • 相同功能的代码可以放在同一个函数内,供其他函数调用。 解决代码重复问题,更简洁。 可读性更好,
    • 代码扩展性更好。增加新的功能,不需要更改其他函数。
    • 代码维护性更好。查错针对某个功能函数检查。
  • 结构

[数据类型说明] 函数名称 (参数)
{
    执行代码块;
    return (表达式);
}
  • 一般推荐把自定义函数放在main()函数前面。如果放在main()后面还需要对函数进行声明。

2.函数调用

  • 我们需要用到自定义的函数的时候,就得调用它,那么在调用的时候就称之为函数调用。在C语言中,函数调用的一般形式为:函数名([参数]);
    注意:
    • 1.对无参函数调用的时候可以将[ ]包含的省略。
    • 2.[ ]中可以是常数,变量或其它构造类型数据及表达式,各参数之间用逗号分隔。

3.参数


//在函数中不需要函数参数的称之为无参函数,在函数中需要函数参数的称之为有参函数,有参和无参函数的一般形式如下:
[数据类型说明] 函数名称 (参数列表)   //有参;有参函数更为灵活,可以控制输入值,而无参就比较死板了。
{
    执行代码块;
    return (表达式);
}

[数据类型说明] 函数名称 ()//无参;
{
    执行代码块;
    return (表达式);
}
  • 形参实参
    • 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,相当于接受站。实参是在调用时传递该函数的参数相当于一个发射站,其信息可以被被调函数使用。
    • 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。(划重点!!)
    • 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。

4.返回值

  • 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
  • 利用函数返回值可以进行真假的判断;
//返回两个整数中较大的一个
int max(int a, int b)
{
    if (a > b)
    {
        return a;
    }
    else 
    {
        return b;
    }
}

3.变量

  • 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内。
  • 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

1.2 本章学习体会

  • 学循环的时候变量的改变有点生疏,尤其是到临界点的时候,该不该进下一个循环,如何重新赋值,如何构造一个循环这样子的不是太懂。我做的时候必须借用草稿纸在纸上把思路理清了才能去做,但是这样速度很慢。更加深入的学习让我真正理解到计算机这门学科果真十分注重实践,很多时候,在你脑海中是一回事,你打成代码是一回事,它一运行又是一回事。这真的让人苦恼。也会是我突破的方向吧。
  • 计算这两周代码量
第七周 第八周 总计
620 750 1270

2.PTA实验作业(6分)

从PTA题目集中选3题你最满意的题目,题目选难度越大,分值越高。每题2分,做如下内容:

2.1 查询水果价格

2.1.1 伪代码


int main()
{
    输出菜单;                     //这里同样可以加一个自定义函数来做;

    int choice;
    int i;

    for (i = 0; i <= 4; i++)    //利用一个循环语句,控制数入的次数;
    {
        scanf("%d", &choice);
        
        当数入为0时,直接退出    if (choice == 0) break;

        switch (choice)
        {
           判断choice的值,输出相对应的价格;
        }
    }
    return 0;
}

2.1.2 代码截图

C博客作业02—循环结构_第1张图片

2.1.3 造测试数据

输入数据 输出数据 说明
1 price=3.00 一个数,正确
1 1 2 2 2 price = 3.00(换行)price = 3.00(换行)price = 2.50(换行)price = 2.50(换行)price = 2.50 恰好5个数
1 0 price=3.00 输入0结束

2.1.4 PTA提交列表及说明

C博客作业02—循环结构_第2张图片
1.部分正确:用scanf()输入的时候,每个数字间用空格隔开,导致输出结果的格式总是错误;
2.部分正确:刚开始的时候没有想到在printf()中换行符之后加一个空格,就开始疯狂改动其他的。。。
3.部分正确:在我改格式的时候解决了超过范围数字,恰五位数字等输出情况,终于解决了问题。
总结:应该在vs上整好再交pta的当初我一度怀疑是不是pta出了问题,心态爆炸。。~


2.2 题目名 求n以内最大的k个素数以及它们的和

2.2.1 数据处理


int n;
int Prime()
{
    自定义函数,如果是素数返回1,不是的话返回0;
}
int main()
{
    返回素数,传递符号 +%d
    计算素数和,输出结果;
}
    return 0;
}

2.2.2 代码截图

C博客作业02—循环结构_第3张图片

2.2.3 造测试数据

输入数据 输出数据 说明
1000 10 997+991+983+977+971+967+953+947+941+937=9664 结果正确
12 6 11+7+5+3+2=28 结果正确,形式正确

2.2.4 PTA提交列表及说明

C博客作业02—循环结构_第4张图片
1.编译错误:这道题我在vs上演示了很长时间,才放在pta上,复制的时候出现了错误。
2.答案错误:没有考虑到0,1,2的情况,所以不正确;


2.3 题目名 换硬币

2.3.1 数据处理

int main()
{
    int count5 ;
    int count2 ;
    int count1 ;
    int counttoal = 0;//总方案数
    int x;//数入的金额;

    scanf("%d", &x);    
    使用三个循环分别计算5分,2分,1分出现的数量可能;
        凑到结果为输入金额;
    return 0;
}

2.3.2 代码截图

C博客作业02—循环结构_第5张图片

2.3.3 造测试数据

输入数据 输出数据 说明
8 fen5:1, fen2:1, fen1:1, total:3(换行)count = 1 最小x
13 ```结果太多,不便展示 结果正确

2.3.4 PTA提交列表及说明

C博客作业02—循环结构_第6张图片

总结:这是一个逗号引起的惨案。。
1.答案错误:黑人问号?明明在vs上面写对了,为什么结果错误?
2.答案错误:一定是pta搞错了我没有仔细发现程序问题;
3.答案错误:心态爆炸ing....
4.答案正确:求助大佬,发现,要求英语逗号,我的是汉语逗号。。。当场自闭。


3.代码互评(2分)

找2份同学代码,和自己代码比较,建议互评代码尽量找代码风格差异较大。
1.同学代码截图
C博客作业02—循环结构_第7张图片
自己代码截图
C博客作业02—循环结构_第8张图片

  • 1.我感觉两份代码在想法上是共通的,同学的代码每进行完一次循环后进入下一层,讲所有的可能求出,取余额,再次进入下一层。我的代码用的是比较粗暴一点的方法。但结果相同;
  • 2.同学的想法比较细致,考虑到每一种情况该如何计算,而我的代码比较简介。这是我要学习的地方。

2.同学代码截图
C博客作业02—循环结构_第9张图片
C博客作业02—循环结构_第10张图片
自己代码截图
C博客作业02—循环结构_第11张图片

  • 1.想法思路大致相同,都是构造一个自定义函数。不过,自定义函数放置位置不同而已。当自定义函数放在main() 函数前面时,不需要进行函数的声明
  • 2.都利用了自定义函数中return的返回值判断是不是素数。然后同学的代码将cnt即素数的位置分开看,第一位printf(''%d'', i) 其他的位置都多输出一个''+''。最后一位是输出''=%d'',给了我这样的一种思考方法。而我的代码引进了一个位置变量position,判断输入素数所在的位置,再决定出去内容。

你可能感兴趣的:(C博客作业02—循环结构)