C 3 语句

C语言是一种结构化的程序设计语言,包括顺序结构、选择结构和循环结构。
语句是指用";"隔开的句子。
代码块是指"{ }"中的代码集合。

语句包括:表达式语句、函数调用语句、控制语句、复合语句、空语句。

控制语句用于控制程序的执行流程,以实现程序的各种结构,它们由特定的语句定义符组成,分三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:for语句、while语句、do while语句;
3.转向语句:break语句、go to语句、continue语句、return语句。

分支语句(选择结构)

注意:else会与最近的未匹配的if进行匹配使用

if语句

#include<stdio.h>

int main()
{
	int a = 0;
	scanf("%d",&a);
	if(a<60)//if(表达式)
		printf("不及格\n");//语句1;
	else if(a = 60)//else if(表达式)
		printf("及格\n");//语句2;	
	else if(a>60 && a<85)//else if(表达式)
		printf("良好\n");//语句3;
	else//注意:else会与最近的未匹配的if进行匹配使用 
		printf("优秀\n");
	return 0;	
}
#include<stdio.h>

//判断一个数是否为奇数
int main()
{
	int a = 0;
	scanf("%d/n", &a);
	if (a%2 == 1)
		printf("奇数\n");
	else
		printf("偶数\n");

	return 0;
}

#include<stdio.h>
//输出0-100的奇数
int main()
{
	int i = 0;
	while (i <= 100)
	{
		if (i%2 == 1)
			printf("%d\n", i);
		i++;
	}
	
//{
		printf("%d\n",i);
		i+=2;//利用这种方法得到的结果是一样的
	return 0;
}

switch语句

#include<stdio.h>

int main()
{
	int day = 0;
	scanf("%d",&day);
	switch (day)//switch(整形表达式)
	{
	case 1://case 整形常量表达式:
			  //case 相当于入口
		printf("Monday\n");//语句;
		break;//break中止
			  //break相当于出口	
			  //在最后一个语句后加上break
	case 2:
		printf("Tuesday\n");
		break;
	case 3:
		printf("Wednesday\n");
		break;
	case 4:
		printf("Thursday\n");
		break;
	case 5:
		printf("Friday\n");
		break;
	case 6:
		printf("Saturday\n");
		break;
	case 7:
		printf("Sunday\n");
		break;
 	default:
	//当输入的值无法匹配任一case时,跳入dafault
	//每个switch语句中只能存在一条default语句
		printf("输入错误\n");
		break;
	}

	return 0;
}
#include<stdio.h>

int main()
{
	int day = 0;
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:	
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("加班\n");
		break;
	}

	return 0;
}
#include<stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1://n = 1进入case1:
		m++;//执行,m = 3
		//此时没有break,继续执行下面的case2:
	case 2:
		n++;//执行,n = 2
		//此时依然没有break,继续执行下面的case3:
	case 3:
		switch (n)//经过上面的语句,此时的n = 2,因此直接跳入case 2: 
		{
		case 1:
			n++;
		case 2:
			m++;//执行,m = 4
			n++;//执行,n = 3
			break;//中止,跳出这个switch语句
		}//case3:后面依然没有break,继续执行下面的case4:
	case 4:
		m++;//执行,m = 5 
		break;//中止
	default:
		break;
	}
	printf("m = %d,n =%d\n", m, n);//最终打印m = 5,n = 3
	return 0;
}

循环语句(循环结构)

while

#include<stdio.h>

int main()
{
	//一个最基础的while循环
	int i = 0;//设定i的初始值
	while (i < 10)//循环的判断
	{
		i++;//对i的执行语句
	}
	//弊端:当代码块规模变大后,相关i的语句越来越分散,不便于管理修改
	return 0;
}
#include<stdio.h>

int main()
{
	int i = 1;
	while (10 >= i)
	{
		printf("%d\n",i);//打印1-10
		i++;
	}
	return 0;
}
#include<stdio.h>

int main()
{
	int i = 1;
	while (10 >= i)
	{
		if (i == 5)
			break;
			//break直接中止整个循环
			//当i的值等于5,break语句执行,跳出代码块,结束循环
		printf("%d\n",i);//打印1-4
		i++;
	}
	return 0;
}
#include<stdio.h>

int main()
{
	int i = 1;
	while (10 >= i)
	{
		if (i == 5)
			continue;
			//continue中止本次循环的后续代码,返回while,尽心下一次的循环
			//当i的值等于5,continue语句执行,跳出代码块,返回上方的while判断
			//继续循环,陷入死循环
		printf("%d\n",i);//打印1-4,但不结束
		i++;
	}
	return 0;
}
#include<stdio.h>

int main()
{
	int ret = 0;
	char password[20] = {0};
	printf("请输入密码:");
	scanf("%s", password);//例如输入123456
	//输入缓冲区:123456\n
	//password只会取走123456,余下一个'\n'
	getchar();//取走缓冲区余下的'\n'
	printf("请确认(Y/N):");
	ret = getchar();
	if (ret == 'Y' )
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}
#include<stdio.h>

int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = {0};
	printf("请输入密码:");
	scanf("%s", password);//例如输入123456
	//输入缓冲区:123456\n
	//password只会取走123456,余下一个'\n'
	while ((ch = getchar()) != '\n')//读取缓冲区的字符直到'\n'
	{
		;
	}
	printf("请确认(Y/N):");
	ret = getchar();
	if (ret == 'Y' )
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}
#include<stdio.h>

int main()
{
	int ch = 0;
	while ((ch=getchar()) != EOF)
	{
		if (ch<'0' || ch>'9')
		//根据ASCII码,如果输入的字符是在48(‘0’)和57(‘9’)之外的字符,continue,返回while
			continue;
		putchar(ch);//如果是在48(‘0’)和57(‘9’)之间,putchar打印出来
	}
	return 0;
}

for语句
break和continue语句可以在for循环内使用。
不能在for循环体内修改循环变量,防止for循环失去控制。
for语句的循环控制变量的取值应采用“前闭后开区间”写法。

#include<stdio.h>

int main()
{
	int i = 0;
	//for(exp1;exp2;exp3)
	//exp1设定i的初始值,exp2判断语句,exp3执行语句
	for (i = 0; i < 10; i++)
	{
		;//循环语句
	}
	return 0;
}

do while语句

#include<stdio.h>

int main()
{
	int i=1;
	do
	{
		printf("%d", i);
		i++;
	} //循环语句
	while (i <= 10);//判断

	return 0;
}

goto语句

避免使用,容易造成逻辑混乱。
可在深层嵌套中,利用goto 标识符; 标识符: 可以快速跳出。
·
一个邪恶的关机代码

#include<stdio.h>
#include<stdlib.h>
#include<string,h>

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");//system()执行系统命令的函数
	//shutdown -s -t 60(将在60s后关机)
	//shutdown -a(取消关机)
again:
	printf("请注意,您的电脑将在1分钟内关机。\n如果输入我是猪,就取消关机。\n请输入:>");
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

练习

计算n的阶乘

#include<stdio.h>

int main()
{
	//计算n的阶乘
	int i = 0;
	int n = 0;
	int ret = 1;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret = ret*i;

	}
	printf("ret=%d\n", ret);
	return 0;
}

·
计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值

#include<stdio.h>

int main()
{
	//计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值
	int i = 0;
	int n = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 10; n++)//结果的累加
	{
		for (ret=1,i = 1; i <= n; i++)//n的阶乘
		{
			ret = ret*i;
		}
		sum = sum + ret;
	}
	printf("sum=%d\n", sum);
	return 0;
}

计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值,优化

#include<stdio.h>

int main()
{
	//计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值
	int i = 0;
	int n = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 10; n++)
	{
		ret = ret*n;
		sum = sum + ret;
	}
	printf("sum=%d\n", sum);
	return 0;
}

·
在一个有序的数组arr中找到一个值,并打印

#include<stdio.h>

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]);//sz等于arr数组中元素个数
	for (i = 0; i < sz; i++)
	{
		if (k == arr[i])//当i=6,arr[6]=7==k,执行
		{
			printf("找到了,下标是:%d\n", i);
			break; //顺利找到,break结束
		}
	}
	if (i == sz)//假设,要找到不存在数组中,直到循环结束都没有找到
				//即,i==sz
		printf("找不到\n");

	return 0;
}

在一个有序的数组arr中找到一个值,并打印。利用二分法优化:

#include<stdio.h>

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组arr中元素个数
	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;
}

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

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>

int main()
{
	char arr1[] = "welcome home!!!";
	char arr2[] = "###############";
	int left = 0;
	//int right = sizeof(arr1)/sizeof(arr1[0])-2;
	int right = strlen(arr1) - 1;

	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//停止1000ms,,需要windows.h头文件
		system("cls");//执行系统命令的函数,,需要stdlib.h头文件
					  //cls:清空屏幕
		left++;
		right--;
	}

	return 0;
}

·
编写代码,模拟用户登录(如果密码正确提示登陆成功,密码错误提示密码错误。最多输入三次密码,否则提示登录失败)

#include<stdio.h>

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;
}

·
输入三个数,从大到小输出。

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d%d%d", &a, &b, &c);

	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	if (a<c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}
	if (b < c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	printf("%d %d %d\n", a, b, c);

	return 0;
}

·
求两个数的最大公约数。

#include<stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	int r = 0;
	scanf("%d%d", &m, &n);
	//利用辗转相除法
	while (m%n)
	{
		r = m%n;
		m = n;
		n = r;
	}
	printf("%d\n", n);
	return 0;
}

·
打印出1000-2000中的闰年,并计算个数。

#include<stdio.h>

int main()
{
	int y = 0;
	int count = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断是否为闰年
		//能被4整除并且不能被100整除的
		//能被400整除的
		if (y % 4 == 0 && y % 100 != 0)
		{
			printf("%d ", y);
			count++;
		}
		else if (y % 400 == 0)
		{
			printf("%d ", y);
		count++;
		}
		//if(((y%4==0)&&(y%100!=0))||(y%100==0))
		//{
		//	printf("%d ",y);
		//	count++;
		//}
	}
	printf("count=%d\n",count);
	return 0;
}

·
打印100-200的素数。(试除法)

#include<stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//利用试除法判断i是否为素数
		//素数指的是,一个数只能被1和自身整除
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (i%j == 0)
			{
				break;
			}
		}
		if (j == i)
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\n%d\n", count);
	return 0;
}

打印100-200的素数。(试除法)(利用开平方函数优化)

#include<stdio.h>
#include<math.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//利用试除法判断i是否为素数
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		//数学库函数sqrt(),开平方
		//需要math.h头文件
		{
			if (i%j == 0)
			{
				break;
			}
		}
		if (j > sqrt(i))
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\n%d\n", count);
	return 0;
}

另外,因为偶数一定不是素数,还可以继续优化for(i=100;i<=200;i++)改为for(i=101;i<=200;i+=2)
·

打印0-100中含9的数,并计算个数。

#include<stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9)
		{
			printf("%d ", i);
			count++;
		}
		else if (i / 10 == 9)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("%d\n",count);

	return 0;
}

区别一下
求0-100中9的个数。

#include<stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9)
			count++;
		if (i / 10 == 9)
			count++;
	}
	printf("%d\n",count);

	return 0;
}

第二个代码中不同于第一个代码用的是两个if语句,在i=99的时候,两个if语句都会判断且通过,count++执行两次。
·
计算1/1+1/2+1/3+1/4…+1/99+1/100的值,打印出结果。

#include<stdio.h>

int main()
{
	int i = 0;
	double sum = 0;
	for (i = 1; i <= 100; i++)
	{
		sum += 1.0 / i;
	}
	printf("%lf\n",sum);

	return 0;
}

计算1/1-1/2+1/3-1/4+1/5…+1/99-1/100的值,打印出结果。

#include<stdio.h>

int main()
{
	int i = 0;
	double sum = 0;
	int j = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += j*1.0 / i;
		j = -j;
	}
	printf("%lf\n",sum);

	return 0;
}

计算1/1-1/2+1/3-1/4+1/5…+1/99-1/100的值,打印出结果。
(算法二:分母为奇数的和-分母为偶数的和)

#include<stdio.h>

int main()
{
	int i = 0;
	double sum = 0;
	int j = 0;
	for (i = 1; i <= 100; i++)
	{
		j = i % 2;
		if (j == 1)
			sum += 1.0 / i;
		else if (j == 0)
			sum -= 1.0 / i;
	}
	printf("%lf\n",sum);

	return 0;
}

·
求十个数中的最大值。

#include<stdio.h>

int main()
{
	int i = 0;
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int max = arr[0];//不建议赋值0
	int sz = sizeof(arr) / sizeof(arr[0]);
	//int sz = strlen(arr);
	for (i = 0; i < sz; i++)
	{
		if (arr[i]>max)
		{
			max = arr[i];
		}
	}
	printf("max=%d\n", max);
	return 0;
}

·
打印9*9乘法口诀表

#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", i, j, i*j);
			//这里的%2d是为了对齐,%-2d可以向左对齐
			//不足两位数则添加一个空格
		}
		printf("\n");
	}

	return 0;
}

·
“简单的”猜数字游戏

#include<stdio.h>
#include<stdlib.h>

void menu()
{
	printf("******************\n");
	printf("**1.play**0.exit**\n");
	printf("******************\n");
}

void game()
{
	int guess = 0;
	int ret = 0;
	//生成一个随机数
	//rand()函数随机生成一个数
	//#define RAND_MAX 0x7fff,,生成的随机数在0-32767之间
	ret=rand()%100+1;//将随机数的范围限制到0-100
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess > ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了!\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	}
	while (input);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值