文章目录
运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。具体可分为以下几类:
- 算术运算符:加+, 减-, 乘*, 除/, 取余%, 加加++, 减减–;
- 关系运算符:等于==, 不等于!=, 大于>, 小于<, 大于等于>=, 小于等于<=;
- 逻辑运算符:逻辑非!, 逻辑与&&, 逻辑或||;
- 位运算(二进制的运算符):位与&, 位或|, 异或 ^, 取反~,左移运算<<(箭头指向左边,即在二进制表示中表示向高位移动,在数学运算中表示乘), 右移运算>>(箭头指向右边,即在二进制表示中表示向低位移动,在数学运算中表示除);
运算符 | 操作描述 |
位与 & | 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…语句
- 单级if…else…语句
if(判断条件){
表达式1;
}else{
表达式2;
}
- 多级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语言循环类型有三种:
- while 循环
- do … while 循环
- 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。
这里的计算可以用下面的表格来表示:
数字 | 3 | 4 | 2 | 3 | 1 | 5 |
---|---|---|---|---|---|---|
数位 | 6 | 5 | 4 | 3 | 2 | 1 |
数字奇偶 | 奇 | 偶 | 偶 | 奇 | 奇 | 奇 |
数位奇偶 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 |
奇偶一致 | 0 | 0 | 1 | 1 | 0 | 1 |
二进制位值 | 32 | 16 | 8 | 4 | 2 | 1 |
要求:输入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
【代码解答】
- 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);
}
- 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);
- 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} 1−21+31−41....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语句
- 通常在条件判断语句特别是switch…case语句中与循环语句中需要使用break语句,用以停止程序或跳出循环。
- 在循环结构中,另一常用语句为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;
}