0%

小课堂01-基础篇1

“小课堂”系列旨在针对蓝桥杯等比赛、考试进行快速入门,以及帮助「学过但记忆模糊」的同学快速唤醒脑海中的知识。

注意事项:
1.推荐使用 Dev-C++ 4.9Dev-C++ 5.4 (蓝桥杯使用此IDE),不推荐使用 Visual Studio。
2.推荐参考资料:菜鸟教程 (系统、详细的教程,可作为补充学习),CSDN、CnBlog(有什么问题可以搜了看这上面的解答)
3.教程所讲内容应全部掌握,记在脑中
4.课程中的题目务必完成

输入输出

cin 和 cout

示例:

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>               // 包含在iostream中
using namespace std; // 命名空间不能忘,忘了就报错

int main(){
int x;
cin>>x; // 输入用「>>」,并且千万不能跟endl
cout<<"hello,world"<<endl; // 输出用「<<」,endl用于换行
cout<<"The value of x is: "<<x;// 不用指定类型
cout<<endl; // 建议总是在最后一次输出后加上endl
return 0;
}

关于cin和cout的输入输出格式控制,会在下一节课讲。

printf 和 scanf

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>         // 包含在cstdio中,相当于stdio.h,但C++中应该使用cstdio,没有后缀!
int main(){
int x = 5;
printf("Number = %d", x); // 整数输入输出用%d,输出后面跟变量

float f;
scanf("%f", &f); // 浮点数用%f,输入后面跟地址&f

double d=2.33;
printf("%lf", d); // 双精度用%lf

char c;
scanf("%c", &c); // 字符用%c

string s="hello";
printf("%s", s); // 字符串用%s

printf("\n"); // 换行,只能在输出时用!输入时千万不能用!

return 0;
}

一定要牢记上述几种常用类型的控制符输入时后面跟地址输出时后面跟变量,并且控制符要包含在引号中

关于printf和scanf的输入输出格式控制,会在下一节课讲。

文件输入输出

fprintf 和 fscanf

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>
#include <string> // 因为用到了string,所以要包含这个头文件,具体用法会在后面讲到

int main(){
FILE * fp; // 注意!是FILE*,不要忘了「星号」

fp = fopen ("file.txt", "w+"); // 不要忘记把返回值赋给fp
fprintf(fp, "%s %d", "hello,world", 2019); // 将一个字符串和一个整数存入file.txt

string str;
int year;
fscanf(fp, "%s%d", str, &year); // 此时str被赋值为“hello,world”,year被赋值为2019

fclose(fp);

return 0;
}

fopen常用的文件访问模式(即第二个参数)

  • w+:创建一个可读写的空文件,如果已存在同名文件,则会删除已有文件的内容
  • a+:打开一个用于读取和追加的文件,如果文件不存在,则创建文件

注意点

使用方法基本与printf、scanf一样,但要注意以下几点:

  • 在使用文件前要调用fopen打开文件,并且将返回值复制给一个FILE*类型的变量fp
  • 文件使用完后要调用fclose,注意要传入一个FILE*类型的变量fp
  • 调用fprintf和fscanf时传入的第一个参数是fp

fstream 中的函数(C++特有)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <fstream> // 包含在头文件fstream中
#include <string>
#include <iostream>
using namespace std;

int main (){
// 以写模式打开文件
ofstream fout;
fout.open("file.txt");

fout << “hello,world” << 2019 << endl; // 向文件写入用户输入的数据
fout.close(); // 关闭打开的文件


// 以读模式打开文件
ifstream fin;
fin.open("file.txt");

string str;
int year;
fin >> str >> year; // 此时str被赋值为“hello,world”,year被赋值为2019
fin.close();

return 0;
}

注意点

使用方法和cin、cout基本一样,但有以下注意点:

  • 读写要用不同的流对象(ofstream 和 ifstream),对象的名字可以随意起,但要注意与文件、读写模式对应
  • 创建好流对象后,要用「成员函数 open」 打开指定文件,一定注意要以 「fout.open(PATH)」 形式调用,不要和上面的 fopen 搞混了

循环语句

for

1
for(变量赋值; 循环继续的条件; 每次迭代的变量更新)

break 和 continue

break:跳出break语句所在的循环体
continue:不执行continue语句后的语句,直接开始下一轮循环

while 和 do while

1
2
3
4
5
6
7
8
while(循环的条件){ // 先判断再执行
//TODO
} // 看这里!!!没有分号!!!


do{ // 先执行再判断
//TODO
} while(循环继续的条件); // 看这里!!!有分号!!!

指针

示例(如果太绕,可以先忽略小括号中的内容):

1
2
3
4
int x=2;         // 假设变量存放在地址0x233处
int* p=&x; // 用「int*」定义一个「指向整型的指针」p,用「取地址运算符&」将x的地址赋值给指针p
cout<<p<<endl; // 输出x的地址(或称为p指针的值)0x233
cout<<*p<<endl; // 输出x的值(或称为p指针指向的值)2

⚠️注意:void*不是「指向void变量的指针」,而是「可以指向任意类型变量的指针」,例如:

1
2
3
int *a;
void *p;
p=a;

指针看似简单,实则复杂,会在后续课程中陆续补充。

数组

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int num1[4]; // 全局变量,默认赋值为0

int main(){
int num2[4]={0}; // 局部变量一定要记得手动赋初始值,只给其中部分元素赋值,那其他元素默认赋0
int *num3=new int[4](0); // new得到的数组也要手动赋初值

}

考虑这样一个问题:读入十个整数,逆序输出到一行中。(动手写一写)

思考以下问题(下节课会解答):

1
2
3
int nums[10];
nums;
&nums[0]; //nums和&nums[0]有何异同?

字符串

C风格字符串

下堂课讲

string

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string> // 包含在string头文件中,不能忘!

using namespace std;

int main ()
{
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;

cout<<str1[0]<<endl; //输出str1的第一个字符'H'
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;

// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;

// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;

return 0;
}

string使用起来十分简单方便,一般情况下用string作为字符串就行。

函数

函数返回类型 函数名(参数类型1 形参名1,参数类型2 形参名2) {代码段}

示例:

1
2
3
4
5
6
int max(int a, int b){
if(a>b)
return a;
else
return b;
}

⚠️注意:C++中的函数参数都是按值传递

什么是按值传递:

1
2
3
4
5
6
7
8
9
10
void func(int x){
x=x+1;
cout<<x;
}

int main{
int a=2;
func(a); // 输出3
cout<<a; // 输出2,func函数对x的改变不影响a
}

题目

  • 从键盘输入一个任意长的字符串,设计一个将函数倒序排列的函数stringReverse,将倒序后的结果存入“ans.txt”文件

  • https://www.luogu.com.cn/problem/P1425

  • 修改以下代码,使得a变量的值会因为add函数的执行而加1(使用指针,不要改变函数的返回类型):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<iostream>
    using namespace std;

    void add(int x){
    x=x+1;
    cout<<"x: "<<x<<endl;
    }

    int main(){
    int a=2;
    add(a);
    cout<<"a: "<<a<<endl;
    return 0;
    }