C/C++ 快速基础上手教程:一段从 Hello World 开始的旅途
本系列旨在帮助零基础的同学快速上手 C/C++ 语法基础,全程大白话讲解,代码可直接复制进 IDE 运行。本篇整合了三站内容:基础运算与选择结构、循环结构、数组。每一站都配有洛谷练习题,学完即练,包教包会(不包会就多练两遍)。
旅途的开始:基础运算,选择结构
1. 基础运算
这个板块其实没啥可以多讲的,基本是记忆后用一用就会的事。
+ - * / % //加 减 乘 除 模运算(取余数)
a = b = 1; //将1的值赋值给b,再将b的值赋值给a(赋值语句从右往左执行)
a++; a+=1; ++a; //三个式子的结果最后都是a的值被更新为了(a+1),但a++和++a都只能加1,a+= 增加的值可以改变
特殊的性质:当 a++ 和 ++a 被用做赋值时,被赋值的对象会被分别赋于迭代前原本的 a 的值( a++ )和迭代后的 (a+1) 的值( ++a )。 示例代码如下:(可以粘到自己的 IDE 里面尝试运行一下)
#include <iostream>
using namespace std;
int main() {
int a = 5;
int b = a++;
cout << "b1=" << b << endl;
a = 5, b = ++a;
cout << "b2=" << b << endl;
return 0;
}
位运算现阶段使用不多,我在这也不打算讲,想了解的可以去搜「CSDN 位运算」,对应练习题 P4702。
稍微扩展一点常用的数学运算:
#include <cmath> //调用数学运算关键字的头文件
abs(x) //求x的绝对值
ceil(x) //向上取整
floor(x) //向下取整
sqrt(x) //根号x
pow(x, y); //x的y次方
对其他运算函数感兴趣的可以自行查阅 cmath 头文件的完整函数表。
2. 选择结构
基本格式:
if(条件){
如果条件满足则依次执行当前语句;
条件满足则依次执行当前语句;
满足则依次执行当前语句;
}else if(第二条件){
如果第一条件不满足,第二条件满足则依次执行当前语句;
第一条件不满足,第二条件满足则依次执行当前语句;
不满足,第二条件满足则依次执行当前语句;
}else {
如果条件不满足则依次执行当前语句;
条件不满足则依次执行当前语句;
不满足则依次执行当前语句;
}
基本判断:(同样在这里暂时不会提及位运算相关判断)
== != < <= > >= //等于 不等于 小于 小于等于 大于 大于等于
&& || //且 或
例题(作业中同步更新):
P5711 闰年判断
旅途的第一级台阶:循环结构
1. for 循环
//常见模板
for(int i = 1; i <= n; i++) {//创建变量i=1作为指针,i从1到n以1为间隔进行遍历,通俗讲就是i会从1变化到n然后停止,每次变化为+1
//每次i发生变化时执行括号中语句,可为多句。称为循环体
}
//此时举一反三可知:i可以从任意值开始到任意值进行遍历,每次变化也可以自定义,例如:
for(int i = a; i <= b; i+=c)//a,b,c均为可替换值
//同样的变化也不一定是增加,甚至可以乘除
for(int i = n; i >= 1; i--)
根本逻辑:
for:作为关键字表示将开始 for 循环。 (int i = 1; i <= n; i++) { } :for 循环进行的条件,当条件满足时,将执行循环体(大括号中的语句)。内部逻辑为:最开始为创建变量 i 为指针并赋于初始值;中间为条件语句,每次循环进行判断,如果满足条件,则执行后续语句;最后为指针变化语句,改变指针使循环变为有限次并且按需求完成指定的变化。
注意:指针的创建是一次性的,而后续的判断和变化是随每次循环执行的。执行顺序为循环判断 → 循环体(大括号中内容)→ 循环变量自增 → 下一次循环判断。
例如:输入 n 个正整数,输出最大值
输入格式:第一行:一个数 n;第二行:n 个数。
输出格式:一行:最大值。
数值范围:n <= 10000,每次输入值小于 2 的 31 次方(<= 2147483647)。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, x, max_ = -1;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x;
max_ = max(x, max_);
}
cout << max_ << endl;
return 0;
}
测试数据:
输入:
20
18 36 16 30 40 14 28 12 24 32 10 20 34 38 26 22 4 8 2 6
输出:
40
输入:
10
16 30 34 14 32 2 4 18 36 28 15144400 38 22 26 40 20 8 6 12
输出:
15144400
输入:
10
12 38 14 30 34 16 32 16192976 20 28 26 36 22 40 24 2 8 6 4
输出:
16192976
2. while 循环(不做重点)
基本模板:
while(条件) {
//循环体
}
同样的:小括号中为条件,大括号中为循环体。多的不赘述,可以在作业题中体会。
习题
B2055
B2071
旅途中的第一家水果店:数组
"小哥买苹果吗"
在后续面向对象开发的过程中,数组无疑是除基本框架外的头等重要的部分,也是 C++ 的半壁江山。在本篇中仅介绍数组的基本概念和一维数组的基本使用方式,在后续函数与算法部分会涉及高维数组。
总之先老老实实把基础打好吧
1. 概念
数组是一组相同类型元素的集合。(对没错就这么点)但基于这一概念,衍生出数组的两个重要特性:
数组中存放的是 1 个或者多个数据,但是数组元素个数不能为 0。
数组中存放的多个数据,类型是相同的。
2. 一维数组
(1)数组创建
一维数组创建的基本语法如下:
type arr_name[常量值];
存放在数组的值被称为数组的元素,数组在创建的时候需要指定数组的大小和数组的元素类型。
type 指定的是数组中存放数据的类型,可以是: char、short、int、double 等。
arr_name 是数组的名字,这个名字可以自定义,根据实际情况,起得有意义就行。 实则脸滚键盘也行
[] 中的常量值是用来指定数组大小的,根据实际需求指定就行。 为了保证不越界访问,往往会多开辟一些空间,后期题目中会讲到。
可以使用 const int N = 1000 的方式定义常量,来指定数组的大小。
例如:
const int N = 1000;
int arr[N];
(2)数组的初始化
在部分情况,数组在创建的时候,我们需要给定一些初始值 ,这种就称为初始化。 那数组如何初始化呢?最基本的,使用大括号进行数组的初始化,将数据放在大括号中:
//完全初始化,数据会依次放入数组 int arr[5] = {1, 2, 3, 4, 5};
//不完全初始化 int arr2[6] = {1};
//第一个元素初始化为1,剩余的元素默认初始化为0 //错误的初始化 - 初始化项太多 int arr3[3] = {1, 2, 3, 4};
重点:
数组的大小是从0 号位开始计算的,也就是说,当创建了一个大小为 10 的数组时,内部的编号只有0~9 号,不包括 10 号。
(3)循环在数组中的运用
当我们需要将 n 个元素从键盘输入进数组时,就需要循环来助力了:
#include <iostream>
using namespace std;
const int MAXN = 0xfff; //将MAXN定义为16进制下的fff,确保MAXN,即数组大小大于n
int a[MAXN]; //创建大小为MAXN的整型数组
int main() {
int n;
cin >> n; //给定的n
for(int i = 1; i <= n; i++) {
cin >> a[i]; //从第一位开始,依次存储输入的a[i],直至a[n]。注意:此处也可以从0处开始存储,
} //但是同样后期的处理也需要从0处开始
for(int i = n; i > 1; i--) {
for(int j = 1; j < i; j++) {
if(a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
} //冒泡排序,循环嵌套和排序的基础,在后续算法基础中将详细讲述,此处仅做了解
for(int i = 1; i <= n; i++) {
cout << a[i] << " "; //输出数组
}
return 0;
}
以上便是冒泡排序的基础代码,不硬性要求掌握完整逻辑,重点理解数组在实例中的使用方法。
练习题:
P1428 小鱼比可爱
P5727 【深基5.例3】冰雹猜想
写在最后
至此,你已经走完了这段旅途的前三站:会算、会选、会循环、会存一排数。下一阶段将进入函数与算法基础的内容,届时难度会陡增,请系好安全带。
如果这篇教程对你有帮助,欢迎点赞收藏; 发现笔误或讲得不清楚的地方,评论区直接拍砖,我会及时修正。