一、思维导图
二、语法认识
1、if-else
基本形式:
if(表达式) { 语句a; }else{ 语句b; }
使用方法 :
通过对表达式的判断,从而形成对算法的分支。可嵌套运用。
使用过程中遇到的问题:
语句与执行条件不对应。
解决方法:
程序缩进,一个一个找。
使用注意点:
·多执行语句时,需加上中括号。
·多分支时,也需加上中括号。
·程序缩进,使程序简洁,方便查看。
2、switch
基本形式:
switch(表达式){ case 常量表达式1:语句a;break; case 常量表达式2:语句b;break; ... case 常量表达式n:语句n;break; default:语句n+1;break; }
使用方法:
1.与if-else相似,判断相应的条件,选择运行相应的结果;
2.可选择从哪种条件开始,输出哪几种情况。
使用过程中遇到的问题:
1.case后为赋值表达式;
2.运用于选择问题时,语句后没加break。
解决方法与注意点:
·知道了常量表达式和表达式的值一般是整型或字符型。
·记住了用switch解决选择问题时,需加break语句。
3.for
基本形式:
for(表达式a;表达式b;表达式c;) { 循环体语句; }
使用方法:
在给定的条件下,从某个地方开始让系统重复做某些动作,到某个地方停止。
使用过程中遇到的问题:
表达式b与表达式c的用法记混。
解决方法与注意点:
·表达式1为指定循环起点,表达式2为给出的循环条件,表达式3为重复的次数。
4.while
基本形式:
while(表达式){ 循环体语句; }
使用方法:
通过对表达式的判断,进行对特定语句的重复。
使用过程中遇到的问题:
对循环体执行次数的不清楚导致运算错误。
解决方法与注意点:
·当while语句循环到最后一个符合条件时,程序执行完循环体语句后,再回到上面进行判断,若不符合条件,就进行while语句后面的语句。
5.do-while
基本形式:
do{ 循环语句; }while(表达式);
使用方法:
先执行循环语句一次,后在表达式条件下,再进行这些语句的重复。
使用过程中遇到的问题:
不清楚循环语句运行的次数。
解决方法与注意点:
·判断是否执行方式与while语句相似,只是不管符不符合条件,循环体都会执行一次。
6、break以及continue
break:
作用:强制循环结束。
用法:·switch语句中用于语句后面;
·其他循环语句中一般与if语句配合使用。
continue:
作用:跳过循环体中continue后面的语句。
用法:·在循环体中一般与if语句配合使用。
三、pta分数
四、pta题目分析
1、题目: 2.3,2.4作业 :7-3 求简单交错序列前N项和
本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。
输入样例:
10
输出样例:sum = 0.819
原本答案及解题思路:
int main() { int i =1,N,n =0; double s =0; scanf(%d,&N);//输入正整数N s = s + 1.0/i;//求第一项的和 i = i + 3;//定义成交错序列 n = n + 2;//判断加的次数 do{ if(n%2==0){//判断加的次数的奇偶以此来确定加减 s = s-(1.0/i); i = i +3; n = n +1; }else{ s = s + (1.0/i); i = i + 3; n = n + 1; } }while(n<=N); printf("sum = %.3f",s); }
改正答案:
int main() { int i = 1, n = 1, N = 0; double sum = 0; scanf("%d", &N); do { if (n % 2 == 0) { sum = sum - (1.0 / i); i = i + 3; n = n + 1; } else { sum = sum + (1.0 / i); i = i + 3; n = n + 1; } } while (n <= N ); printf("sum = %.3f", sum); }
改进方面:
1.将相同句式放进循环体中使程序简洁;
2.int i, n= 1;不代表int i = 1,int n = 1;
感悟:做交错相加减的题目可先定义一个变量sign,设sign = 1;
每次循环sign = -sign;sum = sum + sign*(1.0 / i);
2、题目: 2.3,2.4作业 : 7-2 求奇数分之一序列前N项和
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
23
输出样例:sum = 2.549541
原本答案及解题思路:
int main() { int i = 1,N,n = 0; double s = 0 ; scanf("%d",&N);//输入正整数N do { s = s +1.0 / i; i = i +2;//使所加值为奇数 n = n +1;//判断所加的次数 } while(n <= N); printf("sum = %.6f",s); }
改进答案:
int main() { int i = 1,N,n = 0; double sum = 0 ; scanf("%d",&N); do { sum = sum +1.0 / i; i = i +2; n = n +1; } while(n <= N-1); printf("sum = %.6f",sum); }
改进方面:
1.将N改为N-1使加的次数减少一次;
感悟:因为在do-while循环语句中,最开始n=0执行了一次,而条件是n<=N,所以语句又循环了N次,所以语句总共循环了N+1次。
3、题目: 2.3,2.4作业 : 7-4 输出华氏-摄氏温度转换表
输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。
温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。
输入格式:
在一行中输入2个整数,分别表示lower和upper的值,中间用空格分开。
输出格式:
第一行输出:"fahr celsius"
接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。
若输入的范围不合法,则输出"Invalid."。
输入样例1:32 35
输出样例1:fahr celsius 32 0.0 34 1.1
输入样例2:40 30
输出样例2:
原本答案及解题思路:
#include<stdio.h> int main() { int lower =0; int upper =0; int read; double c =0; scanf("%d %d,&lower,&upper");//输入lower,upper的值 if(lower<=upper&upper<=100){//判断lower<=upper且upper<=100 read = (lower,upper);//取取值范围在lower,upper之间的数 c = 5.0 *(read -32)/9; printf("fahr celsius\n"); printf("%d %.f\n",read,c); read = read + 2;//增加2华氏度 c = 5.0 * (read -32)/9; printf("%d %6.f",read,c); }else{ printf("Invalid."); } }
改进答案:
#include <stdio.h> int main() { int lower; int upper; scanf(" %d", &lower); scanf(" %d", &upper); if (lower>upper ||lower>100 || upper>100) { printf("Invalid.\n"); return 0; } printf("fahr celsius\n"); int i ; int fahr; double celsius; for (i=lower; i<=upper; i+=2) { fahr = i; celsius = 5.0 * (fahr - 32) / 9; printf("%d", fahr); printf("%6.1lf\n", celsius); } return 0; }
改进方面:
1.先进行判断,后用循环来增加值。
感悟:1.在编程中和要输"&&";
2.结合样例理解好问题;
3.若反面情况较多可先判断反面。