第一次博客园作业

一.思维导图

二.写出自己对以下语法的认识

1.if-else

if(表达式){
     语句1;
}else{
     语句2;
}

遇到的问题:有时候遇到嵌套的if-else容易看错 { 和 },导致编译错误。
解决的方法:严格按照规范形式写代码。
注意点:判断两者是否相等的时候要用 == 而不是=;else总是和距离它最近的if配对。

2.switch

switch(表达式){
     case 常量表达式1:
     语句1;
     break;
     ······
     case 常量表达式n:
     语句n;
     break;
     default:
     语句n+1;
     break;
}

遇到的问题:基本没有
注意点:break和default都可根据实际情况而省略,如果省略default,若case的常量表达式都不满足条件,则不执行任何语句。

3.for

for(语句1;语句2;语句3){
     循环体;
}

遇到的问题:基本没有
注意点:语句1为循环的初始化条件(即使不满足语句二的条件,未进入循环体,语句1执行后的结果依旧保留下来);语句2为判断循环是否进行的条件;语句3为每次循环结束执行的操作。

4.while

while(循环条件){
     循环体;
}

遇到的问题:无
注意点:无

5.do-while

do{
     循环体;
}while(循环条件);

遇到的问题:无
注意点:while(循环条件)后要有分号; 与while循环的区别在于:先进入循环体,再判断循环条件,即至少循环一次。

6.break以及continue

break:结束循环 或 跳出switch-case语句。
continue:不执行continue后的语句,直接开始下一次循环。

三.pta分数截图



四.pta代码分析

题目1:

#include<stdio.h>
#include<math.h>
int main(){
    int m,n,i;
    scanf("%d %d",&m,&n);
    double sum=0.0,a;

    for(i=m;i<=n;i++){
        a = pow(i,2)+1.0/i;
        sum += a;
    }
    printf("sum = %.6f",sum);
    return 0;
}

1.思路:题目要求计算序列和,又已知m和n,很明显需要用到for循环 令i从i=m循环至i=n,同时使用变量sum求和,最后根据题目要求精确到小数点后6位 用%.6f输出sum。
2.错误及原因:在计算1/m及1/(m+1)等等表达式时,忘记了是用int定义的m和n,导致出错。改进方法有两个:一个是用double定义m和n;还有一个方法是用1.0/m 。
3.学到了:以后再遇到/号要格外小心变量是整型还是浮点型。

题目2:

#include<stdio.h>
int main(){
    int i,letter=0,blank=0,digit=0,other=0;
    char x;
    for(i=0;i<10;i++){
        scanf("%c",&x);
        if((x>='a'&&x<='z')  || (x>='A'&&x<='Z'))/*判断是否为英文字母*/{
            letter++;
        }else if(x>='0' && x<='9')/*判断是否为数字*/{
            digit++;
        }else if(x==' '|| x=='\n')/*判断是否为空格或回车*/{
            blank++;
        }else other++/*其他字符*/;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
    return 0;
}

1.思路:已经确定输入十个字符,那就要用到for循环且循环十次,每次都读入一个字符,并判断字符属于题目划定的哪个类型,其他的思路见注释。
2.遇到的问题或错误:通过这道题初步认识了字符,原先不知道字符每次仅读了一个东西而不是一串字母或数字,而且空格和回车也会被读入,百度了才知道这些。
3.学到了:用char定义字符,且要加单引号' ',会读入空格或回车。

题目3:

#include<stdio.h>
int main(){
    int i=1,flag=1.0;
    double sum=0.0,eps,a;
    scanf("%le",&eps);
    do{
        a=1.0/i*flag;
        sum += a;
        i=i+3;
        flag=-flag;
        if(a<0){/*如果a是负的,那a就会小于正实数eps,会退出循环,所以如果a是负的就再乘一个-1,即让a的绝对值和eps去比较*/
            a=-a;
        }
    }while(a>eps);
    printf("sum = %.6f",sum);/*精确到小数点后六位*/
    return 0;
}

1.思路:先读入一个给定精度eps,由于不知道会循环几次,所以用while循环,直到最后一项的绝对值不大于给定精度eps后跳出循环。由于序列是正负交错的,所以定义了flag用来变号。在循环时,除了变号外,每一项的分母逐项加3,所以需定义一个变量i来充当分母,每次计算完a的值i都加3,并将a的值累加到求和变量sum上。最后输出sum。(少部分解释见代码)
2.错误或问题:科学计数法!! 4E-2的值是4*10^-2,并且需要用%le读入(百度是这么说的);忘记了计算a 的绝对值,直接用a去和eps比较。
3学到了:科学计数法的表示及读入。

原文地址:https://www.cnblogs.com/cjt0722/p/11668935.html