C语言的基础知识、结构和常用函数 -----Day10
一.知识点汇总
1.C之前奏——算法
1.1程序设计 = 数据结构 + 算法
- 算法分类
数值算法 和 非数值算法
- 算法的特点
有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出
1.2C语言的编译运行步骤
- 通常在Linux系统下利用vim编辑器进行编译,有以下几个步骤:
1.vim 1.c ----> 2.写代码---->3.gcc 1.c ----> 4.生成a.out -----> 5./a.out
2.C之基本结构与常用函数
2.1字符集与标识符
- 标识符的分类
- 定义方法
1.字母数字下划线;
2.区分大小写;
3.标识符的名字要见名知义;
4.首字母必须下划线和字母
2.2基本数据类型——常量
- 分类如下
2.2.1整型数据
- 整型数据的说明以及范围、字节数
2.2.2 数值的表示方法
原码、反码、补码
整数的原码、反码、补码一样
有符号的数值,反码将原码的除符号位,0变,1变0;补码在反码基础上加2;
2.2.3 实形数据
- 分类
单精度(float)、双精度(double)、长双精度(long double)
2.2.4 常量与变量
- 整型常量
十进制、八进制、十六进制
- 类型
int 1500
long 1500L
unsigned int 1500U
- 实型常量
十进制小数形式、指数形式、float类型实常量
2.2.5 转义字符
- 集中常用的转义字符
/n :回车换行 /r :回车
/b :退格 /t :table 键
/ddd :1~3位八进制数所代表的字符
/xhh :1~2位十六位进制数所代表的字符
2.2.6 ASCLL 表中常用的几个
‘A’ :65 ‘a’ :97 ’ (空格)’ :32
‘0’ :48
2.2.7 字符串常量
- 定义
字符串常量是由一对双引号括起的字符序列.
2.2.8 符号常量
#define N 10 //将N默认为10
2.3基本数据类型—— 变量
2.3.1 整型变量
- 分类
基本型、短整型、长整型、无符号型
2.3.2 实型变量
- 分类
float :占4字节,提供7位有效数字
double :占8字节,提供16位有效数字
2.3.3 字符变量
char a = ‘A’; 可以与int数据进行运算
2.4 大端与小端
2.4.1大端与小端如何区分?
小端模式:低位存放在低地址当中;
大端模式:低位字节存放在高地址当中;
2.5 常用输入/输出函数
2.5.1 字符输出函数——putchar()
输出字符到显示器
2.5.2 字符输入函数——getchar()
从键盘上读取一个字符
2.5.3 printf()函数的用法
- printf("%-m.n",x);
%:格式说明的起始符号
-:左对齐,不加-则补空格右对齐;
0:指定空位
m.n:表示宽度为m,若宽度大于m,则原样输出;可以用*.*来代替,将数字传递进去;
2.5.4 scanf()函数的用法
- scanf(“%d%d”,&a,&b);
- 抑制符%*
相当与给删除掉,不要;
scanf("%3d%*4d%f",&k,&f); //输入123456789.256
//则k =123 , 4567由于抑制符所以不要; f = 89.256
2.6 常用函数
2.6.1 库函数——stdio.h
#include<stdio.h> // 添加头文件
2.6.2 数学函数——math.h
#include<math.h> // 添加头文件
- 平方根函数
double sqrt(double )
- 绝对值函数
double fbs(double)
- 指数函数
double pow(double x, double y)
- 平方根函数
2.6.3 随机发生器函数——stdlib.h
#include<stdlib.h> // 添加头文件
- 随机数发生器——rand
int a = rand();
- 初始化随机数发生器——srand
void srand (time(NULL)) // 需要添加头文件<time.h>
2.6.4 终止程序运行函数——exit
exit(0);
二.疑难问题
1.main函数里面加不加void有什么区别,有何意义?
如果main函数里面不传入实参的话,推荐使用int main(void);如果有实参传入的话,则不需要添加void在main函数里面。
2.在整形无符号char中溢出问题与-128?
整数在内存中是以补码存取的,正数的补码:等于自己,负数的补码:取反加1,例如:127在内存中表示为0111 1111, -127在内存中表示为~(0111 1111)+1=1000 0001; 假定某内存单元p的内容是1111 1111,那么它一定是255吗?实际上取决于你的代码是要把它看成有符号还是无符号数,如果是无符号则表示255,如果是有符号则表示-1【对于有符号数,最高位为符号位,1表示负,0表示正】:
3.求一个变量的字节数为什么要用十六进制数?
因为在现在的电脑系统中一般都是32位或者64位的操作系统,所以用十六进制数比较方便,而且便于操作。
4.剖析一下getchar()与%*抑制符的用法;
当时用getchar()输入函数时::检测到回车,数据首先会被写入到输入缓存区,然后将缓存区里面的内容逐个取走;若数据没有被完全取光,显示界面不然不会出现阻塞区,而是直接会输出缓存区中的等待字符【回车也会被当做指令写入到输入缓存区】;
%*抑制符可以将输入的回车删除,直接输入下一个字符。
三.思考题与课间作业
1.判断一个整数能否被16整除,满足什么特点?
转成二进制后四位必定为0,则能被16整除
if (X & 0x0F == 0) // 说明能被16整除
2.下列书写形式正确的是?
A.2.3F
B.3.1e0.5
C.800U
D.18UL
ACD:c选项中的指数型e后只能跟随整数,D选项UL表示 unsigned long
3.判断小数a是否等于0.0?
if(a > -0.000001 && a < 0.000001)
4. float t = 1.34;printf("##%0*.*f##\n", 7, 3, t);表示什么意思?
这里的‘’* . *表示宽度为7,保留三位小数,可以很灵活的控制输出格式。
5.不同整型的数字该怎样输出?
short —%hd
unsigned short —%hhd
char – %hhd:char要用十进制输出
unsigned char:要用%hhu
long --%ld
unsigned long —%lu
6.在下面代码中,字符1为什么是0x31,而不是0x21?
#include<stdio.h>
int main()
{
char ch[4] = {'1','2','3','\0'};
int *p = (int *)ch;
printf("%d",*p);
return 0;
}
原因是0x31转换成十进制就表示49,ASCLL码表示字符‘1’
7.输入本金、存款期(年)、年利率,计算到期日本金和利息之和?
1 #include<stdio.h>
2 #include<math.h>
4 #define profit_rate 0.2
9 int main()
10 {
11
12 double BenJing,Money_Sum,lixi;
13 int date;
14 printf("请输入您要新存的本金(万)和年限:\n");
15 scanf("%lf %d",&BenJing,&date);
16 Money_Sum = BenJing + BenJing*date*profit_rate;
17 lixi = BenJing * profit_rate;
18
19 printf("您的本金总和为:%.2lf\n利息一共为:%.2lf\n",Money_Sum,lixi);
20 return 0;
21 }
8.随机生成一个数,并打印此整数,多次运行程序,结果都不相同
1 #include<stdio.h>
2 #include<math.h>
3 #include<stdlib.h>
4 #include<time.h>
5
6 int main()
7 {
8 int a;
9 srand(time(NULL));
10 a = rand();
11 printf("%d\n",a%100);
12
13 return 0;
14 }
四.自我总结
通过了这一天对C语言的学习,让我在以前对C语言的理解基础上接触到了更深层次的知识点,比如抑制符、printf函数的输出格式、算法的分类和特点;以及对补码和数据溢出的理解更加深刻。更多接触到的是以前没有接触过的领域,也对这些比较难的知识点有了更深的认识。
学习的过程中任然存着很多不明白的知识,我也都记录了下来,希望能在后续的学习过程中一步一步的攻克;