版权所有北京大学coursera:https://www.coursera.org/learn/jisuanji-biancheng
【问题引入】写程序就是告诉计算机要做什么,但我们怎么告诉它,它才能听懂呢?
那要告诉那些内容?以什么形式?
什么是程序
示例:找出最大值
固定代码
#include <iostream>
using namespace std;
int main()
{
return 0;
}
例子
#include <iostream>
using namespace std;
int main()
{
int number[5] = {21,12,3,4,99};
#int number[5] 在计算机里头,开辟一片存储空间,来存放这些数字;定义元素个数为5个的整型数
int max = 0;
int i = 0;
for(i = 0; i < 5; i++)
{
if(number[i] > max)
max = number[i];
}
cout<<'The Maximal Number is:'<<max;
# cout表示一个输出的命令 << 可以当作是分隔符 然后输出max的值;英文状态下的引号
return 0;
}
引入问题
1. 是不是无论我们在程序里边写什么样的“词”, 或者是写什么样的 “单词”,计算机都能明白呢?
编程语言定义了一些有特定含义的 “关键字”。 计算机最初的时候只能明白这些“关键字”。
2. 是不是无论我们在程序里边写什么“数” 和 “计算符号”,计算机都能明白呢?
计算机只能“看懂”某些类型的数据,这些数据的 “类型” 和相应的 “操作符号”也是被事先定义好的。
3. 程序设计语言中的“句式”?
顺序结构的例子
- 输出变量值且换行
#include <iostream>
using namespace std;
int main()
{
int a = 0;
cout << a << endl;
# endl 换行
return 0;
}
- 输出&输出变量
#include <iostream>
using namespace std;
int main()
{
int a = 0;
cout << '请输入一个数' << endl;
cin >> a;
# 输入一个数且赋给a
cout << '我刚刚输入的a:' << a << endl;
return 0;
}
- 一次输入多个数
#include <iostream>
using namespace std;
int main()
{
int a = 0, b = 0, result = 0;
# 用,分开
cout << '请输入两个数';
cin >> a >> b;
result = 2*a+b-1;
cout << '结果:' << result << endl;
return 0;
}
这里记录一下很神奇的事情,我最开始使用的是上面的代码
返回错误:Character too large for enclosing character literal type
然后我把单引号换成双引号,成功了… 这和R不一样
所以 之前的代码相应的部分也是有错误的,为什么不返回去改呢,想下次自己看笔记的时候不用看到这里也能发现代码有问题,奥利给!
然后又尝试了下,没准是中文占的字符太大,试试多个英文?
所以,仅从我尝试的结果来看用单引号引起来的是一个英文字母,中文不管多短都不行,双引号无所谓
找了个文章说明这个问题 [C++]单双引号的区别
分支结构的例子
一次机会猜隐藏字母
#include <iostream>
using namespace std;
int main()
{
char a = 'A';
# char字符型,用来存储一个字符,字符变量赋值用单引号
cout << "Game start :> " << endl;
cin >> a;
if(a != 'G' )
cout << "Try again" << endl;
else if(a == 'G' )
cout << "Yes!" << endl;
return 0;
}
当我运行的时候,又出现问题了哈哈哈哈哈哈,果然不能光听课,还是要自己尝试运行。有问题的地方照样没有修改,就是为了提醒自己不要再犯错⏰
所以,注释在C语言里是//开头的,而不是#
还有一点要注意每条命令后面要有逗号!!
多次猜隐藏字母
#include <iostream>
using namespace std;
int main()
{
char a = ' '; //用来存放用户输入的字母
cout << "Game start. U have 3 chances. Good Luck!:> " << endl;
int i = 0; // 用于记录猜了多少次
for(i = 0; i < 3; i++)
{
cin >> a;
if(a == 'G' )
{
cout << "Yes!" << endl;
break; //终止循环
}
else
cout << "Try again" << endl;
}
return 0;
}
循环结构的例子
从小到大输出20以内的奇数
#include <iostream>
using namespace std;
int main()
{
int i = 0;
# 习惯使用i,j,k 表示临时计数的变量
cout << "20以内的奇数" << endl;
for(i = 0; i < 20; i++)
{
if(i % 2 != 0)
cout << i << endl;
}
return 0;
}
从大到小输出20以内的奇数
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << "20以内的奇数" << endl;
for(i = 20; i >= 0; i--)
{
if(i % 2 != 0)
cout << i << endl;
}
return 0;
}
数组的例子
#include <iostream>
using namespace std;
int main()
{
int i = 0;
char a[5] = {'a','b','c','d','e'};
# 从a[0]开始
cout << "字母表中序号为奇数的字母" << endl;
for(i = 0; i < 5; i=i+2)
{
cout << a[i] << endl;
}
return 0;
}
作业
1. 实现冒泡排序
-
描述
请根据自己的理解编写冒泡排序算法,数组大小1000以内 -
输入
第一行是n,表示数组的大小
接着n行是数组的n个元素 -
输出
排序之后的结果
一个元素一行
#include <iostream>
using namespace std;
int main() {
int n, a[1000]; // 一共n个数,n不超过1000。a用来保存这些数
cin >> n;
// 输入n个数
for (int i = 0; i < n; i++)
cin >> a[i];
// 冒泡,不断比较相邻的两个数,如果顺序错了,那么就交换
for (int i = 0; i < n - 1; i++) {
for (int j = 1; j < n - i; j++) {
if (a[j - 1] > a[j]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
// 依次输出
for (int i = 0; i < n; i++)
cout << a[i] << endl;
return 0;
}
2. 奇偶排序
-
描述
输入十个整数,将十个整数按升序排列输出,并且奇数在前,偶数在后。 -
输入
输入十个整数 -
输出
按照奇偶排序好的十个整数
#include <iostream>
using namespace std;
int main() {
int a[10];
for (int i = 0; i < 10; i++) {
cin >> a[i];
}
// 首先,我们把奇数放到数组左边,偶数放到数组右边
int l = 0, r = 9; //用左手和右手分别指向数组两端
while (l <= r) {
bool leftIsOdd = a[l] % 2 == 1;
bool rightIsEven = a[r] % 2 == 0;
if (leftIsOdd) {
l++;
} else if (rightIsEven) {
r--;
} else if (!leftIsOdd && !rightIsEven) {
int temp = a[l];
a[l] = a[r];
a[r] = temp;
}
}
// 对l左边(奇数部分)冒泡,不断比较相邻的两个数,如果顺序错了,那么就交换
int start = 0, end = l;
for (int i = start; i < end - 1; i++) {
for (int j = start + 1; j < start + end - i; j++) {
if (a[j - 1] > a[j]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
// 对l右边(偶数部分)冒泡,不断比较相邻的两个数,如果顺序错了,那么就交换
start = l, end = 10;
for (int i = start; i < end - 1; i++) {
for (int j = start + 1; j < start + end - i; j++) {
if (a[j - 1] > a[j]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
cout << a[i] << ' ';
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
int a[10];
for (int i = 0; i < 10; i++) {
cin >> a[i];
}
// 冒泡,不断比较相邻的两个数,如果顺序错了,那么就交换
for (int i = 0; i < 9; i++) {
for (int j = 1; j < 10 - i; j++) {
// 与刚才的冒泡排序不同,我们不只是通过较数字的大小决定顺序
// 如果左边的为偶数,右边的为奇数,那么顺序也需要颠倒
bool leftIsEven = a[j - 1] % 2 == 0;
bool rightIsEven = a[j] % 2 == 0;
if ((leftIsEven && !rightIsEven) ||
(leftIsEven == rightIsEven && a[j - 1] > a[j])) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
cout << a[i] << ' ';
}
return 0;
}
我自己电脑上的Xcode
但是运行第二题的时候一直报错 emm
等之后闲的时候再来填这个洞🕳️