本专栏主要基于北大郭炜老师的程序设计与算法系列课程进行整理,包括课程笔记和OJ作业。该系列课程有三部分: (一) C语言程序设计;(二) 算法基础;(三) C++面向对象程序设计

(一) C语言程序设计 课程链接

1. 输入输出进阶

输入输出控制符

在printf和scanf中可以使用以"%"开头的控制符,指明要输入或输出的数据的类型以及格式。

int n = 3;
printf("I want to buy %d books for %f dollars",3,4.5); //也可以用%lf
double f;
scanf("%d%f",&n,&f); //也可以用%lf

用scanf读入不同类型的变量

用scanf可以一次读入多个类型不同的变量,只要输入的各项之间用空格分隔即可。

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{int n; char c; float f;
scanf("%d%c%f",&n,&c,&f); //依次输入一个整数,一个字符, 再一个小数,则它们会被分别放入n,c,m; &n代表“取n的地址” ; %c表示等待输入一个字符;%f表示等待输入一个float小数
printf("%d %c %f",n,c,f); //%f用于输出double或float类型的值,默认保留小数点后面6位
return 0;
}

输入字符类型数据时(%c),不会跳过空格(空格也会被当作字符读入),输入其他类型的数据时,会跳过空格。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{int n; char c; float f;scanf("%d%c%f",&n,&c,&f);printf("%d %c %f",n,c,f);return 0;
}


%c不会跳过空格,此时他会读入一个空格到c中,再读入f时,对应输入是’k’,导致出错。

用scanf跳过输入中的字符

如果在输入中有scanf中出现的非控制字符(可以自行设置格式字符串),则这些字符会被跳过。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{int n,m; char c; float f; scanf("%d %c,%f:%d",&n,&c,&f,&m); //输入中对应位置的 空格 , :会被跳过printf("%d,%c,%f,%d",n,c,f,m); return 0;
}

控制printf 输出整数的宽度

int n = 123;
printf("%05d,%5d,%5d,%05d",n,n,123456,123456);

控制printf 输出浮点数的精度

float a = 123.45;
double b = 22.37362723;
printf("%.5f %.2f %.12f",12.3,a,b);

尽量使用double

  • double 精度高于float,所以一般尽量使用double!
  • double类型的变量用 %lf 输入! float和double输出都可以用%f

格式控制符%x和%u

  • %x: 以十六进制形式读入或输出整数
  • %u: 以无符号整数形式输出整数
printf("%x,%d,%u",0xffffffff, 0xffffffff,0xffffffff);

int n;
scanf("%x",&n); //读入一个十六进制数
printf("%d",n); //输出对应的十进制数

用C++的cout进行输出

#include <iostream>
using namespace std;
int main()
{int n=5;
double f = 3.9;
char c = 'a';
cout << "n=" << n << ",f=" << f << endl; //endl换行
cout << 123 << ", c=" << c;
return 0;
}

用C++的cin进行输入

#include <iostream>
using namespace std;
int main()
{int n1,n2;double f;char c;cin >> n1 >> n2 >> c >> f;cout << n1 << "," << n2 << "," << c << "," << f; return 0;
}


cin会跳过空格,对于所有的类型包括字符类型,此时在输入的10,k之间加一个空格的话,该空格会被跳过,字符类型变量c读入的仍是k。

用cin读入所有输入的字符,包括空格,回车

#include <iostream>
using namespace std;
int main()
{int c;while((c = cin.get()) != EOF) {cout << (char)c ;}return 0;
}

cin.get()会读入所有输入字符,不会跳过空格和回车等。他的返回值是int,即读入字符的ASCII码,由于字符是一个字节,而int是4个字节,因此返回的int类型值始终>=0(最高位/符号位是0)。当读取完毕(没有数据可读时),返回EOF(-1),注意EOF不是输入数据结束的标志,输入数据结尾没有这个符号。 由于返回的是ASCII码,输出时需要用(char)c转换为字符。

用scanf读入所有输入的字符,包括空格,回车

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{char c;while(scanf("%c",&c) != EOF) { printf("%c",c);}return 0;
}

由于scanf中的字符类型%c,在输入时,不会跳过空格,因此可以读入所有输入的字符,包括空格,回车。没有数据可读时,返回EOF。

用cin,cout和scanf,printf

  • cin,cout 速度比scanf,printf慢,输入输出数据量大时用后者;小的时候用前者,比较方便
  • 一个程序里面不要同时用cin和scanf,不要同时用cout和printf

2. 算数运算符和算数表达式

赋值运算符

赋值运算符用于给变量赋值,常用有以下六种:=、+=、 -=、 *=、 /=、 %=

int a;
a = 1;  // a的值变为1
a = a + 1; // a的值变为2
a = 4 + a;  // a的值变为6
a += b ;//等效于 a = a + b,但是执行速度更快

-=, *= ,/= ,%= 用法与+=类似; 表达式 x = y 的值,就是y的值

算术运算符

七种算术运算符用于数值运算 运算符+操作数构成表达式:
加+、减-、 乘* 、除/ 、求余数 % 、自增 ++ 、自减 –

  • 加、减、乘运算符
    a+b、a-b、a*b这三个表达式的值,就是操作数a和b做算术运算的结果 。表达式的值的类型,以操作数中精度高的类型为准。
    精度:

  • 加、减、乘运算的溢出
    1)两个整数类型进行加、减、乘都可能导致计算结果超出了结果类型所能表示的范围,这种情况就叫做溢出
    2)计算结果的溢出部分直接被丢弃。
    3)实数(浮点数)运算也可能溢出,结果不易预测。

#include <iostream>
using namespace std;
int main()
{unsigned int n1 = 0xffffffff; cout << n1 << endl; //输出4294967295,无符号int最大表示结果unsigned int n2 = n1 + 3; //导致溢出 cout << n2 << endl; //输出2  0xffffffff + 3 的结果,应该是 0x100000002,9个十六进制位,超出的一位十六进制位直接丢弃,结果就是0x00000002=2return 0;
}

4)有时计算的最终结果似乎不会溢出,但中间结果可能溢出,这也会导致程序出错,例如:(a+b)/2 未必等于 a/2+b/2:

printf("%d",(2147483646 + 6)/2); //2147483646是int最大能表示的数字 先加6中间结果会溢出 导致最终结果出错 -1073741822
printf("%d",2147483646/2 + 6/2); // 如果先除以2,中间结果不会溢出,最终结果是正确的  1073741826

5)解决溢出的办法是尽量使用更高精度的数据类型(两个int进行运算会溢出, 用两个 long long 进行运算可能就不会溢出)。如果是几百位的数,就涉及到高精度计算,此时需要用到数组。

除法运算

  • 除法的计算结果类型和操作数中精度高的类型相同
  • 两个整数做除法,结果是商。余数直接忽略
int main()
{int a = 10;int b = 3;double d = a/b; // a/b 的值也是整型,其值是3 cout << d << endl; //输出 3d = 5/2; //d的值变为2.0cout << d << endl; //输出 2d = 5/2.0; //结果是操作数中精度较高的那一个 即doublecout << d << endl; //输出 2.5d = (double)a/b;  //为得到更精确的值 可以把操作数强制转换为doublecout << d << endl; //输出 3.33333return 0;
}

模运算

求余数的运算符“%”也称为模运算符。它是双目运算符,两个操作数都是整数类型的。a % b 的值就是a除以b的余数。

除法运算和模运算的除数都不能为0,否则程序会崩溃!!!

自增/自减运算符

  • 单目运算符,操作数为整数类型变量或实数型变量
  • 有前置和后置两种用法
  • 前置用法:++a; 将a的值加1,表达式返回值为a加1后的值
  • 后置用法:a++; 将a的值加1,表达式返回值为a加1前的值
#include <iostream>
using namespace std;
int main()
{int n1, n2=5;n2 ++; // n2变成6++n2; //n2变成7n1 = n2 ++; // n2变成8,n1变成7cout << n1 << "," << n2 << endl; //输出 7,8 n1 = ++ n2; //n1和n2都变成9cout << n1 << "," << n1 << endl; //输出 9,9return 0;
}
  • 自减运算符“–”,用于将整型或实数型变量的值减1。它的用法和“++”相同

取相反数运算符 -

单目运算符 “-”,用于取整型或实数型变量的值的相反数:

int a = 4;
int b = -a;
int c = -5*3;

3. 关系运算符和逻辑表达式

关系运算符

  • 六种关系运算符用于数值的比较
    相等 ==、不等 !=、大于 >、小于 <、 大于等于 >= 、小于等于 <=
  • 比较的结果是bool类型,成立则为true,反之为false
  • bool类型变量只有两种取值,true或false
  • false等价于0, true等价于非0整型值(一般是1)
int n = true,m = false;
printf("%d,%d",n,m);  // 1,0
int main()
{int n1 = 4, n2 = 5,n3;
n3 = ( n1 > n2 ); // n3 的值变为 0   ()可以使表达式关系更清晰 可以不加;
cout<<n3<<",";  //输出0,
n3 = ( n1 < n2);  // n3 的值变为非0值
cout << n3 << ","; // 输出 1,
n3 = (n1 == 4);  // n3 的值变为非 0 值
cout << n3 << ","; // 输出 1,
n3 = (n1 != 4); // n3 的值变为0
cout << n3 << ","; // 输出 0,
n3 = (n1 == 5);// n3 的值变为0
cout << n3 ; // 输出 0,
return 0;
}

逻辑运算符和逻辑表达式

逻辑运算符用于表达式的逻辑操作,有 &&, || , ! 三种, 操作的结果是true或false。
表达式由操作数和运算符(关系运算符、算术运算符等)组成

  • 与 &&
    exp1 && exp2 当且仅当exp1和exp2的值都为真(或非0)时,结果为true
int n = 4;
n > 4 && n < 5    //false
n >= 2 && n < 5   //true
5 && 0 //false  C++中非0整数为真,0为假
4 && 1  //true
  • 或 ||
    exp1 || exp2 当且仅当exp1和exp2的值都为假(或0)时,结果为false
int n = 4;
n > 4 || n < 5  // true
n <= 2 || n > 5  //false
  • 非 !
    ! exp exp值为真(或非0),结果为false,exp值为false(0),结果为true
!(4 < 5 )  // false
!5   //false
!0   // true

短路计算

逻辑表达式是短路计算的,即对逻辑表达式的计算,在整个表达式的值已经能够断定的时候即会停止。

  • exp1 && exp2 : 如果已经算出表达式exp1为假,那么整个表达式的值肯定为 假,于是表达式exp2就不需要再计算
  • exp1 || exp2 :如果已经算出exp1为真,那么整个表达式必定为真,于是exp2 也不必计算
#include <iostream>
using namespace std;
int main()
{int a = 0,b = 1;bool n= (a++)&&(b++); //b++不被计算 cout << a << "," << b << endl; //输出 1,1n= a++&&b++;  //a++和b++都要计算 cout << a << "," << b << endl; //输出 2,2n = a ++ || b ++ ;  //b++不被计算cout << a << "," << b << endl; //输出 3,2 return 0;
}

4. 其他运算符及运算优先级

强制类型转换运算符

  • 类型名本身就是一个运算符,叫“强制类型转换运算符” 用于将操作数转换为指定类型
double f = 9.14;
int n = (int) f; //n=9
f = n / 2; //f=4.0
f = double(n) / 2; //f=4.5

部分运算符的优先级

  • 可以用()改变运算顺序/优先级,如 a*(b+c)。勤用括号以避免优先级错误, 得到自己想要的运算顺序
printf("%d,%d",a+++b,a); //a+++b 等价于(a++)+b

程序设计与算法 | (3) 输入输出与运算符、表达式相关推荐

  1. C语言程序设计基本运算符,C语言程序设计2第4章基本运算符和表达式.ppt

    第4章 基本运算符和表达式 4.1 运算符的种类 4.2 算术运算符 4.3 自增自减运算符 4.4 表达式 4.5 逻辑运算 4.6 条件运算符和条件表达式 退出 4.1 运算符的种类 1. 算术运 ...

  2. 第一章 程序设计入门--算法竞赛入门经典

    第一章 程序设计入门–算法竞赛入门经典 知识点一: int m=25; printf("%d\n",m); printf("%03d\n",m); 输出如下: ...

  3. 程序设计与算法郭炜老师的课堂笔记3

    程序设计与算法郭炜老师的课堂笔记3 从C到C++ 引用 引用作为函数参数 引用作为函数返回值 常引用 const关键字 定义常量 定义常量指针 定义常引用 动态内存分配 用new开内存 用delete ...

  4. 《Python程序设计与算法基础教程(第二版)》江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究

    (还在更新中-) 这篇博客花费了我的大量时间和精力,从创作到维护:若认可本篇博客,希望给一个点赞.收藏 并且,遇到了什么问题,请在评论区留言,我会及时回复的 这本书对Python的知识点的描述很详细, ...

  5. 《Python程序设计与算法基础教程(第二版)》江红 余青松,第九章课后习题答案

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 例9.1~例9.53 填空题:2 思考题:3~11 上机 ...

  6. 程序设计与算法郭炜老师的课堂笔记2

    程序设计与算法郭炜老师的课堂笔记2 枚举 完美立方 生理周期 称硬币 熄灯问题 递归 求阶乘 汉诺塔 N皇后 逆波兰表达式 表达式求值 上台阶 放苹果 算24 二分算法 找一对数 分治 归并排序 快速 ...

  7. 程序设计与算法郭炜老师的课堂笔记1

    程序设计与算法郭炜老师的课堂笔记1 基础 与或非 位运算 字符串操作库函数 strtok尝试 字符串0新认识 void 指针无定义 快排 变量 排序 Vector vector示例 用**vector ...

  8. 算法与程序设计:算法的表述方式及其发展(学习笔记)

    算法与程序设计:算法的表述方式及其发展(学习笔记) 算法与程序设计 算法概念分析 算法的表述方法 自然语言 流程图 N-S图 PAD图 伪代码 算法描述的发展现状 通俗来讲,算法是定义如何完成一个任务 ...

  9. python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 一些知识点总结和几个例题 选择题:1~5 填空题:1~8 ...

最新文章

  1. 使用opennlp进行文档分类
  2. php 实现一致性hash 算法 memcache
  3. C语言程序设计之回调函数实现方法
  4. Matlab:成功解决The option is not valid. The options must be'double','native','default','omitnan', or'inc
  5. 运输pascal 90分程序
  6. 最新卡通渲染效果图(附带一张次世代帅哥)
  7. php如何加网址链接,怎么给一个PHP密码访问页面加超链接
  8. 杭州师范大学计算机与科学,杭州师范大学信息科学与工程学院
  9. android 蓝牙 多线程,Android蓝牙示例
  10. Windows2003系统无法运行CS游戏的解决方案
  11. java extjs combobox_extjs的combobox的用法
  12. Spring4+Springmvc+quartz实现多线程动态定时调度
  13. 拓端tecdat|R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
  14. Windows常用软件推荐
  15. 知识总结2:Django常见面试题总结(持续更新)
  16. oracle学习札记95
  17. 子域名劫持漏洞详解、挖掘和防护
  18. HNU 11722 The Gougu Theorem
  19. sql做题记录(一)
  20. Android 获取/设置:窝蜂移动数据网络状态

热门文章

  1. nginx 官方文档翻译
  2. 哲学家与心理学家在选择性知觉上的不谋而合
  3. CSS3: The missing manual 《css3秘笈》笔记+布局、设计优秀资源整理
  4. 首场百度大脑开放日来袭 | 全新开放24项AI技术
  5. 记一次 .NET 某智能交通后台服务 CPU爆高分析
  6. A - Oulipo(KMP算法经典)
  7. ARM Linux设备树
  8. 081200计算机科学与技术专业,研究生计算机科学与技术专业排名
  9. 一文带你学会python新年倒计时
  10. 从语义分析到操作系统,图灵机器人明年就能走进你家?