C语言——九种控制语句

一、条件判断语句也叫分支语句:if语句,switch语句

1、if语句

(1)格式1


if(条件)

{

        语句;        

}

只有条件为真,语句才能进行

#include 

int main()
{
	if (0)
	{
		printf("你好");
	}
	return 0;
}

0为假,语句不会运行

运行结果为

#include 

int main()
{
	if (1)
	{
		printf("你好");
	}
	return 0;
}

1为真,语句会运行

运行结果为

因为比较运算式的结果是0或1

条件里面也可以加比较运算式,比较运算式结果为1则运行语句,为0则不运行

#include 

int main()
{
	int a = 12;
	if (a < 13)
	{
		printf("你好");
	}
	return 0;
}


(2)格式2


if(条件)

{

        语句1;

}

else

{

        语句2;

}

int main()
{
	int age = 0;
	scanf("%d",&age);
	if (age >= 18)
	{
		printf("已成年");
	}
	else
	{
		printf("未成年");
	}
	return 0;
}


(3)格式3


if(条件1)

{

        语句1;

}

else if(条件2)

{

        语句2;

}

else

{

        语句3;

}

#include 

int main()
{
	int bmi = 0;
	scanf("%d",&bmi);
	if (bmi < 18)
	{
		printf("太轻啦");
	}
	else if(bmi >= 18.5 && bmi < 24)
	{
		printf("正常");
	}
	else
	{
		printf("太重啦");
	}
	return 0;
}


(4)小细节


else与其离得最近的if匹配

C语言——九种控制语句_第1张图片

没有输出任何东西,因为else绑定了最近的if,因为a = 0,所以条件1为假,后面的语句就不执行了相当于

#include 

int main()
{
	int a = 0, b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("1");
		else
			printf("2");
	}
	return 0;
}

如果想实现else与第一个if绑定,则需要用{}

如下

#include 

int main()
{
	int a = 0, b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("1");
		}
	}
	else
	{
		printf("2");
	}
	return 0;
}


(5)小技巧


正确写法

#include 


int main()
{
	int num = 3;
	if (num == 3)
	{
		printf("haha\n");
	}
	return 0;
}

改良写法

#include 

int main()
{
	int num = 3;
	if (3 == num)
	{
		printf("haha\n");
	}
	return 0;
}

可以防止 == 写成 = 而编译器不报错


2、switch语句

(1)switch语句


一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

switch(expression){
    case constant-expression  :
       statement(s);
       break; /* 可选的 */
    case constant-expression  :
       statement(s);
       break; /* 可选的 */
  
    /* 您可以有任意数量的 case 语句 */
    default : /* 可选的 */
       statement(s);
}

switch 语句必须遵循下面的规则:

  • switch 语句中的 expression 是一个常量表达式,必须是一个整型或枚举类型。
  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
  • case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。
  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
  • 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
  • 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。

例1:输入1~7数字,输出星期几

#include 

int main()
{
	int w = 0;
	scanf("%d",&w);
	switch (w)
	{
	case 1:
		printf("星期一");
		break;
	case 2:
		printf("星期二");
		break;
	case 3:
		printf("星期三");
		break;
	case 4:
		printf("星期四");
		break;
	case 5:
		printf("星期五");
		break;
	case 6:
		printf("星期六");
		break;
	case 7:
		printf("星期日");
		break;
	default :
		printf("错误");
		break;
	}
	return 0;
}

例2:输入1~5,输出weekday;输入6、7,输出weekend

#include 

int main()
{
	int w = 0;
	scanf("%d",&w);
	switch (w)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	default :
		printf("错误");
		break;
	}
	return 0;
}

case语句后面可以没有break语句,可以实现多个case语句匹配一个语句。

好习惯

在最后一个case语句的后面最好加一个break语句,防止以后再加case语句时会少一个break语句。


(2)default子句


一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。

每个switch语句中只能有一个default。

好习惯

在每个switch语句的最后加一个default子句,在default最后最好再加一个break语句。


(3)小知识


switch语句中expression可以放字符类型,因为字符类型的ASIIC码是整型

例1:四则运算

#include 

int main()
{
	double x, y;
	char op;
	printf("输入表达式:");
	scanf("%lf %c %lf", &x, &op, &y);
	switch (op)
	{
	case '+': 
		printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x + y);
		break;
	case '-':
		printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x - y); 
		break;
	case '*': 
		printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x * y);
		break;
	case '/':
		if (y != 0)
		{
			printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x / y);
			break;
		}
		else
		{
			printf("除数为0,不能进行除法运算!\n");
		}
	default: 
		printf("表达式有误!\n");
		break;
	}
	return 0;
}

(4)switch语句嵌套


switch语句允许嵌套。

您可以把一个 switch 作为一个外部 switch 的语句序列的一部分,即可以在一个 switch 语句内使用另一个 switch 语句。即使内部和外部 switch 的 case 常量包含共同的值,也没有矛盾。

#include 

int main()
{
    char ch1 = 'A';
    char ch2 = 'A';
    switch (ch1) 
    {
    case 'A':
        printf("这个 A 是外部 switch 的一部分\n");
        switch (ch2) 
        {
        case 'A':
            printf("这个 A 是内部 switch 的一部分\n");
            break;
        case 'B': /* 内部 B case 代码 */
            printf("这个 B 是内部 switch 的一部分\n");
            break;
        default :
            printf("错误\n");
            break;
        }
        break;
    case 'B': /* 外部 B case 代码 */
        printf("这个 B 是外部 switch 的一部分\n");
        break;
    default:
        printf("错误\n");
        break;
    }
	return 0;
}

内部switch语句的break只能跳出内部switch语句。

ch2可以换成ch1,即两个switch语句判断的是同一个变量。

例1:

#include 

int main()
{
	int n = 1, m = 2;
	switch (n)
	{
	//因为n = 1,所以从case 1开始
	case 1:
		m++;//m变成3
		    //因为没有break语句,所以控制流继续进行下面的语句
	case 2:
		n++;//n变成2
	case 3:
		switch (n)
		{
		case 1:
			n++;
		//因为n = 2,所以从case 2开始
		case 2:
			m++;//m变成4
			n++;//n变成3
			break;//break语句使内部switch语句结束
		default:
			printf("Error");
			break;
		}
	//接着进行外部switch语句中的case 4语句
	case 4:
		m++;//m变成5
		break;
	default :
		printf("Error");
		break;
	}
	//最后输出m = 5 n = 3
	printf("m = %d n = %d\n",m,n);
	return 0;
}

二、循环语句:while语句,for语句,do while语句

1、while语句

(1)while语句


当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。

只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。

C 语言中 while 循环的语法:

while(condition)
{
   statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。

在这里,while 循环的关键点是循环可能一次都不会执行。当条件为 false 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

例1:打印0~10

#include 

int main()
{
	int a = 0;
	while (a <= 10)
	{
		printf("%d\n",a);
		a++;
	}
	return 0;
}

例2:输入一个字符,输出一个同样的字符

#include 

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

int类型的变量接收getchar的原因是:

getchar函数的返回值是整型,因为getchar在读取错误或遇到end-of-file的情况时会返回EOF,而EOF被定义的值是-1,char类型变量只有1字节,存储不了负数,而int类型有4字节,可以存储负数。

C语言——九种控制语句_第2张图片

输出的时候会自动回车的原因是:

回车也是字符,也有ASIIC码,在输入a之后输入的回车在输入缓冲区,getchar从输入缓冲区获取字符,所以回车也会被getchar读取,然后被putchar输出。

小细节

#include 

int main()
{
	char password[20] = { 0 };
	printf("请输出密码");
	//提示输入密码
	scanf("%s",password);
	printf("请确认密码(y/n)");
	//提示确认密码
	int yn = getchar();
	if (yn == 'y')
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}
	return 0;
}

C语言——九种控制语句_第3张图片

1、在输入密码加回车后,没有输入y/n,就输出了no,原因是:

scanf从缓冲区读了密码123456,但scanf不会读回车,然后回车就被getchar读取,yn就被赋值为回车的ASIIC码,从而导致下面的if-else语句结果只能是运行else中的语句,打印no。

2、scanf不读取回车的原因是:

scanf读取的数据可以通过回车空格分开,所以scanf不会读取回车空格

3、scanf中的password未加&,原因是:

数组的名字可以做地址。

改进

#include 

int main()
{
	char password[20] = { 0 };
	printf("请输出密码");
	//提示输入密码
	scanf("%s",password);
	printf("请确认密码(y/n)");
	//提示确认密码
	getchar();
	int yn = getchar();
	if (yn == 'y')
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}
	return 0;
}

多加了一个getchar把回车读取。

C语言——九种控制语句_第4张图片

例3:

#include 

int main()
{
	char password[20] = { 0 };
	printf("请输出密码");
	//提示输入密码
	scanf("%s",password);
	printf("请确认密码(y/n)");
	//提示确认密码
	getchar();
	int yn = getchar();
	if (yn == 'y')
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}
	return 0;
}

C语言——九种控制语句_第5张图片

改进之后的代码依旧出现了之前的问题,原因是:

scanf读取123456作为密码,因为中间有空格,scanf在空格处停止读取,没有读取空格,后面的getchar读取了空格,但后面还有字符,所以又出现了之前的情况。

改进

#include 

int main()
{
	char password[20] = { 0 };
	printf("请输出密码");
	//提示输入密码
	scanf("%s",password);
	printf("请确认密码(y/n)");
	//提示确认密码
	int ch = 0;
	while ((ch = getchar()) != '\n')
	{
		;
	}
	int yn = getchar();
	if (yn == 'y')
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}
	return 0;
}

while循环直接把空格和后面字符的全读取了。

C语言——九种控制语句_第6张图片

小细节

#include 

int main()
{
	char i = '\0';
	printf("%d",i);
	return 0;
}

\0的ASIIC码值是0。

C语言——九种控制语句_第7张图片


(2)while无限循环

#include 

int main()
{
	while (1)
	{
		printf("hehe\n");
	}
	return 0;
}

运行此程序,会一直打印hehe。

注意:您可以按 Ctrl + C 键终止一个无限循环。


2、for语句

(1)for语句


多次执行一个语句序列,简化管理循环变量的代码。

for 循环允许您编写一个执行指定次数的循环控制结构。

C 语言中 for 循环的语法:

for ( init; condition; increment )
{
   statement(s);
}

下面是 for 循环的控制流:

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。

例1:打印1~10

#include 

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ",i);
	}
	return 0;
}


(2)for无限循环


如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

for循环的判断部分省略代表着这部分会恒成立,从而导致死循环。

#include 

int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	return 0;
}

当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,C 程序员偏向于使用 for(;;) 结构来表示一个无限循环。

注意:您可以按 Ctrl + C 键终止一个无限循环。


(3)for语句建议


1、最好不要在for循环体内修改循环变量,防止for循环失去控制。

2、建议for语句的循环控制变量的取值采用 ( 前闭后开区间 ) 写法。

#include 

int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	for (i = 0; i < 10; i++)//左闭右开,很好看出是循环10次
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

(4)for语句小细节


初始化语句可以省略,但不建议省略。

#include 

int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ",i);
	}
	return 0;
}
#include 

int main()
{
	int i = 1;
	for (; i <= 10; i++)
	{
		printf("%d ",i);
	}
	return 0;
}

两个程序运行结果一样,都是:

但不建议第二种。

原因:

在写嵌套循环时,要写初始化语句。

#include 

int main()
{
	int i = 1;
	int j = 1;
	for (i = 1; i <= 3; i++)
	{
		for (j = 1; j <= 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

运行结果:

C语言——九种控制语句_第8张图片

#include 

int main()
{
	int i = 1;
	int j = 1;
	for (; i <= 3; i++)
	{
		for (; j <= 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

运行结果:

C语言——九种控制语句_第9张图片

两种写法输出结果不一样,不推荐第二种写法。


(5)for语言小知识


直接在for内部初始化变量。

#include 

int main()
{
	for (int i = 1; i <= 10; i++)
	{
		printf("hehe\n");
	}
	return 0;
}

这种写法只有两种情况下支持:

1、C99标准支持这种写法;

2、C++中支持这种写法。


(6)for语句条件真假


for语句中条件为真则执行循环,为假则不执行。

非0为真,0为假。

#include 

int main()
{
	int i = 0;
	int k = 0;
	for (i = 0,k = 0; k = 0; i++,k++)
	{
		printf("hehe\n");
	}
	return 0;
}

k = 0为把0赋值给k,k为0,条件为假,循环不进行。


3、do while语句

(1)do while语句


除了它是在循环主体结尾测试条件外,其他与 while 语句类似。

不像 for 和 while 循环,它们是在循环头部测试循环条件。在 C 语言中,do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

C 语言中 do...while 循环的语法:

do
{
   statement(s);

}while( condition );

即使while()中的条件不满足,也会执行一次循环体,因为他是先执行循环体,再判断循环条件。

请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

例1:即使条件不满足,也会执行一次循环体。

#include 

int main()
{
	int i = 1;
	do
	{
		printf("hehe\n");
	} while (i > 1);
	return 0;
}

(2)do while实例


例1:打印1~10

#include 

int main()
{
	int i = 1;
	do
	{
		printf("%d ",i);
		i++;
	} while (i <= 10);
	return 0;
}

4、实例

(1)例1:计算n的阶乘


for语句:

#include 

int main()
{
	int i = 1,a = 1,result = 1;
	scanf("%d",&a);
	for (i = 1; i <= a; i++)
	{
		result = result * i;
	}
	printf("%d",result);
	return 0;
}

while语句:

#include 

int main()
{
	int i = 1,a = 1,result = 1;
	scanf("%d",&a);
	while (i <= a)
	{
		result = result * i;
		i++;
	}
	printf("%d",result);
	return 0;
}

do while语句:

#include 

int main()
{
	int i = 1,a = 1,result = 1;
	scanf("%d",&a);
	do
	{
		result = result * i;
		i++;
	} while (i <= a);
	printf("%d",result);
	return 0;
}

递归

#include 

int jiecheng(int n)
{
	if (n == 1)
	{
		return 1;
	}
	return n * jiecheng(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	int res = jiecheng(n);
	printf("%d",res);
	return 0;
}

(2)例2:1! + 2! + 3! + ... + n!


for语句:

单个for语句

#include 

int main()
{
	int n = 0,i = 1,result = 1,sum = 0;
	scanf("%d",&n);
	for (i = 1; i <= n; i++)
	{
		result = result * i;
		sum = sum + result;
	}
	printf("%d",sum);
	return 0;
}

嵌套for循环

#include 

int main()
{
	int i = 1, j = 1, n = 0,res = 1,total = 0;
	scanf("%d",&n);
	for (i = 1; i <= n; i++)
	{
		for (res = 1,j = 1; j <= i; j++)
		{
			res = res * j;
		}
		total = total + res;
	}
	printf("%d",total);
	return 0;
}

while语句:

单个while语句

#include 

int main()
{
	int n = 0,i = 1,result = 1,sum = 0;
	scanf("%d",&n);
	while(i <= n)
	{
		result = result * i;
		sum = sum + result;
		i++;
	}
	printf("%d",sum);
	return 0;
}

嵌套while语句

#include 

int main()
{
	int i = 1, j = 1, n = 0,res = 1,total = 0;
	scanf("%d",&n);
	while(i <= n)
	{
		res = 1, j = 1;
		while(j <= i)
		{
			res = res * j;
			j++;
		}
		total = total + res;
		i++;
	}
	printf("%d",total);
	return 0;
}

do while语句:

单个do while语句

#include 

int main()
{
	int n = 0,i = 1,result = 1,sum = 0;
	scanf("%d",&n);
	do
	{
		result = result * i;
		sum = sum + result;
		i++;
	}while (i <= n);
	printf("%d",sum);
	return 0;
}

嵌套do while语句

#include 

int main()
{
	int i = 1, j = 1, n = 0,res = 1,total = 0;
	scanf("%d",&n);
	do
	{
		res = 1, j = 1;
		do
		{
			res = res * j;
			j++;
		}while (j <= i);
		total = total + res;
		i++;
	}while (i <= n);
	printf("%d",total);
	return 0;
}

递归:

#include 

int jiecheng(int n)
{
	if (n == 1)
	{
		return 1;
	}
	return n * jiecheng(n - 1);
}
int main()
{
	int n = 0,i = 1,result = 0;
	scanf("%d",&n);
	for (i = 1; i <= n; i++)
	{
		result = result + jiecheng(i);
	}
	printf("%d",result);
	return 0;
}

(3)例3:在一个有序数组中查找具体的某个数字n(二分查找)


for语句:

#include 

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int k = 7;
	//找具体的某个数k
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标为:%d\n",i);
			break;
		}
	}
	if (i == sz)
	{
		printf("未找到\n");
	}
	return 0;
}

二分查找:

#include 

int main()
{
	int arr[100] = {0},i = 1,j = 0;
	for (i = 1,j = 0; i <= 100; i++,j++)
	{
		arr[j] = i;
	}
	//将1~100存到数组arr中
	int k = 66;//要找66
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组的大小
	int left = 0;//定义左下标
	int right = sz - 1;//右下标
	while (left <= right)//左下标应该在右下标左边或与右下标相等
	{
		int mid = left + (right - left) / 2;//二分求中间下标
		if (arr[mid] > k)	//中间下标对应的数字比要找的数字大
		{
			right = mid - 1;//右下标变为中间下标左边多一个的下标
		}					
		else if (arr[mid] < k)//中间下标对应的数字比要找的数字小
		{
			left = mid + 1;//左下标变为中间下标右边多一个的下标
		}
		else				//如果左右下标相等,则找到数字的下标
		{
			printf("找到了%d",left);//数字的下标为左下标或右下标
			break;
		}
	}
	//上述循环当无法找到指定数字(及指定数字在数组中不存在时),会使左下标大于右下标
	if (left > right)//当左下标大于右下标时,找不到指定数字
	{
		printf("找不到");
	}
	return 0;
}

(4)例4:实现在屏幕上打印

h#########d
he#######ld
hel#####rld
hell###orld
hello#world
hello world


利用循环:

#include 
#include 

void printArray(char array[],int x)
{
	for (int i = 0;i < x - 1;i++)
	{
		printf("%c",array[i]);
	}
	printf("\n");
}
int main()
{
	char ch1[] = "###########";
	char ch2[] = "hello world";
	int sz = sizeof(ch1);
	int left = 0,right = sz - 2;
	while(left <= right)
	{
		ch1[left] = ch2[left];
		ch1[right] = ch2[right];
		printArray(ch1,sz);
		Sleep(1000);
		left++;
		right--;
	}
	return 0;
}

Sleep()函数需要的头文件为Windows.h

可以实现程序执行的延续使程序执行更可视

再加一些小细节

system()库函数需要的头文件为stdlib.h

可以实现字符在同一行内变换

#include 
#include 
#include 

void printArray(char array[],int x)
{
	for (int i = 0;i < x - 1;i++)
	{
		printf("%c",array[i]);
	}
	printf("\n");
}
int main()
{
	char ch1[] = "###########";
	char ch2[] = "hello world";
	int sz = sizeof(ch1);
	int left = 0,right = sz - 2;
	while(left <= right)
	{
		ch1[left] = ch2[left];
		ch1[right] = ch2[right];
		printArray(ch1,sz);
		Sleep(1000);
		left++;
		right--;
		if (left <= right)
		{
			system("cls");
		}
	}
	return 0;
}

(5)例5:模拟用户输密码,只能输三次,三次都不对退出程序


方法一

#include 
#include 

int main()
{
	char arr1[10] = { '\0' };
	printf("请设置你的密码(8位):");
	scanf("%s", arr1);
	printf("现在开始登陆\n");
	int i = 0;
	char arr2[10] = {'\0'};
	printf("你只有三次机会,请输入正确的密码\n");
	while (i < 3)
	{
		if (i == 0)
		{
			printf("请输入密码(8位):");
			scanf("%s", arr2);
		}
		else
		{
			printf("请再次输入密码(8位):");
			scanf("%s",arr2);
		}
		int left = 0;
		int lenth1 = (int)strlen(arr1);
		int lenth2 = (int)strlen(arr2);
		if (lenth1 == lenth2)
		{
			int counter = 0;
			while (left < lenth1)
			{
				if (arr1[left] == arr2[left])
				{
					counter++;
				}
				left++;
			}
			if (counter == 8)
			{
				printf("密码正确!\n");
				break;
			}
			else
			{
				printf("密码错误,你还有%d次机会\n",2 - i);
			}
		}
		else
		{
			printf("密码长度错误,你还有%d次机会\n",2 - i);
		}
		i++;
	}
	return 0;
}

小细节

1、这其中scanf("%s",arr1)中数组变量没有取地址是因为数组变量的表变量名就是其首元素的地址

2、在函数传参的时候,将数组变量作为参数传参时,数组变量会退化成其地址及指针变量

#include 

void print(int array[])
{
	int sz = sizeof(array);
	printf("%d",sz);
}
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	print(arr);
	return 0;
}

整型变量是4字节,数组中有10个整型数据,数组的大小应是40字节,而屏幕上打印的却是8字节,原因是在函数传参的时候,将数组变量作为参数传参时,数组变量会退化成其地址及指针变量,所以屏幕上打印的是指针变量的大小。所以在传参时,要将数组的大小也传进去。

方法二

使用strcmp()函数,头文件是string.h

功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
    字符串1 == 字符串2,返回值 = 0;
    字符串1 > 字符串2,返回值 > 0;
    字符串1 < 字符串2,返回值 < 0。

#include 
#include 

int main()
{
	char arr1[10] = { '\0' };
	printf("请设置你的密码(8位):");
	scanf("%s", arr1);
	printf("现在开始登陆\n");
	int i = 0;
	char arr2[10] = {'\0'};
	printf("你只有三次机会,请输入正确的密码\n");
	while (i < 3)
	{
		if (i == 0)
		{
			printf("请输入密码:");
			scanf("%s", arr2);
		}
		else
		{
			printf("请再次输入密码:");
			scanf("%s", arr2);
		}
		if (strcmp(arr1, arr2) == 0)
		{
			printf("密码正确!\n");
			break;
		}
		else
		{
			printf("密码错误,你还有%d次机会\n",2 - i);
		}
		i++;
	}
	return 0;
}

(6)例6:猜数字游戏


while语句循环

#include 
#include 
#include 

int main()
{
	srand((unsigned int)time(NULL));
	int num = rand() % 100 + 1;
	printf("你只有八次机会\n");
	int i = 0;
	while (i < 8)
	{
		printf("请输入数字:");
		int in = 0;
		scanf("%d",&in);
		if (in == num)
		{
			printf("对了!\n");
			break;
		}
		else if(in < num)
		{
			printf("小了!\n");
		}
		else if(in > num)
		{
			printf("大了!\n");
		}
		printf("你只有%d次机会了哦!\n",7 - i);
		i++;
	}
	return 0;
}

函数递归

#include 
#include 
#include 

void game(int x)
{
	int g = 0;
	scanf("%d",&g);
	if (g == x)
	{
		printf("对了!\n");
	}
	else if(g < x)
	{
		printf("小了!\n");
		game(x);
	}
	else if (g > x)
	{
		printf("大了!\n");
		game(x);
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int num = rand() % 100 + 1;
	game(num);
	return 0;
}

三、转向语句:break语句,goto语句,continue语句,return语句

1、break语句

(1)break语句


终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。

C 语言中 break 语句有以下两种用法:

  1. 当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
  2. 它可用于终止 switch 语句中的一个 case。

如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

C 语言中 break 语句的语法:

break;

在switch语句中的应用

#include 

int main()
{
	int i = 0;
	scanf("%d",&i);
	switch(i)
	{
	case 1:
		printf("1");
		break;
	case 2:
		printf("2");
		break;
	default :
		printf("其他");
		break;
	}
	return 0;
}

在循环中的运用

#include 

int main()
{
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ",i);
		i++;
	}
	return 0;
}

(2)break例题


例1:用五分制表示成绩

#include 

int main()
{
	int score = 0;
	scanf("%d",&score);
	int scoreTrans = score / 10;
	switch (scoreTrans)
	{
	case 10:
	case 9:
		printf("A");
		break;
	case 8:
		printf("B");
		break;
	case 7:
		printf("C");
		break;
	case 6:
		printf("D");
		break;
	default :
		printf("F");
		break;
	}
	return 0;
}

例2:输入字时输出字母,输入数字时退出程序

#include 

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
		{
			putchar(ch);
		}
		else if (ch >= '0' && ch <= '9')
		{
			break;
		}
		else
		{
			printf("错误!\n");
		}
	}
	return 0;
}

2、goto语句

(1)goto语句


将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。

注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

C 语言中 goto 语句的语法:

goto label;
...
label: statement;

在这里,label 可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。

但是在某些情况下goto语句还是用得着的,最常见的方法就是终止程序在某些深度嵌套的的结构的处理过程

例如:一次跳出两层或多层循环


(2)goto语句例子


情况

    for (...)
    {
    	for (...)
	    {
	    	for (...)
	    	{
	    		if (errorAppear)//错误发生
		    	{
		    		goto errorSolveStatememt;//直接跳到解决错误语句
		    	}
	    	}
	    }
    }
    ...
errorSolveStatememt://解决错误语句
    if (errorAppear)//若错误发生
    {
	    ...//解决错误的具体方法
    }

实例:关机程序

1、电脑运行起来后,一分钟后关机

2、如果输入“我是猪”,就可以取消关机

需要system库函数,需要的头文件是stdlib.h

system("shutdown -s -t 60");//电脑在60秒之后关机

system("shutdown -a");//取消关机

goto语句

#include 
#include 
#include 

int main()
{
	char input[20] = {0};
	system("shutdown -s -t 60");
	printf("你的电脑将在六十秒后关机\n");
	printf("你可以输入“我是猪”来取消关机\n");
again:	
	scanf("%s",input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
		printf("真听话,关机已取消\n");
	}
	else
	{
		printf("你输错了,请重新输入\n");
		goto again;
	}
	return 0;
}

while语句

#include 
#include 
#include 

int main()
{
	char input[20] = {0};
	system("shutdown -s -t 60");
	printf("你的电脑将在六十秒后关机\n");
	printf("你可以输入“我是猪”来取消关机\n");
	while (strcmp(input, "我是猪") != 0)
	{
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			printf("真听话,关机已取消\n");
		}
		else
		{
			printf("你输错了,请重新输入\n");
		}
	}
	return 0;
}

(3)goto语句无限循环


#include 

int main()
{
again:
	printf("haha\n");
	goto again;
	return 0;
}

3、continue语句

(1)continue语句


告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 while 和 do...while 循环,continue 语句重新执行条件判断语句,对于自增语句有不同的情况,若自增在continue之前不会造成无限循环,而自增语句在continue之后可能造成无限循环。

#include 

int main()
{
	int i = 1;
	for(i = 1;i <= 10;i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ",i);
	}
	return 0;
}

执行之后打印1 2 3 4 6 7 8 9 10

#include 

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ",i);
		i++;
	}
	return 0;
}

执行后打印1 2 3 4然后死循环


(2)continue语句实例


例1:打印1 2 3 4 6 7 8 9 10

#include 

int main()
{
	int i = 0;
	while(i <= 9)
	{
		i++;
		if (i == 5)
		{
			continue;
		}
		printf("%d ",i);
	}
	return 0;
}

4、return语句

(1)return语句


函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。

return 语句的一般形式为:

return 表达式;

或:

return (表达式);

1、为调用的函数返回参数值

int Add(int x, int y)
{
	return (x + y);
}

2、提前结束函数

由于return具有把程序流程从被调函数转向主调函数的作用,所以时候也会用来终止函数的调用,也就是说return是提前结束函数的唯一方法。 因为函数一遇到return就立即返回,return后面的程序都不再执行,所以一个函数中可以有多个return,但只会执行一个。 return后面可以跟一个参数作为返回值,也可以不跟参数,仅仅代表结束此函数。

int fun(int x)
{
	if (x == 0)
	{
		return 0;
	}
	else if (x == 1)
	{
		return 1;
	}
}

3、返回一个函数

如果return后面跟的是一个函数的话,就意味着,跳出此调用函数,并且跳出后执行return后的函数,然后继续在主函数中执行程序。有时利用return返回一个操作,比如在程序调试中出错后,需要return跳出错误函数并向串口打印出错误的原因,这个时候return后面的函数就用来向窗口打印错误原因的。

int Add(int x, int y)
{
	return (x + y);
}

int fun(int x,int y)
{
	return Add(x,y);
}

(2)return语句例题


例1:写一个加法函数,函数的返回值为两个变量的和

#include 

int Add(int x, int y)
{
	return (x + y);
}

int main()
{
	int a = 10, b = 20;
	int res = Add(a,b);
	printf("%d",res);
	return 0;
}

如有错误,感谢指正。

你可能感兴趣的:(c语言)