C【分支语句和循环语句】

1.if语句

//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

如果表达式的结果为真,则语句执行。 在C语言中如何表示真假? 0表示假,非0表示真。

#include 
int main()
{
    if(表达式)
   {
        语句列表1;
   }
    else
   {
        语句列表2;
   }
    return 0;
}

1.1 悬空else

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include 
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
   {
        if(b == 2)
       {
            printf("hehe\n");
       }
   }
    else
   {
         printf("haha\n");
   }      
   

else的匹配:else是和它离的最近的if匹配的。

2.switch语句

#include 
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}

优化

#include 
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

2.1 default子句

C【分支语句和循环语句】_第1张图片

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

#include 
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
   {
    case 1:
            m++;
    case 2:
            n++;
    case 3:
            switch (n)
           {//switch允许嵌套使用
             case 1:
                    n++;
             case 2:
                    m++;
                    n++;
                    break;
           }
    case 4:
            m++;
            break;
    default:
            break;
   }
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

3.while循环

C【分支语句和循环语句】_第2张图片

3.1 while中的break

	/*
		break:跳出本次循环
		while中的break是用于永久终止循环的
	*/
	int c = 0;
	while (c <= 10)
	{
		if (c == 5)//等于5的时候跳出
			break;
		printf("%d", c);//01234
		c++;
	}
	printf("\n========");

C【分支语句和循环语句】_第3张图片

3.2 while中的continue

	/*
		continue:跳出本次循环,后面的代码不在执行
		而是直接跳转到while语句的判断部分,进行下一次循环入口判断

	*/
	int d = 0;
	while (d <= 10)
	{
		if (d == 5)//等于5的时候跳出
			continue;
		printf("%d\n", d);//01234死循环
		d++;
	}
	printf("========");

	int e = 0;
	while (e <= 10)
	{
		e++;
		if (e == 5)//等于5的时候跳出
			continue;
		printf("%d", e);//1234
	}
	printf("========");

	return 0;

C【分支语句和循环语句】_第4张图片

3.3 其他

//代码什么意思?
//代码1
#include 
int main()
{
 int ch = 0;
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0;
}
这里的代码适当的修改是可以用来清理缓冲区的.
//代码2
#include 
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < ‘0’ || ch > ‘9’)
        continue;
     putchar(ch);
 }
 return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、
	//int ch 是因为 getchar 函数获取的是 ascll  不是字符!!!
	/*int ch = getchar();
	putchar(ch);
	printf("%c\n", ch);*/
	//int ch = 0;
	//EOF-- end of file -> 文件结束标志
	//while ((ch = getchar()) != EOF) {//只要不输出EOF就不会跳出
	//	putchar(ch);
	//}
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("输入密码:");
	scanf("%s", password);//此时缓冲区;password\n
	//此时缓冲区还剩余一个'\n'
	//读取一下'\n'
	//getchar();
	while ((ch = getchar()) != '\n') {

	}
	printf("请确认(y/n)");
	//此时ret输出:10-->获取了输入流中的回车键
	ret = getchar();//y/n
	if (ret == 'y') {
		printf("输入成功");
	}
	else {
		printf("输入失败");
	}

C【分支语句和循环语句】_第5张图片

4.for循环

C【分支语句和循环语句】_第6张图片

4.1 for循环中的break和continue

	int b = 0;
	while (b <= 10) {
		if (b == 5) {
			continue;
		}
		printf("b:%d", b);//01234
		b++;
	}

	int c = 0;
	for (c = 1;c < 10;c++) {
		if (c == 5) {
			break;
		}
		printf("c:%d", c);//12346789
	}
	return 0;

4.2 for语句的循环控制变量

C【分支语句和循环语句】_第7张图片

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

4.3 for循环变种

#include 
int main()
{
    //代码1
    for (;;)
    {
        printf("hehe\n");//死循环
    }
	return 0;
}

int main() {
	int a = 0;
	int b = 0;
	for (;a < 10;a++) {
		for (;b < 10;b++) {
			//这里就打印10个,因为当b跳出的时候b=10,再一次要进来则还是10,故进不来
			printf("hehe");
		}
	}
	printf("==============");


	//代码2
	int i = 0;
	int j = 0;
	//这里打印多少个hehe?
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
		printf(".....");
	}
}

int main() {
	//代码4-使用多余一个变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");//输出2个
	}
	return 0;

}

4.5 注意点

//请问循环要循环多少次?
#include 
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

C【分支语句和循环语句】_第8张图片

5.do..while循环

C【分支语句和循环语句】_第9张图片

5.1 do while循环中的break和continue

#include 
int main()
{
    int i = 1;

    do
    {
        if (5 == i)
            continue;
        printf("%d\n", i);//1234
    } while (i < 10);

    return 0;
}



#include 
int main()
{
	int i = 10;

	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);//10
	} while (i < 10);

	return 0;
}

6.练习

1. 计算 n的阶乘

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

2. 计算 1!+2!+3!+……+10!

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

3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

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


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

C【分支语句和循环语句】_第10张图片

C【分支语句和循环语句】_第11张图片

int main()
{
	int arr[] = {1,2,3,4,5,6,8,9,10,11};
	int k =	7;

	int sz = sizeof(arr)/sizeof(arr[0]);//计算元素个数
	int left = 0;//左下标
	int right = sz-1;//右下标

	while(left<=right)
	{
		int mid = (left+right)/2;
		if(arr[mid] > k)
		{
			right = mid-1;
		}
		else if(arr[mid] < k)
		{
			left = mid+1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if(left>right)
	{
		printf("找不到\n");
	}
	return 0;
}

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

#include
#include
#include
int main()
{
	//
	//welcome to bit!!!!!!
	//####################
	//w##################!
	//we################!!
	//wel##############!!!
	//...
	//welcome to bit!!!!!!
	//
	//char arr[] = "abc";
	//[a b c \0]
	// 0 1 2 3
	//4-2
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	//这里arr[0]-2:是因为,下面的实际长度下标值为:2=4-2
	// [a b c \0]
	//  0 1 2 3
	//int right = sizeof(arr1)/sizeof(arr1[0])-2;//err
	//使用strlen记得导入[#include]
	int right = strlen(arr1)-1;

	while(left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		//休息一秒
		//#include
		Sleep(1000);
		//#include
		system("cls");//执行系统命令的一个函数-cls - 清空屏幕
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。

#include
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		if (strcmp(password, "123456") == 0)//== 不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (i == 3)
		printf("三次密码均错误,退出程序\n");
	return 0;
}

你可能感兴趣的:(c语言,算法,开发语言,c++)