C—分支与循环

1.清理缓冲区

getchar和scanf读取数据时:

scnaf和getchar读取数据时从缓冲区读取

例子:

这是输入完密码后,没输入Y/N就出现确认失败

原因是:输入密码时,相当于输入了123456和\n,第一次scanf从缓冲区接收了123456给了‘a' ,等到getchar时从缓冲区接收了\n,所以要达到效果,我们应该清理缓冲区

scanf和getchar只读’空格‘和'\n'之前的,且一个getchar只能获取一个字符

代码如下:

while ((temp = getchar()) != '\n')
    {
        ;
    }

改正后完整代码;

#include<stdio.h>
int main()
{
	char a[20] = { 0 };
	printf("请输入密码\n");
	scanf("%s", a);
	int temp;
	while ((temp = getchar()) != '\n')
	{
		;
	}
	printf("请确认密码Y/N\n");
	int ch = getchar();
	if ('Y' ==ch)
	{
		printf("确认成功且密码是%s",a);
	}
	else
	{
		printf("确认失败");
	}
	return 0;
}

 运行结果:

 证明了,scanf只能读取空格和\n之前。

2.for循环易错例题
 

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	//如果省略掉初始化部分,这里打印多少个hehe?
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("%d:hehe\n",j);
		}
	}
	return 0;
}

运行结果:

 打印十个的原因是:

当j的循环运行完时,j=10;且在for循环中没有赋值语句。所以j=10不会变因此不会执行j的循环。

例二:

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

分析:判断部分k=0,这一部分为0;0为假,所以不进循环,因此循环0次

练习题:

#include<stdio.h>
int main()
{
	int n,i,temp=1;
	scanf("%d", &n);
		for (i = 1; i <= n; i++)
		{
			temp = temp * i;
	}
	printf("%d", temp);
	return 0;
}

 

#include<stdio.h>
int main()
{
	  int n,i;
	  int temp = 1,sum=0;
	scanf("%d", &n);
		for (i = 1; i <= n; i++)
		{
			temp = temp * i;
			sum += temp;
	}
	printf("%d", sum);
	return 0;
}

 

题前小知识:

1.计算一个数组中元素的个数:

int a[] = { 1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(a) / sizeof(a[0]);

 计算最右边数组的下标只需sz-1;

2.计算平均值的三个方法:

第一个:(a+b)/2;

但是a和b的值可能会超过范围

所以要用第二个方法:

a+(b-a)/2;

第三个方法:

(a+b)>>1

>>1是对应的二进制向右移一位

例如:

(3+2)>>1

就是00000000000000000000000000000101向右移动一位对应的二进制数是00000000000000000000000000000010这个对应的十进制数是2

就相当于取了一个平均数。

所以该题的代码为:

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9 };
	int k;
	printf("请输入想查找的数字\n");
	scanf("%d", &k);
	int sz = sizeof(a) / sizeof(a[0]);
	int left = 0;//左下表
	int right = sz - 1;//右下标
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("已找到,下标是:%d", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到");
	}
	return 0;
}

运行结果为:

 

实现一个二分查找的函数:

#include<stdio.h>
int bin(int a[], int left, int right, int k)
{
	int mid = 0;
	while (left <= right)
	{
		int mid = (left + right) >> 1;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
		if (left > right)
			return -1;
	}
}
	int main()
	{
		int a[] = { 1,2,3,4,5,6,7,8,9 };
		int k;
		printf("请输入想查找的数字\n");
		scanf("%d", &k);
		int sz = sizeof(a) / sizeof(a[0]);
		int left = 0;//左下表
		int right = sz - 1;//右下标
		int m=bin(a,left,right,k);
		if (m == -1)
		{
			printf("找不到");
		}
		else
		{
			printf("找到了,下标是:%d", m);
		}
		return 0;
	}

 

计算字符串长度大小

方法一:

char arr[]="abc";

这个字符串里面相当于a b c \0

所以用sizeof(arr[])/sizeof[0]=4

 那么c的下标就为4-2

方法二:

strlen只会计算\0前面的

strlen(arr)=3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
	char arr1[] = "Welcome to China";
	char arr2[] = "################";
	int left = 0;
	int sz = strlen(arr1);
	int right = sz - 1;
	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		system("color f2");
		Sleep(1000);//头文件为#include<windows.h>
		system("cls");//清屏指令,头文件为#include<stdlib.h>
		left++;
		right--;
	}
	return 0;
}

1.比较字符串

用函数strcmp 来比较字符串大小

#include<stdio.h>
#include<string.h>
int main()
{
	char password[] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码\n");
		scanf("%s", password);//数组不需要取地址,因为数组本身就是地址。
		if (strcmp(password, "abcde") == 0)
		{
			printf("密码输入正确\n");
			break;
		}
		else
		{
			printf("密码输入错误,请再次输入\n");
		}
	}
	if (i == 3)
	{
		printf("三次机会已用完");
	}
	return 0;
}

结果为:

 

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值