C语言知识点小结

一.思维导图

二.语法认知

1.if-else

if ( 条件1 )
{
  语句1;
}
else if(条件2)
{
  语句2;
}
else
{
  语句3;
}

语法使用方法 else-if可以写多个;else可以不写;if语句可以嵌套,且else必与前面最近的未配对的if语句组成配对关系,不能单独使用;其执行结果只有“1”(成立)或“0”(不成立)。
遇到的问题 未能理解else与if的配对关系,将其逻辑顺序搞错。
解决方法 牢记else与if的配对关系,时刻将{}跟在if语句之中,规范书写格式,多练。

2.switch

switch(控制表达式)
{
  case '常量‘:
  语句1;
  break;
  case '常量’:
  语句2;
  break;
  ······
  default:
  语句n;
}

语法使用方法 控制表达式只能是整数型的结果;常量可以是常数,也可以是常数计算的表达式;break作用:跳出循环并直接执行下一个语句;如果没有break,就会按顺序执行下面的case,直到遇到一个break,或者switch结束为止;case作用:只是一个路口(分支标号),非一段的划分;case后的语句具有唯一性。
遇到的问题 忘记break的作用,不知道什么时候用switch语句。
解决方法 基本数据类型为整型时使用switch语句;case,break,defualt灵活使用。

3.for

for(初始条件;循环继续的条件; 循环每轮要做的条件)
{
  循环体;
}

语法使用方法 初始条件非初始化,所以前面要加初始化语句;循环每轮要做的条件是第二次开始执行; for相当于“对于”;for循环的意思:对于一开始的初始条件,当符合循环继续的条件时,重复做循环体,每一轮循环在做完循环体后,使得循环每轮要做的条件;for循环的for中的每一个表达式都是可以省略的。
遇到的问题 搞错循环次数,有时循环每轮要做的条件不足,循环体中有时由于逻辑不够完整以至于缺少一些语句。
解决方法 进行多次尝试,从循环继续的条件和循环每轮要做的条件入手,最后再在循环体中进行调试,查找逻辑漏洞。

4.while

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

语法使用条件 while语句:当循环条件满足时,不断重复循环循环体内的语句;循环执行之前要判断是否执行,否则可能一次也不执行;循环体要有改变条件的机会;循环条件可以直接写“1”或“0”;while循环可以嵌套;for(;条件;)==while(条件)。
遇到的问题 可能会进入死循环。
解决方法 注意循环条件中的条件运算符不要写成赋值运算符,否则会从判断条件是否成立变为赋值。

5.do-while

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

语法使用条件 do-while循环在进入循环时不做检查,而是在执行完一轮循环体内的代码后,再检查循环条件是否满足,如果满足则进行下一轮循环,不满足则结束循环。
遇到的问题 忘记do-while循环会先执行一次代码。
解决方法 记住它要先循环再判断。

6.break和continue

beak;
continue;

语法使用条件 break:强行结束循环并执行下一条语句;continue:对于for循环,跳过循环体其余句子,走向for的括号里.对于while和do-while循环,跳过循环体剩余的句子,走向循环条件的判断;break能用于循环语句和switch语句中,而continue只能用于循环语句中;break是中断整个循环,而continue只是结束本次循环中;循环嵌套时,break和continue只影响最里面的循环。
遇到的问题 忘记break和continue的区别。
解决方法 记住就好,多练,经常练题。

注:循环什么时候一定要用for和do-while

用for:有固定次数(或数字明确)时使用;用do-while:循环必须执行一次时使用;其它条件用while或个人使用习惯。

三.PTA分数截图

2.3 2.4作业

第3章作业

4.1作业


四.PTA代码分析

代码1

#include<stdio.h>
int isprime(int i);
int main()
{
	int m, n;
	int i;
	int sum = 0, cnt = 0;

	scanf("%d %d", &m, &n);
	if (m == 1)
	{
		m = 2;
	}
	for (i = m;i <= n;i++)
	{
		if (isprime(i))
		{
			sum+=i;
			cnt++;
			
		}
	}
	printf("%d %d", cnt, sum);
	return 0;
}
int isprime(int a)
{
	int ret = 1;
	int j ;
	for (j = 2;j < a - 1;j++)
	{
		if (a % j == 0)
		{
			ret = 0;
			break;
		}
	}
	return ret;
}

代码思路:

1.设置自定义函数来判断是否为素数,这里可以利用1(是)和0(非)进行判断。
2.由题意得输入数值从1开始,而1非素数,所以前面需先判断输入数值是否为1。
3.若为1,则将2赋值给输入数值(即输入数值进1);若输入数值>=2,则进入输入每一个递增数值的循环,因为有固定次数,所以选择for循环。进入输入 数值的for循环后,再通过素数的是非判断(条件就是自定义函数)来进行素数的求和。
4.输出素数求和。
5.在自定义函数中,使用for循环将递增的每个小于输入数值的递增值带入,利用“输入数值%小于输入数值的值”的方法判断是否为素数。这里需要加入 break,这样的话只要第一次判断非素数就可退出循环,提高代码效率。

注意事项:

定义用的字符不能和函数名称重复;注意自定义函数的返回;答案错误有可能是for循环的初始条件和循环继续的条件问题。

收获:

巧妙利用“1”和“0”。

代码2:


#include<stdio.h>
int mypow(int x, int y);
int main()
{
	int N, n, a=0;
	int i, b;
	int e=1;
	scanf("%d", &N);
	int value = mypow(10, N);
	for (i = mypow(10, N-1);i <value;i++)
	{
		b = i;
		for (e = 1;e <= N;e++)
		{
			n = b % 10;
			a += mypow(n, N);
			b /= 10;
		}
		if (a == i)
		{
			printf("%d\n", a);
		}
		a = 0;
	}
	return 0;
}
int mypow(int x, int y)
{
	int d;
	int ret = 1;
	for (d = 0;d < y;d++)
	{
		ret *= x;
	}
	return ret;
}

代码思路:

1.因为<math.h>的运算速率慢,所以需自定义设置求个位数的n次方函数。
2.输入n位正整数,再进入所有n位递增正整数的for循环(循环次数明确)。
3.在for循环里进行嵌套,进行整数分解并进行每个数的n次方(函数)求和。
4.判断该整数分解后求和的值是否与整数相等,若相等,输出该正整数。
5.在函数中使用for循环进行整数分解的n次方计算。

注意事项:

在进行整数分解求和之前需先另外定义一个值并将正整数赋值给它,因为若直接使用原本的正整数,则随着后面的计算,这个数会被改变;后面的整数分解求和的数值每与正整数进行判断后要重新将零赋值给它,否则它会叠加数值,最后超出数字范围。

收获:

对于一些变量,要注意后面是否要初始化;思考过程要具有完整性;设置变量最好不要重复。

代码3:

#include<stdio.h>

#include<math.h>

int main() 
{

	int d,flag;

	double sum,eps,item;

	sum = 0;

	scanf("%lf", &eps);

	flag = 1;

	d = 1;

	item = 1.0;

	do{

		item = 1.0 * flag / d;

		flag = -flag;

		sum += item;

		d = d + 3;

	} while (fabs(item) > eps);

	printf("sum = %.6f\n", sum);

	return 0;

}

代码思路:

1.要使用数学函数,后面使用绝对值时需要。
2.定义和,定精度,分母,分数,因为后面有有规律的正负数,所以还需要定义一个flag来代表正负。输入定精度。
3.因为无论输入什么值都需要循环一次,所以使用do-while循环进行求和计算。
4.输出和。

注意事项:

因为分数的值不为整数,所以需要使用double来定义。因为flag为整数型,而分数为浮点型,所以计算分数时需要在前方乘以1.0使结果为浮点型(浮点误差);while后要加“;”。

收获:

看题;浮点误差。

posted @ 2019-10-13 22:51  黎里  阅读(1235)  评论(2编辑  收藏  举报