C语言学习笔记2----运算符与判断、循环

运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。具体可分为以下几类:

  • 算术运算符:加+, 减-, 乘*, 除/, 取余%, 加加++, 减减–;
  • 关系运算符:等于==, 不等于!=, 大于>, 小于<, 大于等于>=, 小于等于<=;
  • 逻辑运算符:逻辑非!, 逻辑与&&, 逻辑或||;
  • 位运算(二进制的运算符):位与&, 位或|, 异或 ^, 取反~,左移运算<<(箭头指向左边,即在二进制表示中表示向高位移动,在数学运算中表示乘), 右移运算>>(箭头指向右边,即在二进制表示中表示向低位移动,在数学运算中表示除);
运算符操作描述
位与 &0&0=0
0&1=0
1&0=0
1&1=1
位或 |0 | 0=0
0 | 1=1
1 | 0=1
1 | 1=1
异或 ^0^0=0
0^1=1
1^0=1
1^1=0
取反 ~~1 = -2
~0 = -1
左移 <<将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0
右移 >>将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
  • 赋值运算符: =
  • 杂项运算符:
    sizeof()返回变量所占内存的大小;
    &用于指针取地址;
    * 用于指针变量的定义;
    条件表达式?:,条件?是的结果:不是的结果

判断

if…else…语句

  1. 单级if…else…语句
if(判断条件){
    表达式1;
}else{
    表达式2;
}
  1. 多级if…else…语句
if(判断条件1){
    表达式1;
}else if(判断条件2){
    表达式2;
    .
    .
    .
}else if(判断条件n)
   表达式n;
else{
    表达式n+1;
}

switch…case…语句

该语句主要用于离散整数变量类型的条件判断。语句运行至第一个break语句出现为止。若语句中无break,则在满足条件处一直执行至所有语句结束。语法可写为:

switch(控制表达式type){//(1)
    case 1://(2)
    表达式1;//(3)
    case 2:
    表达式2;
    .
    .
    .
    case n:
    表达式n;
    default:
    表达式n+1;
}
//该处控制表达式只能是整数型的结果
//case 1等价于if(type==1)
//此处表达式可无,如无的情况则表示该种情况同下一种情况执行同一个表达式。

代码示例】划分小时输出早上好,中午好,晚上好,睡眠中。

#include <stdio.h>
/*6-11点为上午好
12点为中午好
11-18点为下午好
19-23点为晚上好
24点-5点为睡眠中*/ 
int main(){
	int type;
	printf("请输入一个小时数:");
	while(scanf("%d", &type)!=EOF){
		switch(type){
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
					printf("上午好!\n");
					break;
				case 12:
					printf("中午好!\n");
					break;
				case 13:
				case 14:
				case 15:
				case 16:
				case 17:
				case 18:
					printf("下午好!\n");
					break;
				case 19:
				case 20:
				case 21:
				case 22:
				case 23:
					printf("晚上好!\n");
					break;
				case 24:
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
					printf("睡眠中~~~!\n");
					break; 
			}
		printf("请输入一个小时数:");
	}
	
	return 0; 
}

结果演示为:

请输入一个小时数:3
睡眠中~~~!
请输入一个小时数:7
上午好!
请输入一个小时数:12
中午好!
请输入一个小时数:13
下午好!
请输入一个小时数:23
晚上好!

条件语句举例

】分别使用if…else语句与switch…case语句判断学生成绩。其中判断规则为:
90-100: A+
80-89: A
70-79: B
60-69: C
59及以下为D

方法一:if…else语句

#include <stdio.h>
int main(){
printf("请输入一个学生成绩:");
int score;
scanf("%d",&score);
if(score>90 && score<=100){
	printf("该生成绩等级为A+!");	
}else if(score>80){
	printf("该生成绩等级为A!");
}else if(score>70){
	printf("该生成绩等级为B!");	
}else if(score>60){
	printf("该生成绩等级为C!");
}else{
	printf("该生成绩等级为D!");
}
return 0;
}

方法二:switch…case语句

#include <stdio.h>
int main(){
printf("请输入一个学生成绩:");
int score, type;
scanf("%d",&score);
type = score/10;
switch(type){
	case 10:
	case 9:
		printf("该生成绩等级为A+!");
		break;
	case 8:
		printf("该生成绩等级为A!");
		break;
	case 7:
		printf("该生成绩等级为B!");
		break;
	case 6:
		printf("该生成绩等级为C!");
		break;
	default:
		printf("该生成绩等级为D!");
}
return 0;
}

循环

用于多次执行同一段代码。C语言循环类型有三种:

  1. while 循环
  2. do … while 循环
  3. for 循环

while循环

代码语句可写为:

while(判断条件){
         循环体;
}

】:该循环首先判断条件,条件满足再执行循环体,条件不满足时跳出循环体。如果条件不满足,循环体一次都不执行。

do…while 循环

代码语句可写为:

do{
   循环体;
}while(判断条件);

】:1. 该循环先执行循环体,再判断条件,若条件满足继续执行循环体,条件不满足时跳出循环体。即使条件不满足,循环体也会执行一次。2. 循环结构末尾的分号不可忘。

for循环

代码语句可写为:

for(循环体变量;变量范围;变量叠加表达式){
                 循环体;
}

】:该种类型的循环通常用于已明确循环次数的情况。
令:for循环中(循环体变量;变量范围;变量叠加表达式)循环体变量、变量范围、变量叠加表达式都是可以省略的,此种情况下程序不会报错,但会陷入无限循环的状态,Ctrl+C可终止一个无限循环。
代码示例】使用for循环计算1到 n n n的连加和。自行设定 n n n的大小。

#include <stdio.h>
int main(){
	int n;
	printf("请输入一个整数n:");
	scanf("%d",&n);
	int i, sum = 0;
	for(i = 1; i <= n; i++){
		sum += i;
		printf("1到%d的叠加和为%d\n",i,sum);
	}
	printf("1到n的加和sum = %d\n",sum);
}

输出结果为

请输入一个整数n:6
1到1的叠加和为1
1到2的叠加和为3
1到3的叠加和为6
1到4的叠加和为10
1到5的叠加和为15
1到6的叠加和为21
1到n的加和sum = 21

循环举例

例 1】分别使用三种类型循环方式完成下列题目。

数字特征值

题目描述 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

这里的计算可以用下面的表格来表示:

数字342315
数位654321
数字奇偶
数位奇偶
奇偶一致001101
二进制位值32168421

要求:输入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:

一个非负整数,整数的范围是[0,1000000]。

输出格式:

一个整数,表示计算结果。

输入样例:

342315

输出样例:

13
【代码解答】

  1. while循环
#include <stdio.h>
#include <math.h>
int main(){
    int number;
    scanf("%d",&number);//首先输入一个整数
	int count = 0;//记录所输入数字的位数
	int digit;//记录每位上的数字
	int binary;//记录位数与该位上的数字奇偶性判断后的二进制数字
	int ret = 0;//需要输出的十进制数字
	while(number > 0){
		digit = number%10;
		count ++;
		if((digit+count)%2==0){//奇偶性相同时该位上的数字与位数和一定为偶数
			binary = 1;	
		}else{
			binary = 0;
		}
		ret = ret + binary*pow(2,count-1);
		/*pow()幂函数包含于math.h的头文件中*/
		number /= 10;
	}
	printf("%d\n", ret);
}
  1. do…while循环
将
	while(number > 0){
		digit = number%10;
		count ++;
		if((digit+count)%2==0){
			binary = 1;	
		}else{
			binary = 0;
		}
		ret = ret + binary*pow(2,count-1);
		number /= 10;
	}
	更改为:
	do{
			digit = number%10;
			count ++;
			if((digit+count)%2==0){
				binary = 1;	
			}else{
				binary = 0;
			}
			ret = ret + binary*pow(2,count-1);
			number /= 10;
		}while(number > 0);
  1. for循环
#include <stdio.h>
#include <math.h>
int main(){
    int number;
    scanf("%d",&number);//首先输入一个整数
	int count = 0;//记录所输入数字的位数
	int digit;//记录每位上的数字
	int binary;//记录位数与该位上的数字奇偶性判断后的二进制数字
	int ret = 0;//需要输出的十进制数字
	for(;;){
		digit = number%10;
		count ++;
		if((digit+count)%2==0){//奇偶性相同时该位上的数字与位数和一定为偶数
			binary = 1;	
		}else{
		    binary = 0;
		}
		ret = ret + binary*pow(2,count-1);
		number /= 10;
	/*此循环不包含判断变量,若不包含if判断,循环将一直进行下去,无法输出*/
		if(number<=0){
			break;
		}
	/*----------------------------------------------------*/
	}
	printf("%d\n", ret);
}

例2】输出100以内的素数。

#include <stdio.h>
int main(){
	int x;
	for(x=2;x<100;x++){
		int i;
		int isPrime = 1;
		for(i=2; i < x; i++){
			if(x%i==0){
				isPrime = 0;
				break;
			}
		}
		if(isPrime==1){
			printf("%d ",x);
		}
	}
	return 0;
}

例3】输出前从小到大的前50个素数。

#include <stdio.h>
int main(){
	int x = 2;
	int cnt = 0;
	for(x = 2; cnt < 50; x++){
		int i;
		int isPrime = 1;
		for(i = 2; i < x; i++){
			if(x%i==0){
				isPrime = 0;
				break;
			}
		}
		if(isPrime == 1){
			printf("%d ",x);
			cnt ++;
		}
	}
	return 0;
} 

例4】设计程序计算 1 − 1 2 + 1 3 − 1 4 . . . . 1 n 1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}....\frac{1}{n} 121+3141....n1 的结果。

#include <stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	int i;
	double sum = 0.0;
	double sign = 1.0;
	for(i = 1; i <= n; i++){
		sum += sign/i; 
		sign = -sign;
	} 
	printf("前%d项的和为:%lf\n", n, sum);
	return 0;
}

break 与 continue语句

  1. 通常在条件判断语句特别是switch…case语句中与循环语句中需要使用break语句,用以停止程序或跳出循环。
  2. 在循环结构中,另一常用语句为continue,用以告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。

goto语句

goto语句多用于多层循环的情况。用于直接退出多层循环。
例5】找出一种方案使用1角,2角,5角组合成一个输入的小于10元的金额。

#include <stdio.h>
int main(){
	int x;
	int one, two, five;
	scanf("%d", &x);
	for(one = 1; one < x*10; one++){
		for(two = 1; two < x*10/2; two++){
			for(five = 1; five < x*10/5; five++){
				if(one+two*2+five*5==x*10){
					printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one, two, five, x);
					goto out;
				}
			}
	}
	}
out:
	return 0;
}

娱乐阶段:条件判断与循环示例----猜数字。

题目描述: 系统根据时间随机产生一个100以内的整数,请你猜出该数字是几?

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

int main(){
	srand(time(0));
	int number = rand()%100+1;/*产生100以内的随机数*/
	int count = 0;
	int a = 0;
	printf("我已经想好了一个1到100之间的数啦,请准备猜吧!");
	do{
		printf("请猜这个1到100之间的数是多少:");
		scanf("%d",&a);
		count ++;
		if(a > number){
			printf("你猜的数大了。");
		}else if(a < number){
			printf("你猜的数小了。");
		}	
	}while(a != number);
	printf("哇塞,你用了%d次猜对了答案。\n", count);
	
	return 0;
}

参考文献

[1] 中国大学MOOC之翁凯版《程序设计入门——C语言》。链接
[2] C|菜鸟教程。链接

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值