C语言学习-翁凯-第六章

第六章

6.0.1 给定条件的整数集

int a;scanf("%d",&a);int i,j,k;int cnt=0;//i=indexi=a;while(i<=a+3){j=a;while(j<=a+3){k=a;while(k<=a+3){if(i!=j){if(i!=k){if(j!=k){cnt++;printf("%d%d%d",i,j,k);if(cnt==6){printf("\n");cnt=0;}else{printf(" ");}}}}k++;}j++;}i++;}return 0;

6.0.2 水仙花数

int n;scanf("%d",&n);int first=1;int i=1;while(i<n){first *=10;i++;}printf("first=%d\n",first);//遍历100-999i=first;while(i<first*10){int t=i;int sum=0;do{int d=t%10;t/=10;int p=d;int j=1;while(j<n){p*=d;j++;}sum+=p;}while(t>0);if(sum==i){printf("%d\n",i);}i++;} return 0;

6.0.3 九九乘法表

int n;//scanf("%d",&n);n=9;int i,j;i=1;while(i<=n){j=1;while(j<=i){printf("%d*%d=%d",j,i,i*j);if(i*j<10){printf("   ");}else{printf("  ");}j++;}printf("\n"); i++;}return 0;

6.0.4 统计素数求和

int m,n;int i;int cnt=0;int sum=0;scanf("%d %d",&m,&n);if(m==1){m=2;}for(i=m;i<=n;i++){int isPrime=1;for(int k=2;k<i-1;k++){if(i%k==0){isPrime=0;break;}}//判断i是否为素数 if(isPrime){cnt++;sum+=i;printf("%d ",i);} }printf("\n");printf("%d %d\n",cnt,sum); return 0;

6.0.5 猜数游戏

int number,n;int inp;int cnt=0;int finished=0;scanf("%d %d",&number,&n);do{scanf("%d",&inp);cnt++;if(inp<0){printf("Game Over\n");finished=1;}else if(inp>number){printf("Too Big\n");}else if(inp<number){printf("Too Small\n");}else{if(cnt==1){printf("Bingo!\n");}else if(cnt<=3){printf("Lucky You!\n");}else{printf("Good Guess!\n");}finished=1;}if(cnt==n){if(!finished){printf("Game Over\n");finished=1;}}}while(!finished);return 0;

6.0.6 n项求和

int n;double dividend,divisor;double sum=0.0;int i;double t;scanf("%d",&n);//n=20000;dividend=2;divisor=1;for(i=1;i<=n;i++){sum+=dividend/divisor;t=dividend;dividend=dividend+divisor;divisor=t;}printf("%.2f\n",sum);return 0;

6.0.7 约分最简分式、念数字、求a的连续和

int dividend,divisor;scanf("%d/%d",&dividend,&divisor);int a=dividend;int b=divisor;int t;while(b>0){t=a%b;a=b;b=t;}printf("%d/%d\n",dividend/a,divisor/a);return 0;

 int x;scanf("%d",&x);if(x<0){printf("fu");x=-x;} int mask=1;int t=x;while(t>9){t/=10;mask *=10;}do{int d=x/mask;switch(d){case 0:printf("ling");break;case 1:printf("yi");break;case 2:printf("er");break;case 3:printf("san");break;case 4:printf("si");break;case 5:printf("wu");break;case 6:printf("liu");break;case 7:printf("qi");break;case 8:printf("ba");break;case 9:printf("jiu");break;}if(mask>9)printf(" ");x%=mask;mask/=10;}while(mask>0);printf("\n");return 0;

int a,n;scanf("%d %d",&a,&n);int sum=0;int i;int t=0;for(i=0;i<n;i++){t= t*10+a;sum+=t;}printf("%d\n",sum);return 0;

6.1.1 数据类型:C语言有哪些基本数据类型,sizeof可以做什么

C是有类型的语言

  • C语言的变量,必须

    • 在使用前定义,并且
    • 确定类型
  • C以后的语言向两个方向发展:
    • C++/Java更强调类型,对类型的检查更严格
    • JavaScript、Python、PHP不看重类型,甚至不需要事先定义

类型安全

  • 支持强类型的观点认为明确的类型有助于尽早发现程序中的简单错误
  • 反对强类型的观点认为过于强调类型迫使程序员面对底层、实现而非事务逻辑
  • 总的来说,早期语言强调类型,面向底层的语言强调类型
  • C语言需要类型,但是对类型的安全检查并不足够

C语言的类型

  • 整数

    • char、short、int、long、long long
  • 浮点数
    • float、double、long double
  • 逻辑
    • bool
  • 指针
  • 自定义类型

(long long、long double、bool是C99的类型)

类型有何不同

  • 类型名称:int、long、double
  • 输入输出时的格式化:%d、%ld、%lf
  • 所表达的数的范围:char<short<int<float<double
  • 内存中所占据的大小:1个字节到16个字节
  • 内存中的表达形式:(整型)二进制(补码)、(浮点数)编码

sizeof

  • 是一个运算符,给出某个类型或变量在内存中所占据的字节数

    • sizeof(int)
    • sizeof(i)
  • 是静态运算符,它的结果在编译时刻就决定了
  • 不要在sizeof的括号里做运算,这些运算不会做的
printf("sizeof(char)=%ld\n",sizeof(char));//1printf("sizeof(short)=%ld\n",sizeof(short));//2printf("sizeof(int)=%ld\n",sizeof(int));//4printf("sizeof(long)=%ld\n",sizeof(long));//4printf("sizeof(long long)=%ld\n",sizeof(long long));//8printf("sizeof(float)=%ld\n",sizeof(float));//4printf("sizeof(double)=%ld\n",sizeof(double));//8printf("sizeof(long double)=%ld\n",sizeof(long double));//16return 0;

6.1.2 数据类型:除了int,还有多少整数类型

整数

  • char:1字节(8比特)
  • short:2字节
  • int:取决于编译器(CPU),通常的意义是“1个字”
  • long:取决于编译器(CPU),通常的意义是“1个字”
  • long long:8字节

6.1.3 整数的内部表达:整数是如何表达的,尤其是负数如何表达

*整数的内部表达

  • 计算机内部一切都是二进制

    • 18->00010010
    • 0->00000000
    • -18 ->?

*二进制负数

  • 1个字节可以表达的数:

    • 00000000——11111111(0-255)
  • 三种方案:
    1. 仿照十进制,有一个特殊的标志表示负数
    2. 取中间的数为0,如果1000000表示0,比它小的是负数,比它大的是正数
    3. 补码

*补码

  • 考录-1,我们希望-1+1->0.如何能做到?

    • 0 -> 00000000
    • 1 -> 00000001
    • 11111111+00000001->100000000
  • 因为0-1 -> -1,所以, -1 =
    • (1)00000000-00000001 ->11111111
    • 11111111被当作纯二进制看待时,是255.被当做补码看待时是-1
  • 同理,对于-a,其补码就是0-a。实际是2ⁿ-a,n是这种类型的位数

(补码的意义就是拿补码和原码可以加出一个溢出的“零”)

6.1.4 整数的范围:如何推算整数类型所能表达的数的范围,越界了会怎样

数的范围

  • 对于一个字节(8位),可以表达的是:

    • 00000000-11111111
  • 其中
    • 00000000->0
    • 11111111~10000000 ->-1~-128
    • 0000000101111111->1127

整数的范围

  • char:1字节(8比特)-128~127
  • short:2字节:-32768~32767
  • int:取决于编译器(CPU),通常的意义是“1个字”:-2的(32次方-1)~2的(32次方-1)-1
  • long:取决于编译器(CPU),通常的意义是“1个字”:4字节
  • long long:8字节

unsigned

  • 如果一个字面量常数想要表达自己是unsigned,可以在后面加u或U

    • 255U
  • 用l或L表示long(long)
  • *unsigned的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位

整数越界

  • 整数是以纯二进制方式进行计算的,所以:

    • 11111111+1->100000000 ->0
    • 01111111+1->10000000 ->-128
    • 10000000-1->01111111 ->127

6.1.5 整数的格式化:如何格式化输入输出整数,如何处理8进制和16进制

整数的输入输出

  • 只有两种形式:int或long long

    • %d:int
    • %u:unsigned
    • %ld:long long
    • %lu:unsigned long long

8进制和16进制

  • 一个以0开始的数字字面量是8进制
  • 一个以0x开始的数字字面量是16进制
  • %o用于8进制,%x用于16进制
  • 8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关

*8进制和16进制

  • 16进制很适合表达二进制数据,因为4位二进制正好是一个16进制位
  • 8进制的一位数字正好表达3位二进制
    • 因为早期计算机的字长是12的倍数,而非8

6.1.6 选择整数的类型:没有什么特殊需要,只用int就好了

选择整数类型

  • 为什么整数要有那么多种?

    • 为了准确表达内存,做底层程序的需要
  • 没有特殊需要,就选择int
    • 现在的CPU的字长普遍是32位或64位,一次内存读写就是一个int,一次计算也是一个int,选择更短的类型不会更快,甚至可能更慢
    • *现代的编译器一般会设计内存对齐,所以更短的类型实际在内存中有可能也占据一个int的大小(虽然sizeof告诉你更小)
  • unsigned与否只是输出的不同,内部计算是一样的

6.1.7 浮点类型:double和float,它们是什么,如何输入输出

浮点类型

类型 字长 范围 有效数字
float 32 ±(1.20*10-38~3.40*1038),0,±inf,nan 7
double 64 ±(2.2*10-308~1.79*10308),0,±inf,nan 15

浮点的输入输出

类型 scanf printf
float %f %f,%e
double %lf %f,%e

(%e输出科学记数法)

科学记数法

输出精度

  • 在%和f之间加上.n可以指定输出小数点后几位,这样的输出是做四舍五入的

    • printf("%.3f\n",-0.0049);
    • printf("%.30f\n",-0.0049);
    • printf("%.3f\n",-0.00049);

6.1.8 浮点的精度与范围:浮点数到底能表示哪些数

超过范围的浮点数

  • printf输出inf表示超过范围的浮点数:±∞
  • printf输出nan表示不存在的浮点数

浮点运算的精度

float a,b,c;a=1.345f;b=1.123f;c=a+b;if(c==2.468)printf("相等\n");elseprintf("不相等!\nc=%.10f,或%f\n",c,c);return 0;

  • 带小数点的字面量是double而非float
  • float需要用f或F后缀来表名身份
  • f1==f2可能失败的
  • fabs(f1-f2)<1e-12就算相等

*浮点数的内部表达

  • 浮点数在计算时是由专用的硬件部件实现的
  • 计算double和float所用的部件是一样的

选择浮点类型

  • 如果没有特殊需要,只使用double
  • 现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不必float慢

6.1.9 字符类型:char是整数也是字符

字符类型

  • char(character)是一种整数,也是一种特殊的类型:字符。这是因为:

    • 用单引号表示的字符字面量:‘a’,‘1’
    • ’ '也是一个字符
    • printf和scanf里用%c来输入输出字符

字符的输入输出

  • 如何输入’1’这个字符给char c?

    • scanf("%c",&c);->1
    • scanf("%d",&d);->49
  • ‘1’的ASCII编码是49,所以当c==49时,它代表’1’
char c;char d;c=1;d='1';if(c==d){printf("相等\n");} else{printf("不相等\n");}printf("c=%d\n",c);printf("d=%d\n",d);return 0;

字符计算

char c='A';
c++;
printf("%c\n",c);
int i='Z'-'A';
printf("%d\n",i);
  • 一个字符加一个数字得到ASCII码表中那个数之后的字符
  • 两个字符的减,得到它们在表中的距离

大小写转换

  • 字母在ASCII表中是顺序排列的
  • 大写字母和小写字母是分开排列的,并不在一起
  • ‘a’-'A’可以得到两段之间的距离,于是
    • a+‘a’-'A’可以把一个大写字母变成小写字母,而
    • a+‘A’-'a’可以把一个小写字母变成大写字母

6.1.10 逃逸字符:反斜杠开头的字符是特殊的控制字符

逃逸字符

  • 用来表达无法印出来的控制字符或特殊字符,它由一个反斜杠"\"开头,后面跟上另一个字符,这两个字符合起来,组成了一个字符

printf("请分别输入身高的英尺和英寸,""如输入\"5 7\"表示5英尺7英寸:");

字符 意义 字符 意义
\b 回退一格 \" 双引号
\t 到下一个表格位 \' 单引号
\n 换行 \\ 反斜杠本身
\r 回车

制表位

  • 每行的固定位置
  • 一个\t使得输出从下一个制表位开始
  • 用\t才能使上下两行对齐

回车换行

  • 源自打字机的动作

6.1.11 类型转换:如何在不同类型之间做转换

自动类型转换

  • 当运算符的两边出现不一致的类型时,会自动转换成较大的类型

    • 大的意思是表达的数范围更大
    • char->short->int->long->long long
    • int->float->double
  • 对于printf,任何小于int的类型会被转换成int;float会被转换成double
  • 但是scanf不会,要输入short,需要%hd

强制类型转换

  • 要把一个量强制转换成另一个类型(通常是较小的类型),需要:

    • (类型)值
  • 比如:
    • (int)10.2
    • (short)32
  • 注意这时候的安全性,小的变量不总能表达大的量
    • (short)32768
  • 只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变
double a=1.0;
double b=2.0;
int i=(int)a/b;
//a在运算中被强制转换成int类型,但是b是double,所以最终结果还是double类型
  • 强制类型转换的优先级高于四则运算

    • 上面的如果想要得到int类型结果,需要int i=(int)(a/b);

6.2.1 逻辑类型:表示关系运算和逻辑运算结果的量

bool

  • #include<stdbool.h>
  • 之后就可以使用bool和true、false

(C99才出现)

6.2.2 逻辑运算:对逻辑量进行与、或、非运算

逻辑运算

  • 逻辑运算是对逻辑量进行的运算,结果只有0或1
  • 逻辑量是关系运算或逻辑运算的结果
运算符 描述 示例 结果
逻辑非 !a 如果a是true结果就是false,如果a是false结果就是true
&& 逻辑与 a&&b 如果a和b都是true,结果就是true;否则就是false
|| 逻辑或 a||b 如果a和b有一个是true,结果为true;两个都是false,结果为false

try

  • 如果要表达数学中的取件,如:x∈(4,6)或x∈[4,6],应该如何写C的表达式?

(像4<x<6这样的式子,不是C能正确计算的式子,因为4<x的结果是一个逻辑值(0或1))

  • x>4&&x<6
  • 如何判断一个字符c是否是大写字母?
    • c>=‘A’&&c<=‘z’

理解一下

  • age>20&&age<30
  • index<0||index>99
  • !age<20

优先级

  • !> && > ||

    • !done&&(count>MAX)
优先级 运算符 结合性
1 () 从左到右
2 !、+、-、++、– 从右到左(单目的+和-)
3 *、/、% 从左到右
4 +、- 从左到右
5 <、<=、>、>= 从左到右
6 ==、!= 从左到右
7 && 从左到右
8 || 从左到右
9 =、+=、-=、*=、/=、%= 从右到左

短路

  • 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算

    • a==6&&b==1
    • a==6&&b+=1
  • 对于&&,左边是false时就不用做右边了
  • 对于||,左边是true就不用做右边了

(不要把赋值,包括符合赋值组合进表达式)

6.2.3 条件运算与逗号运算

条件运算符

  • count=(count>20)?count-10:count+10;
  • 条件、条件满足时的值和条件不满足时的值
if(count>20)count=count-10;
elsecount=count+10;

优先级

  • 条件运算符的优先级高于赋值运算符,但是低于其他运算符

    • m < n ? x : a + 5
    • a++ >= 1 && b – > 2 ? a : b
    • x = 3 * a > 5 ? 5 : 20

嵌套条件表达式

  • count=(count>20)?(count<50)?count-10: count-5:(count<10)?count+10: count+5;
  • 条件运算符是自右向左结合的
    • w<x?x+w: x<y?x: y

(我们不希望你使用嵌套条件表达式)

逗号运算:逗号运算符

  • 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的优先级是所有运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果。

在for中使用 ,

  • for(i=0,j=10;i<j;i++,j–)…

C语言学习-翁凯(第六章笔记)相关推荐

  1. C语言学习-翁凯(第九章笔记)

    C语言学习-翁凯(第九章笔记) 第九章 9.1.1 取地址运算:&运算符取得变量的地址 运算符& scanf("%d",&i);里面的& 获得变量的 ...

  2. C语言学习-翁凯(第七章笔记)

    C语言学习-翁凯(第七章笔记) 第七章 7.1.1初见函数 素数求和 int m,n;int i;int cnt=0;int sum=0;scanf("%d %d",&m, ...

  3. 数据结构C语言版第二版第六章原创总结

    数据结构C语言版第二版第六章原创总结 图章节原创总结

  4. 谭浩强C语言程序设计代码示例第6章(笔记)

    谭浩强C语音程序设计代码示例第六章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  5. 深入理解JVM第六章笔记

    深入理解JVM第六章笔记 无关性 字节码,各种不同的平台的虚拟机与所有平台都统一使用的程序存储格式,它也是构成Java语言平台无关性的基石. Java虚拟机不和包括Java在内的任何语言绑定,它只与& ...

  6. 算法图解第六章笔记与习题(广度优先搜索)

    算法图解第六章笔记与习题(广度优先搜索) 文章目录 算法图解第六章笔记与习题(广度优先搜索) 6.1 图(graph) 6.2 广度优先搜索 6.3.1 查找最短路径 6.3.2 队列 6.4 实现图 ...

  7. 谭浩强C语言程序设计代码示例第5章(笔记)

    谭浩强C语音程序设计代码示例第四章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  8. 智慧树\知到——程序设计基础(C语言)入门篇第六章到第十章测试答案

    目录 第六章测试 第七章测试 第八章测试 第九章测试 第十章测试 第六章测试 第1部分 总题数: 10 1 [判断题] (10分) 有下列程序段,程序段运行后的输出结果##2##3##4##5(    ...

  9. 软件项目管理第六章笔记---项目质量管理

    以下图片及内容整理自西安交通大学软件学院宋永红老师的ppt(课堂回放)中,仅供学习使用,请勿转载或他用 笔记汇总:软件项目管理笔记汇总_Qlz的博客-CSDN博客 第六章 项目质量管理 质量的重要性 ...

最新文章

  1. 读后感和机翻《他们在看哪里,为什么看?在复杂的任务中共同推断人类的注意力和意图》
  2. ssh免密连接远程服务器
  3. 1.2 什么是神经网络-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  4. 任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过...
  5. Elasticsearch 常用运维命令(持续更新)
  6. python装饰器解析_Python 装饰器解析
  7. 关于对象不能直接访问私有成员的误区(转)
  8. html柳树动画,3D教程-柳树生长动画
  9. java web远程调试工具_java远程调试 - Dendy的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. 19) maven 项目结构:聚集
  11. 分析varnish日志
  12. vba 输出文本 m linux,VBA使用FileSystemObject将读取或写入文本文件(一)
  13. 微信支付证书如何部署在linux,微信支付平台证书更新指引
  14. 欧文工学院计算机,UCI的EECS「加州大学欧文分校电气工程与计算机科学系」
  15. WPAN、WLAN、WMAN、WWAN无线通讯技术区别
  16. 【indexedDB】indexedDB知识梳理
  17. 计算机一级b选择题相关知识点,一级B辅导资料(选择题知识点)
  18. 快乐打小鸟游戏的开发
  19. 设计一个简单的购物页面(html+css+php)
  20. 计算机管理msc,win7系统打开计算机管理(compmgmt.msc)的操作方法

热门文章

  1. esp32与esp8266通过nrf24l01通信
  2. 软件测试和软件开发,哪个发展前景好?
  3. Batch Normalization原理
  4. Eigen 部分功能介绍
  5. 16进制与2进制的快速转换
  6. 带你认识神奇的Gumbel trick
  7. Android实现图片和二维码拼在一起
  8. FIFO、单口RAM、双口RAM的区别
  9. java 微信公众账号开发平台 JeeWx 1.0 发布
  10. edusoho 插件目录