C语言刷题常出错误(一)

文章目录

  • 案例
    • ==1、第一题==
      • 易错点
        • 1.switch里的break
        • 2.do-while中的判断部分
    • ==2、第二题==
      • 易错点
        • 1. \n的问题
        • 2.srand的起点设置
        • 3.搞清楚,什么是要循环的
        • 4.while里面的循环条件
    • ==3.第三题==
      • 易错点
        • 1.关于for循环变量判断部分的数值
    • ==4.第四题==
      • 易错点
        • 1.循环体要打印初始值基础上加几的数字
        • 2.关于外层循环的理解

案例

1、第一题

题目:生成一个猜数字的菜单,如果输入1就开始游戏,0就退出游戏,如果没有输入0或者1,就让它重新输入

#define _CRT_SECURE_NO_WARNINGS 1
#include 
void menu()
{
	printf("**************\n");
	printf("*** 1.play ***\n");
	printf("*** 2.play ***\n");
	printf("**************\n");
}
int main()
{
	int input = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			printf("请猜数字\n");
			break;
		}
		case 0:
		{
			printf("输入错误");
			break;
		}
		default:
			printf("输入错误\n");
			break;
		}

	} while (input);
	return 0;
}

易错点

1.switch里的break

break是满足这项之后,就可以退出有这个case所控制的语句。
虽然确实有,满足某些条件一起执行的情况,但若没有明显要求,最好习惯性加上break,避免出现一些错误。

2.do-while中的判断部分

如果while里的表达式是一个变量,那么这个变量不可以在do里面的循环语句中声明定义
因为局部变量出局部范围会被销毁

2、第二题

题目:生成一个随机数,并且进行猜测

void menu()
{
	printf("**************\n");
	printf("*** 1.play ***\n");
	printf("*** 0.exit ***\n");
	printf("**************\n");
}
void ganme()
{
	//生成一个随机数
	int ret = rand()%100+1;
	//猜数字
	int k = 0;
	printf("请猜数字:");
	while (1)
	{
		scanf("%d", &k);
		if (k == ret)
		{
			printf("猜对了");
			break;
		}
		else if (k < ret)
		{
			printf("猜小了");
		}
		else
		{
			printf("猜大了");
		}
	}
}

易错点

1. \n的问题

\n是换行符,如果没有换行,只会在同一行,但是在编译器编写的时候,常常会忽视,需要注意

2.srand的起点设置

  • srand是用来设置rand随机数的生成起点,只要设置一次即可,如果设置多次,生成的数字就会很临近,所以最好在main函数里面找一个只会执行一次的地方
  • 不是放在rand函数里面的,单独执行
  • 里面要放随机值,建议使用time函数,用时间戳

3.搞清楚,什么是要循环的

该题目中,猜数字是要循环的一个动作,不能少了while。
遇到这种情况,一开始大致理思路的时候,要想好,不要被顺序思维混淆

4.while里面的循环条件

循环那边设置可以一直循环(比如用1),退出利用break
使用场景:确定退出的情景,难以在while里面描述,情况较复杂

int的范围:-2147483648 ~ 2147483647

3.第三题

#include 
int main() {
    int num = 0;
    scanf("%d", &num);
    int i = 0;
    int sum = 0;
    if (num >= 12)
    {
        for (i = 0; i < num / 12; i++)
        {
            sum += 4;
        }
    }
    if (num %12 < 12)
    {
        sum += 4;
    }
    printf("%d", sum);
    return 0;
}

易错点

1.关于for循环变量判断部分的数值

判断部分的变量数值是不会变化的,比如说上面num/10,只是给判断部分加了个限定范围,本身num变量的值是不会变的
如果忽略了这点,下面if语句里面直接写num<12,是会出错的

4.第四题

#include 
void len(int x,int y)
{
	int j = 0;
	for (j = 1; j <= x; j++)
	{
		printf("%3d", j * y);
	}
}
int main()
{
	int width = 0;
	scanf("%d", &width);
	int i = 0;
	for (i = 1; i <= width; i++)
	{
		//打印乘的横着的数
		len(width,i);
		printf("\n");
	}
	return 0;
}

易错点

1.循环体要打印初始值基础上加几的数字

一般来说,对于在原值基础上添加,有三种

for(i = 0;i<5;i++{
       printf("%d",i+=1);     //1 3 5
       printf("%d",i+1);     //1 2 3 4 5
       printf("%d",i++);     //0 2 4
}

由此可以得出结论,第一种和第三种会改变i变量里面的值

2.关于外层循环的理解

for(i = 1;i<=4;i++//产生1-4的数字
{
    printf("%d",i);    //把1-4的数字打印出来,具象化
}

打印出来是具象化,事实上就算是没有打印出来,也已经隐性成第几层的基础数值是几
就跟游戏里面的基础属性一样,算是角色自带的属性,后期加的什么装备,就都是累乘的效果了

你可能感兴趣的:(C语言解题总结,c语言,开发语言)