博客作业1
一、思维导图
二、语法认识
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
输出样例:
原本答案及解题思路:
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
输出样例:
原本答案及解题思路:
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:
输出样例1:
32 0.0
34 1.1
输入样例2:
输出样例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.若反面情况较多可先判断反面。