基础2.1:基本数据类型、运算符和变量

1. 基本数据类型–字符型、整型和浮点型

在Hello World示例使用了字符串,在C语言中还有一类常用的数据类型–数值类型。例如:字符c、整数123和小数3.14
下面是在终端输出,字符,整数和小数。

完整代码见00101_date.c

#include <stdio.h>

int main() {
  printf("%c\n",'a');
  printf("%d\n",123);
  printf("%f\n",3.14);
  return 0;
}
  • 说明
    字符型是单个字符,必须使用英文单引号包裹。
    这里使用了输出函数另一种用法:
 printf("输出格式",输出项列表);

输出格式:
%c(c是charactor的首字母)表示输出单个字符
%d(d是十进制数decimal的首字母)表示输出整数
%f(d是浮点数float的首字母)表示输出小数
输出项列表:即存放要输出的变量名称。

注意,这里使用printf()时,前面的字符串和后面的数字中间用逗号,隔开。这里的%c%d%f称为占位符,在终端输出时,用后面的的数字替换。注意,不同类型的占位符是有区别的,用错了打印的值也会错误。

我们还可以把上面的两行合成一行。

完整代码见00102_date.c

  #include <stdio.h>
    
    int main() {
      printf("%c\n%d\n%f\n",'a',123,3.14);
      return 0;
    }

数字可以与字符串一起打印。

完整代码见00103_date.c

 #include <stdio.h>
    
    int main() {
      printf("字符:%c\n整数:%d\n小数:%f\n",'a',123,3.14);
      return 0;
    }

试一下,用上面的方法打印一下自己的姓名、年龄、身高、体重、体温等数据。

完整代码见002_information.c

#include <stdio.h>

int main() {
  printf("姓名:张三\n");
  printf("年龄:%d岁\n",25);
  printf("身高:%dcm\n",175);
  printf("体重:%dkg\n",60);
  printf("体温:%f度\n",37.5);
  return 0;
}

这里只是简单介绍了数值类型,后面会有更加详细介绍。

2. 运算符–简单运算法(算术运算符、关系运算符和逻辑运算符)

程序中数字之间是可以像数学中数字一样进行运算的。例如:1+2,2*3等。
试一下

(完整代码见003_operatior.c)

 #include <stdio.h>
    
    int main() {
      printf("%d\n",1+2+3);
      return 0;
    }

对于数字常用的简单运算有算术运算符、关系运算符和逻辑运算符三类运算符。

2.1 算术运算符

运算符符号操作用例结果
加法+使它两侧的值加到一起1+23
减法-从它前面的数减去后面的数5-32
乘法*将它前面的数乘以后面的数2*36
除法/用它左边的值除以右边的值8/32(整数的除法会丢掉小数部分)
取模/取余%求用它左边的值除以右边的数后的余数5%32(%运算符两侧的操作数必须为整数)
  • 算术运算符特点

    • 优先级:* / % > + -
    • 结合律:自左向右
  • 练习*

    1. 求半径为3的圆的周长和面积。
    2. 求半径为5的圆的周长和面积。
    3. 1小时40分钟30秒共计多少秒。
    4. 求10000秒是几小时几分钟几秒。
    5. 已知一个两位整数,分别求出个位数与十位数。

    (完整代码见004——exe)

    1&2
    注意:(1)库;math.h
    M_PI //表示pi的真实值,结果最好用浮点数表示周长或者面积
    (完整代码见00401_circle.c)

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


int main() {
  int r;
  printf("Please input the radius:\n");
  scanf("%d",&r);
  printf("%f %f\n",2*M_PI,M_PI*r*r);
  return 0;
}

3.4
注意:方案1:用求差的方法,进行转化;

h1 = sum/3600;
  m1 = (sum-h1*3600)/60;
  s1 = sum -h1*3600 -m1*60;

(完整代码见0040301_time.c)

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


int main() {
  int h,  m,  s, total;
  printf("Please input the hour,minute,second:\n");
  scanf("%d%d%d",&h,&m,&s);
  total = h*3600+m*60+s;
  printf("%d\n",total);
  printf("-----------------\n");
  int sum, h1,m1,s1;
  printf("Please input the sum:\n");
  scanf("%d",&sum);
  h1 = sum/3600;
  m1 = (sum-h1*3600)/60;
  s1 = sum -h1*3600 -m1*60;
  printf("%dhour %dminute %dsecond\n",h1,m1,s1);
  return 0;
}

注意:方案2:用取模和除的方法,进行转化;

 h1 = sum/3600;
  m1 = (sum%3600)/60;
  s1 = sum%60;

(完整代码见0040302_time.c)

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


int main() {
  int h,  m,  s, total;
  printf("Please input the hour,minute,second:\n");
  scanf("%d%d%d",&h,&m,&s);
  total = h*3600+m*60+s;
  printf("%d\n",total);
  printf("-----------------\n");
  int sum, h1,m1,s1;
  printf("Please input the sum:\n");
  scanf("%d",&sum);
  h1 = sum/3600;
  m1 = (sum%3600)/60;
  s1 = sum%60;
  printf("%dhour %dminute %dsecond\n",h1,m1,s1);
  return 0;
}

5

注意:方案2:用取模和除的方法,进行转化;
(完整代码见00405——bit.c)

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


int main() {
  int h,  l,  total;
  printf("Please input the total:\n");
  scanf("%d",&total);
  h = total/10;
  l = total%10;
  printf("shi%d gewei%d\n",h,l);
  return 0;
}

2.2 关系运算符

数字除了可以计算外,还可以比较大小。

运算符符号操作
等于==检查两个操作数的值是否相等,如果相等则条件为真。
不等于!=检查两个操作数的值是否相等,如果不相等则条件为真。
大于>检查左操作数的值是否大于右操作数的值,如果是则条件为真。
小于<检查左操作数的值是否小于右操作数的值,如果是则条件为真。
大于等于>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
小于等于<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

在C语言中0为假,其他为真。
注意:这里除了><与数学表示一样,其他的都与数学表示有区别。

  • 关系运算符特点
    • 优先级:算术运算符 > > >= < <= > == !=
    • 结合律:自左向右
  • 练习
    1. 偶数/奇数判断
    2. 整除判断
    3. 猜测并判断下面程序的结果。(1)
 #include <stdio.h>
    
    int main(){
        printf("1<100<10这个式子结果是:%d\n",1 < 100 < 10);
    }

(完整代码见005——exe)
1.注意:三元运算的两个结果为表达式,而不是语句;

//  (r%2==0)?(r=1):(r=0);
  (r%2==0)?(printf("oushu")):(printf("jishu"));//.注意:三元运算的两个结果为表达式,而不是语句;

(完整代码见00501_jiou.c)

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


int main() {
  int r;
  printf("Please input the r:\n");
  scanf("%d",&r);
//  (r%2==0)?(r=1):(r=0);
  (r%2==0)?(printf("oushu")):(printf("jishu"));//.注意:三元运算的两个结果为表达式,而不是语句;
//  printf("%d\n",r);
  return 0;
}

(完整代码见00502_zhengchu.c)

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


int main() {
  int r,d;
  printf("Please input the r,d:\n");
  scanf("%d%d",&r,&d);
//  (r%2==0)?(r=1):(r=0);
  (r%d==0)?(printf("may\n")):(printf("may not\n"));
//  printf("%d\n",r);
  return 0;
}

2.3 逻辑运算符

真假也可以运算,被称为逻辑运算。有如下:

运算符符号描述
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。
`
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

有点像电路中的并联串联。

在这里插入图片描述

  • 逻辑运算符特点:

    • 优先级:! > 算术运算符 > 关系运算符 > && > ||
    • 结合律:&&||自左向右;!自右向左。
  • 练习

    1. 闰年判断
    2. 三角形构成判断
    3. 猜测并判断下面程序的结果。
 #include <stdio.h>
        
        int main () {
           printf("%d\n",!100+10);  //10
           printf("%d\n",!0+10);  //11
           return 0;
        }

(完整代码见006_exe)

1.注意:闰年: (1)能被400整除 或者 能被4整除但不能被100整除

if (year%400==0 || (year%4==0 && year%100!=0)) 
 	{ 
 		printf("%d年为闰年!\n", year); 
 	} 
 	else 
 	{ 
 		printf("%d年为非闰年!\n", year); 
 	} 

(完整代码见00601_leap.c)

/*
  * 功能:任意输入一个年份,判断其是否为闰年
  * 编辑日期:2019-1-29
 */ 
 #include <stdio.h> 
 int main(void) 
 { 
 	int year; 
 	printf("请输入年份:"); 
 	/* 循环获取用户输入 */
 	scanf("%d",&year);
 	/*闰年: (1)能被400整除 或者 能被4整除但不能被100整除*/ 
 	if (year%400==0 || (year%4==0 && year%100!=0)) 
 	{ 
 		printf("%d年为闰年!\n", year); 
 	} 
 	else 
 	{ 
 		printf("%d年为非闰年!\n", year); 
 	} 
 	return 0; 
 } 

2.注意:三角形的判断:两边之和大于第三边;两边之差小于第三边;
二者任选其一

if(a+b<=c||a+c<=b||b+c<=a)  //判断能否构成三角形(1)
   printf("不能构成三角形\n"); 

(完整代码见00602_triangle.c)

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


int main() {
  int a,b,c;
  printf("Please input the a,b,c:\n");
  scanf("%d%d%d",&a,&b,&c);

 if(a+b<=c||a+c<=b||b+c<=a)  //判断能否构成三角形(1)
   printf("不能构成三角形\n"); 
else
  printf("构成三角形\n"); 
  return 0;
}

2.4 优先级和括号

运算符都有优先级,改变优先级使用()

  • 练习
    1. 任意五个数的平均数
      (完整代码见00701_ave.c)
/*
  * 编辑日期:2019-1-29
 */ 
 #include <stdio.h> 
 int main(void) 
 { 
 	int a1,a2,a3,a4,a5; 
 	printf("请输:"); 
 	/* 循环获取用户输入 */
 	scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
        float ave=0.0;
        ave = (a1+a2+a3+a4+a5)/5.0;
	printf("ave is %f\n ",ave);
 	return 0; 

 } 

3. 变量

上面的例子中,有些值一直是变化的,而另外一些值是不变,例如,求圆的周长和面积的时候,半径是变的,而圆周率是不变,在数学中我们通常使用变量代替,在程序中也可以定义并使用变量

杯子的作用是盛水,变量的作用是保存数据。

3.1 基本语法

  1. 定义
    定义用来说明变量的名字和类型。
    • 语法
      先指定类型,然后指定变量名。
      在这里插入图片描述
  类型 变量名;
*   示例
int a;//  定义整型变量为a;
        float b;// 定义浮点型变量为b;
   这里的`int`表示整型,`float`表示浮点型。  
  1. 赋值
    在变量名后,紧接=,后面再接常量。
 a = 10;
    b  = 1.2;
  1. 使用
    使用方式与常量相同。直接使用变量代替常量
#include <stdio.h>
    
    int main(){
       int a;// 声明整型变量为a;
       float b;// 声明浮点型变量为b;
       a = 10;
       b  = 1.2;
       printf("a=%d\nb=%f\n",a,b);
       printf("%d+%f=%f\n",a,b,a+b);
     }
  1. 初始化
    定义和赋值通常可以写在一起。这种定义时赋值的操作被称作初始化。
 int a = 10;
    float b  = 1.2;

初始化与赋值的区别
在这里插入图片描述在这里插入图片描述

试一试

  1. 使用变量前没有定义或出现什么情况?出错
  2. 使用变量前没有赋值打印和计算结果是什么?溢出

练习

  1. 华氏温度转摄氏度
    摄氏温标©和华氏温标(F)之间的换算关系为:
    在这里插入图片描述
  2. 长度换算
    1英尺 = 0.3048米
    1英里 = 1609.3米
    1英寸 = 2.54厘米
  3. 交换两个整数的值

(完整代码见008——exe)

1.(完整代码见00801_temper.c)

#include<stdio.h>
int  main()
{
	float F1,C1;
	printf("请输度入您需要转换的摄氏温度问:答");
	scanf("%f",&C1);
	F1=(C1+32)*9/5.0;
	printf("其对应内的华容氏温度为:%.2f\n",F1);

	float C2,F2;
	scanf("%f",&F2);
	C2=5.0/9*(F2-32);
	printf("%8.2f\n",C2);
	
	return 0;
}

2.注意:采用宏定义的方式,进行公式的转换,注意写法

#define Mile 1609.3 //1英里 = 1690米
#define Foot 0.3048 //
#define Inch 2.54 //

(完整代码见00802_transfer.c)

#include<stdio.h>
#define Mile 1609.3 //1英里 = 1690米
#define Foot 0.3048 //1英里 = 1690米
#define Inch 2.54 //1英里 = 1690米

int main(){
	float mile, foot, inch;
	scanf("%f%f%f",&mile,&foot,&inch);
	printf("%f\n %f\n %f\n",mile*Mile, foot*Foot,Inch*inch);	
	return 0;


}

3.注意:(3.11)不引用函数的时候,进行变量赋值,可以实现交换;
(完整代码见00803——swap.c)

#include <stdio.h>

main(){
	int a = 10;
	int b = 20;

	printf("a=%d b=%d\n",a,b);
	// 经过XX操作
	int c;
	c = a;
	a = b;
	b = c;	
	printf("a=%d b=%d\n",a,b);

}

(3.2)引用函数的时候,进行参数的值传递,不可以实现交换
(完整代码见00804——swap.c)

#include <iostream>
using namespace std;


void Swap(int m, int n){
	int t = m;
	m = n;
	n = t;

}
int main(){
	int n = 10;
	int m = 100;
	Swap(n,m);
	cout << "n:" << n << "\tm:" << m << endl;
}

编码套路:惯用法

3.2 命名规则

中国姓名中是否可以使用字母和数字?
在这里插入图片描述

人的名字不能乱起,变量名字也不能随便起的,需要遵循一定的规制–命名规则。

  1. 变量名是字母、数字和下划线的组合。
  2. 变量名的开头必须是字母或下划线,不能是数字。
    实际编程中最常用的是以字母开头,而以下划线开头的变量名是系统专用的。
  3. 变量名中的字母是区分大小写的。比如aA是不同的变量名,numNum也是不同的变量名。
  4. 变量名绝对不可以是C语言关键字关键词是由C语言规定的具有特定意义的字符串,通常也称为保留字。
    标准C语言有如下关键字:
    在这里插入图片描述

3.3 重点

  1. 变量使用前必先初始化(定义和赋值)
  2. 变量显性三要素:类型、变量名、值
    在这里插入图片描述

4. 表达式

变量和常量能够参与计算,这种计算的式子称为表达式,表达式由运算符和操作数组成。
表达式必有计算结果。

5. 输入

如何通过键盘输入数字,并且保存在变量中?

(完整代码见009_scanf.c)

 #include <stdio.h>
    
    int main(){
        int n;
        scanf("%d",&n);
        printf("%d\n",n);
        return 0;
    }

练习

  1. 计算两个数的和差积商余。
  2. 输入一个年月日组成的数字,按照XXXX年XX月XX日打印出来。例如:输入20190311,打印出2019年3月11日。
  3. 输入一个时分秒组成的数字,按照XX时XX分XX秒打印出来。例如:输入180301,打印出18时3分1秒。

1.(完整代码见01001——TowNum.c)

#include <stdio.h>

main(){
	int n,m;
	printf("请输入一个数字:");
	scanf("%d",&n);
	printf("请再输入一个数字:");
	scanf("%d",&m);
	printf("%d+%d=%d\n",n,m,n+m);
	printf("%d-%d=%d\n",n,m,n-m);
	printf("%d*%d=%d\n",n,m,n*m);
	printf("%d/%d=%d\n",n,m,n/m);
	printf("%d%%%d=%d\n",n,m,n%m); // 打印一个%,必须使用%%

}

2.1注意采用取余和除
2.2(完整代码见01002——date.c)

#include <stdio.h>

main(){
	int date;
	printf("请输入日期(yyyymmdd):");
	scanf("%d",&date);
	printf("%d年%d月%d日\n",date/10000,date%10000/100,date%100);
}

3(完整代码见01003——time.c)

#include <stdio.h>

int main(){
	int time;
	printf("请输入time(hhmmss):");
	scanf("%d",&time);
	printf("%dhh %dmm %dss\n",time/10000,time%10000/100,time%100);
}

灵活的语法

  1. 多个变量同时定义
   int a,b;
定义的变量类型必须一致。
  1. 多个变量同时赋相同值
a=b=10;
  1. 多个变量同时初始化
   int a=10,b=20;
  1. 复合赋值运算符
运算符描述实例
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A

说明
复合赋值运算符与赋值运算符的优先级相同。

  1. 自增运算符++与自减运算符--

前缀自增/自减

运算符描述实例
++自增运算符,整数值增加 1++A 相当于 A=A+1
自减运算符,整数值减少 1–A 将得到 A=A-1

下面三条语句可以看成一样的。

a=a+1;
a+=1;
++a;

自减也是一样的。

  a=a-1;
    a-=1;
    --a;

后缀自增/自减

后缀自增/自减是一种特殊表达式,它的值是变量的原来的值,表达式计算结果后,变量的值自动加1/减1。

自增运算符与自减运算符与其他运算法不同点在于副作用(表达式计算结果之后修改变量的值)。所以,分析时需要分别分析表达式的值和变量的值。

前缀自增(++n)前缀自减(–n)后缀自增(n++)后缀自减(n–)
表达式的值n+1n-1nn
变量的值n+1n-1n+1n-1

前缀与后缀的不同点在于表达式的值是否加1/减1,相同点在于变量的值都会加1/减1。

  • 说明

    1. 自增运算符++、自减运算符--和复合赋值运算符主要用于简化代码。
    2. 自增运算符与自减运算符优先级高于算术运算符。

(完整代码见011_increame.c)

#include <stdio.h>

main(){
	int n;
	n = 1;
	n = n+1;
	printf("n=%d\n",n);
	n += 1;// 等同于n = n + 1;
	printf("n=%d\n",n);

	printf("++n=%d\n",++n);// 
	printf("n=%d\n",n);


	// +=, -= ,/= ,*=,%=
	// ++ --
}
  • 试一试

    1. 这两个运算符可以用在常量吗?不可以
    2. 分析下面代码的输出结果。

(完整代码见012——Test.cpp)

每一个运算符运算完之后才能算下一个
i j(1,2)
第一步运算(1+3=4) (i/j 2 ,3)
第二部运算 (4+2=6)(i/j 3,3)

#include <stdio.h>

int main(){
 int i = 1;
 int j = 2;
 int k = i++ + ++j + i++printf("%d %d %d\n",i,j,k);// 3 3 6

同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
例外的是:左++ – >赋值运算符;
但是右++,右-- < 赋值运算符

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值