博客1
一.C语言思维导图:
二.语法认识:
1. if-else语句使用:
A:
if(表达式1){
语句1;
}
else(表达式2){
语句2;
}
执行流程:先求表达式,若表达式的值为“真”,就执行语句1;若表达式值为“假”,就执行语句2。语句1和语句2总要执行一个,但是不会都执行。
B:
if(表达式){
语句2;
}
执行流程:先求解表达式,若表达式为“真”,就执行语句1;若表达式为“假”,就什么也不做。
遇到的问题:不会怎么写if-else的表达式即条件语句。
解决方法:仔细审题,理清逻辑,明晰条件分类。
注意:if()后面没有分号,直接写{}
2. switch语法使用:
switch(表达式){
case 常量表达式1:语句段1;break;
case 常量表达式2:语句段2;break;
...
case 常量表达式n: 语句段n;break;
default: 语句段n+1; break;
}
执行流程:先求表达式,若表达式的值与某个常量的表达式相等,则执行常量表达式后的相应语句段,若表达式的值与任何一个表达式常量不相等,则执行default后的语句段,最后执行break语句,跳出switch语句。
遇到的问题:不知道表达式和常量表达式处要填什么;还出现了格式问题。
解决方法:理解switch想表达的是什么,规范代码编译,多在VS里编译以熟练switch的运用。
注意:
-
在case后的各常量表达式的值不能相同;
-
在case子句中若没有break;会一直往后执行直到遇到 break;才会跳出switch语句。
-
表达式和常量表达式的值一般是整型或字符型。
-
在case后,允许有多个语句,也可为空语句。
-
case和default是可以调换顺序的,default可以省略。
3. for语法使用:
for(表达式1;表达式2;表达式3;){
循环体语句
}
执行流程:先计算表达式1;在判断表达式2;若值为“真”,则执行循环体语句,并接着计算表达式3,然后继续循环;若值为“假”,则结束循环,继续执行for的下一条语句。
遇到的问题:不会确定输出值是在循环中还是再循环结束后,也不知道表达式1是从什么时候开始执行的。
解决的方法:分清所要输出的值是在循环体中得到输出的还是再循环结束后输出的,尝试多次以不同的值在vs中输入表达式1,以悟出表达式1的作用。
注意:
- for语句中用两个分号分隔三个表达式,但for的后面无分号。
- for语句中的三个表达式以及循环体语句的执行顺序和书写顺序有所不同,计算表达式3在执行循环体语句之后。
- for语句中的表达式1只执行一次。
4. while语法使用:
while(表达式){
循环体语句
}
执行流程:当表达式的值为“真”时,循环值行,直到表达式的值为“假”循环中止并继续执行while的下一条语句。
注意:
- while语句中的表达式(循环条件)一般是关系表达式或逻辑表达式。
- 一定要记着在循环体中改变循环变量的值,否则会出现死循环(无休止的执行)。
- 循环体若包括一个以上的语句,则必须用{}括起来,组成复合语句。
5. do-while语法使用:
do{
循环体语句
}while(表达式);
遇到的问题:少写了while表达式后的分号导致编译错误。
解决方法:记住并在打完所有代码块后检查一遍基本的框架格式是否正确。
注意:
- do-while循环至少要执行一次循环语句。
- while括号后面必须要有分号。
6. break以及continue的语法使用:
- 在没有循环结构的情况下,break不能用在单独的if-else语句中。
- 再多层循环的语句中,一个break语句只跳出当前循环。
- continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,continue语句一般也需要与if语句配合使用。
- contiune语句与break语句的区别:break是结束循环,而contiune只是跳过后面的语句继续循环。break除了可以中止循环外,还可用于switch语句,而contiune只能用于循环。
三. PTA分数截图:
四. PTA代码分析:
1.
代码:
#include<stdio.h>
int main()
{
int i, N, denominator, flag;
double item, sum;
scanf("%d", &N);
denominator = 1;
flag = 1;
item = 1;
sum = 0;
for (i = 1; i <= N; i++) {
item = flag * 1.0 / denominator;
sum = item + sum;
denominator = denominator + 3;
flag = -flag;
}
printf("sum = %.3f\n", sum);
return 0;
}
代码思路:这是一个求和的代码,一般要用到循环结构,每个数是分数,就要先了解分子和分母的变化规律,确定分子和分母后,再求和。
错误点:容易忽略sum是double型的即item处会少了(*1.0),导致答案错误
学到了:遇到求和是可以用每一个数每一个符号都拆分为一条语句来计算它变化后值,再来求和。(逐个突破,再求和)
2.
代码:
#include<stdio.h>
#include <math.h>
int main()
{
int lower, upper, fahr;
double celsius;
scanf("%d %d", &lower, &upper);
if (lower > upper) {
printf("Invalid.");
}
else {
printf("fahr celsius\n");
for (lower; lower <= upper; lower = lower + 2) {
fahr = lower;
celsius = 5.0 * (fahr - 32) / 9;
printf("%d%6.1f\n", fahr, celsius);
}
}
return 0;
}
代码思路:此题有因在不在范围而有两种输出,说明此处有一分支结构,内有取值范围且有”每次增加2“的字眼可知这部分是一个循环结构循环的次数由(lower<=upper)决定。
错误点:没有意识到fahr是从lower开始,理解错误导致代码计算错误。
学到了:审清题目所包含的意思,构思好基本的框架,理清思路在编译。
3.
代码:
#include<stdio.h>
int main()
{
int blank, letter, digit, other,i;
char ch;
blank = letter = digit = other = 0;
for (i = 1; i <= 10; i++) {
ch = getchar();
if (ch == ' ' || ch == '\n') {
blank++;
}
else if ((ch>='0') &&(ch<='9') ) {
digit++;
}
else if ((ch >= 'a' && ch <= 'z') || (ch>='A' && ch <= 'Z')) {
letter++;
}
else {
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
return 0;
}
代码思路:因输入的是10个字符并且需要逐个分析,因此此处会有一个循环结构,在循环中,会因输入的字符的类型不同而出现了分支结构。由此,构成了一个循环-分支镶嵌结构。
错误点:在写if()后的表达式是没有注意到英文字母需要用单引号(' ')来括起来,也没有注意到优先级的顺序。
学到了:打代码是要心细胆大,要敢于尝试不同的代码方法,也要注意细节问题,参透知识点,把知识点运用到实践中。