C语言学习 第2天【学会C语言就靠它了......】

一、运算符

1. 算术运算符

+ - * /	 %
% 模除  取余数   10%7 结果3   10除以7余3
要求左右操作数必须是整数
/  整数相除得整数,除不开的部分直接舍去    9/5 结果1

小数相除得小数,规则和小学数学是一样的。整数和小数相除按照小数和小数相除计算。10/1.2 认为10.0/1.2
使用除法要注意,除数不能为0,除数写0不是语法错误,会导致程序运行崩溃。
#include <stdio.h>
int main()
{
	int a = 10, b = 3;
	printf("%d\n", a+b);//13
	printf("%d\n", a-b);//7
	printf("%d\n", a*b);//30
	printf("%d\n", a/b);//3
	printf("%d\n", a%b);//1
	return 0;
}

2. 关系运算符

大小关系

>   <   >=  <=  ==  !=
>= 注意中间是不能写空格的   > =是错误写法
== 用于比较
=  用于赋值
关系运算符的结果是 真假   C语言中使用数字0作为假,所有非零数都是真。  1 1.2 -3 -3.14都是真
虽然能表示真的数有无数个,但是C语言默认使用整数1 表示真。

示例:

x = 7; 赋值

x == 5; 比较

int main()
{	
	int a = 10, b = 3;
    printf("%d\n", a==b);//0
    printf("%d\n", a!=b);//1
    printf("%d\n", a<b);//0
    return 0;
}

思考:

int a = 70;
1<a<10;//关系运算符的运算是从左到右
//先算1<a 得到 1
//再用1<a的结果1 和10比较 既 1<10 ,所以结果为真,是1

所以我们得到一个结论,关系运算符不要连着写,连着写关系运算符和我们想象的逻辑是不一样的。

3. 逻辑运算符

重要:所有的运算符都会产生运算结果。

逻辑运算符的结果也是真1 假 0

&& 逻辑与

|| 逻辑或

! 逻辑非

逻辑与真值表:

表达式1表达式2结果
000
010
100
111

示例: a=2, b = 9; (a>0) && (b<0)

int main()
{	
    int a = 2;	
    int b = 9;	
    printf("%d\n", (a>0)&&(b<0));//0  因为b<0结果是0
    return 0;
}

逻辑或真值表:

表达式1表达式2结果
000
011
101
111

示例: x=2, y=1 ; (x>0) || (y<0)

#include <stdio.h>

int main()
{
	int x = 2;
	int y = 1;
	printf("%d\n", (x>0)||(y<0));//结果是1 因为x>0是1
	return 0;
}

单目运算符(一元运算符):只有一个操作数

逻辑非真值表:

表达式1结果
01
10

思考

int main()
{	
    int a = 10;	
    a = !a;//a = !10  所以a = 0
    a = !a;//a = !0  所以a = 1
    printf("%d\n", a);//1
    return 0;
}

4. 优先级

算术运算符 > 关系运算符 > 逻辑运算符

()永远最高

不是先计算优先级高的运算符,而是把优先级高的运算符看成一个整体。

1 + 2 - 3 * 4 把3*4看成一个整体,但是运算的顺序是从左到右计算,所以先计算1+2 。

1+2>=3 || 5-6==1 求结果 结果是1

练习:

输入三个小数float,求和,求平均值 分别打印


int main()
{
	float a, b, c;  
	scanf("%f%f%f", &a, &b, &c);
    printf("%f\n", a+b+c);
	printf("%f\n", (a+b+c)/3);//因为+优先级小于/ 所以使用()提升+的优先级
	return 0;
}

二、if语句

编程语言有三种结构

顺序结构:代码从上到下一行一行的执行。

int main()
{
	float a, b, c;  
	printf("%f\n", a+b+c);//此时由于还没有执行scanf,所以a b c没有值,所以不能输出正确结果
	scanf("%f%f%f", &a, &b, &c);   
	printf("%f\n", (a+b+c)/3);//因为+优先级小于/ 所以使用()提升+的优先级
	return 0;
}

选择结构(分支结构):选择性的执行代码

循环结构:反复的执行一部分代码

三种结构的组合足够表达人类的所有逻辑。

1.标准格式:

if( 条件 ) 
{
	语句1//如果“条件”为真,执行语句1
}
else//else部分是可以不写的,要根据实际的逻辑需求确定要不要写else;但是如果写了else,就必须有与之匹配的if
{
	语句2.//否则,也就是“条件”为假,执行语句2
}

示例1:

#include <stdio.h>

int main()
{
	if(0)//由于if中的条件是0,是假,所以执行else部分,不执行if部分,所以输出haha
	{
		printf("hehe\n");
	}
    else
    {
        printf("haha\n");
    }
	return 0;
}

示例2:

请输入一个整数数字,判断这个数字是否为偶数。

#include <stdio.h>

int main()
{
	int num;
	scanf("%d", &num);
    
	if(num%2 == 0)//num%2==0说明num除以2的余数是0,说明num是偶数
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

练习:

完成如下功能:

1 显示: “please input a number:”

2 用户输入一个整数

3 判断用户输入的数是不是 > 90

注意:复制粘贴代码绝对是高端操作,新手驾驭不了!!!!一定要对代码了如指掌才能复制粘贴。

#include <stdio.h>

int main()
{
	int num;
	printf("please input a num:\n");
	scanf("%d", &num);
	if(num > 90)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

练习:

输入一个整数,判定是否为偶数,如果是偶数,再判定这个数的一半是不是偶数。

输出该数和他的一半是不是偶数。

#include <stdio.h>

int main()
{
	int num;
	printf("please input a num\n");
	scanf("%d", &num);
	if(num%2 == 0)
	{
		printf("%d 是偶数\n", num);
		if(num/2%2 == 0)
		{
			printf("%d 的一半是偶数\n", num);
		}
		else
		{
			printf("%d  的一半不是偶数\n", num);
		}
	}
	else
	{
		printf("%d 不是偶数\n", num);
	}
	return 0;
}

2. if嵌套

if( 条件1 ) 
{	 
	if( 条件2 )//条件1为真才会判断条件2
	{
		语句2.  //条件1为真,条件2也为真才会执行语句2
	}
	语句3.//条件1为真,执行语句3.因为语句3不在条件2所在的if的{}里面。所以语句3和条件2没有关系。
}

3.if并列

if( 条件1 )
{
	语句1.//条件1为真,执行语句1
}
if( 条件2 )
{
	语句2.//条件2为真,执行语句2
}
并列if的每个条件之间,没有必然联系。一般都是相对独立的条件。

4. if - else if - else 多分支选择结构

if( 条件1 )
{
	语句1.  //条件1为真,执行语句1
}
else if( 条件2 ) //条件1为假,才会判断条件2。条件1为真,就不判断条件2;else if可以写无数个
{
	语句2. //条件1为假,条件2为真,才会执行语句2
}
else//else可以不写,根据实际的逻辑需要决定。
{
	语句3.//上面所有的条件都为假,才会执行语句3
}
多分支结构要求各个if条件之间只有逻辑关联的。

示例:

#include <stdio.h>

int main()
{
	int week;
	scanf("%d", &week);
	if( week > 7 || week < 1 )//判断输入的整数是否在1~7之间  
	{
		printf("error\n");
		return 0;//函数中执行return是结束函数,结束main函数意味着程序结束。
	} 	    
	if( week == 1 )
	{
		printf("Monday\n");//week等于1,输出Monday,然后下面的else if中的条件都不会判断
	}
	else if( week == 2 )//week不等于1,才会判断week == 2,
	{
		printf("Tuesday\n");//如果week等于2,输出Tuesday,下面的条件不会进行判断
	}
	else if( week == 3 )//week既不等于1,又不等于2,才会判断week == 3
	{
		printf("Wednesday\n");//如果week等于3,输出Wednesday
	}
	else
	{
		printf(“other days\n”);//week既不等于1,又不等于2,又不等于3,输出other days
	}
    return 0;
}

修改

#include <stdio.h>

int main()
{
	int week;
	scanf("%d", &week);

	if( week > 7 || week < 1 )//如果输入超出1~7范围,下面的条件不做判断。
	{
		printf("error\n");
	}
	else if( week == 1 )
	{
		printf("Monday\n");
	}
	else if( week == 2 )
	{
		printf("Tuesday\n");
	}
	else if( week == 3 )
	{
		printf("Wednesday\n");
	}
	else
	{
		printf(“other days\n”);
	}
    return 0;
}

练习:

请输入一个成绩,然后用 5 分制 去评定成绩。

成绩在0~100之间

A 90~100

B 80~89

C 70~79

D 60~69

E 0~59

#include <stdio.h>

int main()
{
	int score;
	scanf("%d", &score);
	if(score<0 || score>100)
	{
		printf("error\n");
	}
	else if(score>=90)//第一个条件已经排除了score>100的可能
	{
		printf("A\n");
	}
	else if(score>=80)
	{
		printf("B\n");
	}
	else if(score>=70)
	{
		printf("C\n");
	}
	else if(score>=60)
	{
		printf("D\n");
	}
	else
	{
		printf("E\n");
	}
	return 0;
}

练习:

输入一个数

判断一个数是否满足条件:

​ a) 是7的倍数

​ b) 不是3的倍数

​ 如果同时满足,输出该数

嵌套if和逻辑与很像

#include <stdio.h>

int main()
{
	int num;
	scanf("%d", &num);
	if(num%7 == 0)
	{
		if(num%3 != 0)
		{
			printf("num = %d\n", num);
		}
	}
	return 0;
}

或者

#include <stdio.h>

int main()
{
	int num;
	scanf("%d", &num);
	if(num%7==0 && num%3!=0)
	{
		printf("num = %d\n", num);
	}
	return 0;
}

三、进制

1. 进制表:

C语言没有二进制常量的写法。

进制只针对整数。

十进制:  逢十进一:   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15   16 
二进制:  逢二进一: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 10000
八进制:  逢八进一:  00  01  02  03  04  05  06  07  010  011  012  013  014  015  016  017   020
十六进制:逢十六进一:  0x0   0x1   0x2   0x3   0x4   0x5   0x6   0x7   0x8   0x9  0xa  0xb  0xc  0xd  0xe  0xf   0x10 0x11 0x12   0x13   0x14   0x15   0x16   0x17   0x18   0x19  0x1a  0x1b  0x1c  0x1d  0x1e  0x1f    0x20 

在C语言中使用八进制和十六进制的常量需要使用前缀:

八进制的前缀     0
十六进制的前缀    0x   0X
十进制格式:  %d 
八进制格式:  %o     %#o 带前缀输出八进制
十六进制格式:%x      %#x  带前缀输出十六进制
int main()
{
    int a = 100;
    printf("%d %#o %#x\n", a, a, a);//100  0144  0x64
    return 0;
};

a 的值到底是多少?数据在内存中都是以二进制存储,使用不同的进制表现数据,只是为了让人类阅读数据更加舒适。数据到底使用哪种进制来表现,取决于使用哪种进制能让数据阅读起来更加直观。

2. 二进制转其他

二转十: 二进制每个位上的数,与其对应的权值相乘,再将对应的结果相加。得到的就是十进制的值 。

0110 1011 = 107

在这里插入图片描述

二转八: 二进制的每三位数,对应转换成八进制的一位数。

001 101 011 = 0153

在这里插入图片描述

二转十六:二进制的每四个数,对应转换成十六进制的一位数。

0110 1011 = 0x6B

在这里插入图片描述

练习:

将以下二进制数,转换成其他进制的值。

​ 010000111 010101000 000011100

010000111010101000000011100
十进制13516828
八进制02070250034
十六进制0x870xA80x1C

3. 其他进制转换二进制

【十转二】 将十进制数,对二取余数,再将本次的商作为被除数继续对二取余,直到商为0时为止。将得到的余数,从后向前依次读出,即为转换的二进制数 
【八转二】 八进制每位数,对应转换成二进制的三位数。 
【十六转二】 十六进制的每位数,对应转换为二进制的四位数。 

【十转二 短除法】

以135为例
135/2=67......1
67/2=33........1
33/2=16........1
16/2=8..........0
8/2=4............0
4/2=2............0
2/2=1............0
1/2=0............1
1000 0111

【八进制转二进制:每一位八进制对应3位二进制】

0207
口算法:八进制转二进制   4 2 1 码转
010000111

【十六进制转二进制:每一位十六进制对应4位2进制】

0x135
口算法:十六进制转二进制  8 4 2 1 码转
0001  0011  0101

其他进制间的转换,可以以二进制作为媒介。

C语言是没有二进制常量的表示方法的。

在计算机眼中所有的数据都是二进制,八、十、十六进制都是为了让人类更加方便阅读而产生的。

四、字符常量

1. 字符常量:

在C语言代码中,字符常量的表示方式由单引号引起来的一个字符。

'1' 'a' '!'

注意事项:

  1. 必须是单引号引起来的。不能是其他符号。 ‘a’ 字符常量 “a"不是字符常量,”"表示字符串常量
  2. 只能是单个字符,不能是多个。 'ab’语法错误
  3. 如果非要多于一个字符,转义字符是被允许的。 '\n’转义字符不是用来给人看的,而是用来实现特殊功能的,所有的转义字符都是以 \ 开头

在C语言中字符的本质是整数。字符常量在内存中是以整数形式存储的。

之所以还要使用字符,是因为人类喜欢阅读字符。

2. ascii 码

在C语言中使用的字符,必须是ASCII码表中存在的字符。

(ASCII(American Standard Code for Information Interchange,美国信息交换标准代码))

在这里插入图片描述

Linux 使用手册查表: man ascii 按 q 退出

示例1:

字符型和整型的关系

char是定义字符类型变量的关键字

%c 是字符类型的格式符 和%d %o %f %x是同一类东西。

#include <stdio.h> 

int main()
{
	char a = 'A';//定义字符型变量,变量名叫a,用'A'初始化变量a
    a = a+1;//因为字符的本质是整数,整数可以进行加法运算
	printf("%c  %d\n",a ,a);//同样输出a,既可以用字符形式,也可以用整数形式
	return 0;
}
#include <stdio.h>

int main()
{
	int a = 'A';//将char换成int结果是一样的
	a = a+1;
	printf("%c %d\n", a, a);
	return 0;
}

int和char占内存的大小不一样。

int 占4个字节 的整数

char 占1个字节 的整数

除了占内部大小不一样以外,char和int用法完全一样。

char的本质就是一个字节的整数,顺便可以用来表示字符。

示例2:

字符存在的意义,是因为人类需要阅读字符,对于计算机而言全是整数

#include <stdio.h>

int main()
{
    //如果这个输出是人名,显然一字符形式输出更加直观。
	char c = 'b';
	char c2 = 'o';
	char c3 = 'b';
	printf("%c%c%c\n", c, c2, c3);//bob
	printf("%d%d%d\n", c, c2, c3);//9811198
	return 0;
}

示例3:

将数字字符转成对应的整数

int main()
{
	char a = '9';//使用'9'初始化变量a,a中的整数是57,现在的变量a能当做整数9计算码?不能
    //现在就想把a中的'9'当做整数9计算,需要进行一步转换。
	int num = a-'0';//任何数字字符,减去48或者减去'0'都能得到对应的整数
	int num2 = a-48;
	printf("%d %d\n", num, num2);//9 9
	return 0;
}

练习:

输入一个字符,判定这个字符是否是大写字母。

%c

#include <stdio.h>

int main()
{
	char c;
	scanf("%c", &c);
	if(c>='A' && c<='Z')//推荐这么写,更加直观
	//或者if(c>=65 && c<=90)
	{
		printf("%c yes\n", c);
	}
	else
	{
		printf("%c no\n", c);
	}
	return 0;
}

需要阅读字符,对于计算机而言全是整数

#include <stdio.h>

int main()
{
    //如果这个输出是人名,显然一字符形式输出更加直观。
	char c = 'b';
	char c2 = 'o';
	char c3 = 'b';
	printf("%c%c%c\n", c, c2, c3);//bob
	printf("%d%d%d\n", c, c2, c3);//9811198
	return 0;
}

示例3:

将数字字符转成对应的整数

int main()
{
	char a = '9';//使用'9'初始化变量a,a中的整数是57,现在的变量a能当做整数9计算码?不能
    //现在就想把a中的'9'当做整数9计算,需要进行一步转换。
	int num = a-'0';//任何数字字符,减去48或者减去'0'都能得到对应的整数
	int num2 = a-48;
	printf("%d %d\n", num, num2);//9 9
	return 0;
}

练习:

输入一个字符,判定这个字符是否是大写字母。

%c

#include <stdio.h>

int main()
{
	char c;
	scanf("%c", &c);
	if(c>='A' && c<='Z')//推荐这么写,更加直观
	//或者if(c>=65 && c<=90)
	{
		printf("%c yes\n", c);
	}
	else
	{
		printf("%c no\n", c);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super Mark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值