目录
一、第一个C++程序
1.编写第一个C++程序
vim编辑器创建/打开c++文件
vim hello.cpp
编写C++程序
//iostream输入输出流头文件
#include <iostream>
//cin是标准输入设备,cout标准输出设备
using std::cin;
using std::cout;
//endl回车换行
using std::endl;
//std是命名空间,包含cin,cout,endl
using namespace std;
//main函数左边int表示函数返回值的类型是int,int argc,char *argv[]是main函数的形参
//int argc,char *argv[]是命令行参数
//main函数是程序的唯一入口,也是编译器和操作系统唯一认识的函数
int main(int argc, char *argv[])
{
//{函数体}
//每条语句以;结束
//向标准输出设备上打印“hello chengdu”,并且换行
cout<<"hello chengdu"<<endl;
//1.函数结束,2.返回函数的返回值
return 0;
}
2.编译C++文件
//安装g++编译器
sudo apt install g++
//编译
g++ hello.cpp
g++ hello.cpp -o hello
3.运行可执行程序
运行可执行文件必须加路径(相对路径或绝对路径)
//执行
./a.out
./hello
二、基础知识
1.进制
1.1 进制简介
进制基本分为:十进制,二进制,八进制,十六进制
二进制:逢二进一,0和1
八进制:逢八进一,0,1,2,3,4,5,6,7
十六进制:逢十六进一,09,1015——>a~f
1.2 十进制转二进制
整数部分:除2倒取余,直到商为0
小数部分:乘2取整(每次都是小数部分乘2),直到小数部分为0
1.3 二进制转十进制
从低位到高位,每位上的数字乘以自己的权重,再累加
如10011010–>154
注意:(有些时候)
最高位是符号位:0表示+(正数),1表示-(负数)
最高位是0 ,表示正数可以省略,最高位是1表示负数,不能省略
归纳总结:
十进制转n进制(整数部分:除n倒取余,小数部分:乘n取整)
n:代表任意进制
n进制转十进制(每位数字*权重,累加)
1.4 八进制转二进制
每个八进制数对应三位二进制数
1.5 二进制转八进制
每三位二进制数对应一位八进制数
1.6 十六进制与二进制
每个十六进制对应4位二进制
2.原码、反码、补码
正数:原码=反码=补码
负数:反码=将原码的数据位,按位取反,最高位是符号位不变
补码=反码+1
注意:
下述代码打印结果不会是129,而是-127;因为char 的取值范围是 -128 ~ +127
129越界了2个,又会-128开始往后数2个,即-128,-127
#include<stdio.h>
void main()
{
// char -128~127
char a=129;
printf("a=%d\n",a);
//-128 -127
}
3.注释
//行注释
/*块注释*/
#if 1 //条件编译或者条件注释
#endif
4.关键字
常用关键字:
字符型:char(占1byte(字节),8bit(位))
整型:short(2byte),int(4byte),long(32位平台:4byte ;64平台:8byte)
浮点型:float,double
struct:结构体
union:联合体,联合体内的变量共用一块空间
enum :枚举
signed:有符号
unsigned:无符号
void:没有类型(空类型)
5.常量
常量,所见即所得,不能改变它
‘a’,‘1’,‘0’
字符常量:单引号作用的字符(转义字符除外)
‘\0’,‘\n’
整型常量:111,34567
浮点型常量:1.234,3.14f
6.变量
6.1 变量介绍
数据类型 变量名
变量的声明:char a;int b;float c;
变量的定义 a=‘c’;b=11;c=3.14;
变量命名规则:
变量名由:下划线、数字、字母组成,不能是关键字,首字母不能是数字
num_2(√),_v_a_3(√),case(×),2_q(×)
c语言:float stu_score;(下划线命名法)
C++: float stuScore;(驼峰命名法)
6.2 const修饰变量
const修饰的变量特点:具有只读属性
- 用常量初始化const 修饰的变量,不会给其开辟空间,值存在于符号常量表中
const int a = 10;
- const 修饰的变量取地址时,会立即为其开辟空间
7.基础数据类型
7.1 基础数据类型
字符型:char
sizeof(char)=1
整型:int short long
sizeof(int)=4,sizeof(long)=8,sizeof(short)=2
浮点型:float double
sizeof(float)=4,sizeof(double)=8
7.2 代码案例
- 字符型例题:将从终端输入的小写字母转成大写,大写字母转成小写,其它字符不做处理
int main(int argc, char *argv[])
{
bool loop=1;
do{
char str;
cout<<"please input string"<<endl;
cin>>str;
if(str>='A' && str<='Z'){
str+=32;
cout<<"large: "<<str<<endl;
}
else if(str>='a' && str<='z'){
str-=32;
cout<<"small: "<<str<<endl;
}
else if(str>='0' && str<='9'){
cout<<"ascill: "<<(int)str<<endl;
}
cout<<"continue?"<<endl;
char choice=' ';
cin>>choice;
if(choice=='N')
loop=0;
}while(loop);
return 0;
}
- 浮点型例题:统计成绩,如果输入的分数是>100或者是<0,输出“无效分数”
分数:
90~100:显示 “A”
80~90: 显示“B”
70~80:显示“C”
60~70: 显示"D"
0~59: 显示“F”
//方法1:
int main(int argc, char *argv[])
{
bool loop=1;
float score=0.0;
do{
cout<<"Please input a score"<<endl;
cin>>score;
if(score<0||score>100)
cout<<"please input right score"<<endl;
else{
switch(score/10){
case 10:
case 9:
cout<<"score is A"<<endl;
break;
case 8:
cout<<"score is B"<<endl;
break;
case 7:
cout<<"score is C"<<endl;
break;
case 6:
cout<<"score is D"<<endl;
break;
default:
cout<<"score is E"<<endl;
break;
}
}
//延时2秒显示
sleep(2);
}while(loop);
return 0;
}
//方法2:
int main(int argc, char *argv[])
{
float score=0.0;
cout<<"Please input a score !"<<endl;
cin>>score;
switch(score){
case 90 ... 100:
cout<<"A"<<endl;
break;
case 80 ... 89:
cout<<"B"<<endl;
break;
case 70 ... 79:
cout<<"C"<<endl;
break;
case 60 ... 69:
cout<<"D"<<endl;
break;
case 0 ... 59:
cout<<"E"<<endl;
break;
default:
cout<<"fail score"<<endl;
break;
}
return 0;
}
- 整型例题:输入三个整数,输出最小值和最大值
int main(int argc, char *argv[])
{
int a,b,c;
int max,min;
cout<<"pls input a,b,c"<<endl;
cin>>a>>b>>c;
if(a>b && a>c)
{
max=a;
}
else if(b>a && b>c)
{
max=b;
}
else if(c>a && c>b)
{
max=c;
}
if(a<b && a<c)
{
min=a;
}
else if(b<a && b<c)
{
min=b;
}
else if(c<a && c<b)
{
min=c;
}
cout<<"max="<<max<<","<<"min="<<min<<endl;
return 0;
}
8.运算符
8.1 加、减、乘、除,取模
a+=b; //a=a+b
a-=b; //a=a-b
a/=b; //a=a/b
a*=b //a=a*b
注意:
- 两边的运算对象如果是整形(int ,short,long,char),取整
- 两边有浮点型对象(float,double),除法
%: 取模运算,取左边运算符对象除以右边运算符对象后的余数
5%3=2
4%2=0
8.2 关系运算符
<,>, <=, >=,!=(不等于),==(等于)
8.3 逻辑运算符
C/C++:0为假,非0为真。
&&:逻辑与
有两个运算对象,是双目运算
运算对象1 && 运算对象2,逻辑与:左右两边的运算对象都为真,结果才是真,否则者是假
A | B | 结果 |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
0 | 0 | 0 |
||:逻辑或
有两个运算对象,是双目运算
运算对象1 || 运算对象2,逻辑或:左右两边的运算对象有一个为真,结果都为真,否则者是假
A | B | 结果 |
---|---|---|
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
0 | 0 | 0 |
! :逻辑非
逻辑非:如果原来为真 !操作后为假,如果原来为假,!操作后为真
A | !A | 结果 |
---|---|---|
真 | !真 | 假 |
假 | !假 | 真 |
9.控制语句:if、switch
9.1 if else语句
if(表达式) //表达式为真,执行语句块1
{
语句块1
}
else //表达式为假,执行语句块2
{
语句块2
}
if(表达式1)//表达式1为真,执行语句块1
{
语句块1
}
else if(表达式2)//表达式2为真,执行语句块2
{
语句块2
}
else if(表达式3)//表达式3为真,执行语句块3
{
语句块3
}
9.2 Switch语句
switch(常量表达式) //不能是浮点型
{
case 1:
语句块;
break; //跳出switch语句
case 2:
语句块;
break; //跳出switch语句
case 3:
语句块;
break; //跳出switch语句
default ://上述分支都不满足,会走到此处
语句块;
break; //跳出switch语句
}
9.3 案例
- 键盘输入数字1~7(其他数字提示无效数据);1:星期一,2:星期二,7:星期天
//if语句
int main(int argc, char *argv[])
{
int number=0;
cout<<"please input a number!"<<endl;
cin>>number;
if(number<1 || number>7){
cout<<"fail number!"<<endl;
}
else {
if (number == 1) {
cout<<"Monday"<<endl;
}
else if (number == 2) {
cout<<"Tuesday"<<endl;
}
else if (number == 3) {
cout<<"Wednesday"<<endl;
}
else if (number == 4) {
cout<<"Thursday"<<endl;
}
else if (number == 5) {
cout<<"Friday"<<endl;
}
else if (number == 6) {
cout<<"Saturday"<<endl;
}
else if (number == 7) {
cout<<"Sunday"<<endl;
}
}
return 0;
}
//switch语句
int main(int argc, char *argv[])
{
int number=0;
cout<<"please input a number!"<<endl;
cin>>number;
if(number<1||number>7){
cout<<"fail number!"<<endl;
}
else{
switch(number){
case 1:
cout<<"Monday"<<endl;
break;
case 2:
cout<<"Tuesday"<<endl;
break;
case 3:
cout<<"Wednesday"<<endl;
break;
case 4:
cout<<"Thursday"<<endl;
break;
case 5:
cout<<"Friday"<<endl;
break;
case 6:
cout<<"Saturday"<<endl;
break;
case 7:
cout<<"Sunday"<<endl;
break;
// default:
// cout<<"fail nember!"<<endl;
// break;
}
}
return 0;
}
- 键盘输入一个年份,判断是否是闰年
闰年评判标准:
1、能被400整除的年份是闰年
2、能被4整除且不能被100整除也是闰年
//布尔
bool isLeapYear(int year)
{
return year%400==0||year%4==0&&year%100!=0;
}
int main(int argc, char *argv[])
{
int year;
cout<<"please input a year !"<<endl;
cin>>year;
cout<<"isLeapYear? "<<isLeapYear(year)<<endl;
return 0;
}
//if语句
int main() {
int year;
cout << "请输入一个年份: ";
cin >> year;
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
cout << year << " 是闰年" << endl;
} else {
cout << year << " 不是闰年" << endl;
}
return 0;
}
//switch语句
int main() {
int year;
cout << "请输入一个年份: ";
cin >> year;
switch (year % 400) {
case 0:
cout << year << " 是闰年" << endl;
break;
default:
switch (year % 4) {
case 0:
if (year % 100 != 0) {
cout << year << " 是闰年" << endl;
} else {
cout << year << " 不是闰年" << endl;
}
break;
default:
cout << year << " 不是闰年" << endl;
break;
}
break;
}
return 0;
}
- 从键盘输入一个年份,随机生成一个月份(1-12),输出该月份对应的天数
注意:闰年二月29天,平年28天
bool isLeapYear(int year)
{
return year%400==0||year%4==0&&year%100!=0;
}
int main(int argc, char *argv[])
{
int year=0,month=0,day=0;
cout<<"please input a year "<<endl;
cin>>year;
srand(time(NULL));
month=rand()%12+1;
if(month==2)
{
if(isLeapYear(year)==1)
{
day=29;
}
else
{
day=28;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
day=31;
}
else
{
day=30;
}
cout<<"month is:"<<month<<", day is:"<<day<<endl;
return 0;
}
bool isLeapYear(int year)
{
return year%400==0||year%4==0&&year%100!=0;
}
int main(int argc, char *argv[]) {
int year=0, month=0, day=0;
cout << "please input a year: " << endl;
cin >> year;
srand(time(NULL));
month = rand() % 12 + 1;
switch (month) {
case 2:
switch (isLeapYear(year)) {
case 1:
day = 29;
break;
default:
day = 28;
break;
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
default:
day = 30;
break;
}
cout << "month is: " << month << ", day is: " << day << endl;
return 0;
}
10.循环控制:for、while、do…while、(goto)
10.1 for语句
for(表达式1;表达式2;表达式3)
{
循环体(语句块)
}
其它语句
首先执行表达式1:一般给循环条件变量赋初值,
第二步判断表达式2:如果条件为真,执行循环体,如果条件为假,不进入循环体,执行其它语句
第三步执行表达式3:改变条件变量的值
10.2 while和do…while语句
while(表达式)
//表达式为真,执行循环体内的语句块
//表达式为假,不进入循环体
{
语句块;
}
//先执行一次,再来进行判断
do
{
循环体;
}while(表达式); //此处有分号
10.3 goto语句(不推荐使用)
con:
语句块;
goto con;
10.4 continue和break
- break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环
for(int i=0; i<5; i++){
if(i==2){
break;
}
cout<<i<<" ";
}
2. continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为只是中止(跳过)本次循环,接着开始下一次循环
for(int i=0; i<5; i++){
if(i==2){
continue;
}
cout<<i<<" ";
}
10.5 死循环
for(;;)
{ }
while(1)
{
}
do{
}while(1);
loop:
goto loop;// 死循环,goto条件判断语句使用
10.6 案例
- 输出如下图形(菱形),输出的行数,从终端获取
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
int main(int argc, char *argv[])
{
int number;
cout<<"please input a number"<<endl;
cin>>number;
int &n=number;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
cout<<" ";
}
for(int j=0;j<2*i+1;j++)
{
cout<<"*";
}
cout<<endl;
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<i+1;j++)
{
cout<<" ";
}
for(int j=0;j<2*(n-1)-2*i-1;j++)
{
cout<<"*";
}
cout<<endl;
}
return 0;
}
- 打印九九乘法表
void multiplication_table()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
{
cout<<i<<"*"<<j<<"="<<i*j<<" ";
}
cout<<endl;
}
}
int main(int argc, char *argv[])
{
multiplication_table();
return 0;
}
11.数组
11.1 一维数组
数据类型 数组名[数组元素个数];
int a[10]; //a是数组名,a数组有10个int型的元素
int arr[5]={1,2,3,4,5}; //arr数组有5个int元素,分别是1,2,3,4,5
数组就是一个容器,开辟在栈区,数组存放的是同种类型的数据
11.2 二维数组
数据类型 数组名[数组元素个数][数组元素个数];
int b[M][N];M可以省略,N不能省略
int a[2][3](√),int b[][N](√),int c[M][](×)
用20-30的随机数给二维数组赋值:
int main(int argc, char *argv[])
{
//设置随机数种子
srand(time(NULL));
//定义二维数组
int a[2][3];
//用随机数给二维数组赋值
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
//取值20~30,给二维数组元素赋值
a[i][j]=20+rand()%11;
}
}
//输出二维数组元素的值
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cout<<a[i][j]<<" ";
}
}
cout<<endl;
return 0;
}
11.3 案例
一维数组——题目:输入5个数,求5个数中的最大值和最小值
int main(int argc, char *argv[])
{
int arr[5];
cout<<"please input array"<<endl;
for(int i=0;i<5;i++)
{
cin>>arr[i];
}
sort(arr,arr+4);
cout<<"arr:";
for(int i=0;i<5;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
cout<<"min="<<arr[0]<<" ,max="<<arr[4]<<endl;
int arr2[5]={10,20,30,40,50};
int min2=arr2[0],max2=arr2[0];
for(int i=0;i<5;i++)
{
if(min2>arr2[i])
{
min2=arr2[i];
}
if(max2<arr2[i])
{
max2=arr2[i];
}
}
cout<<"min2="<<min2<<" ,max2="<<max2<<endl;
find_max_min(*arr2);
return 0;
}
二维数组——题目:有5个学生,每个学生3科成绩,成绩可随机生成
1、求每个学生的平均成绩,保存到数组中
float stu_avg[5];
2、求每科成绩的平均成绩,保存到数组中
float avg[3];
const int NUM_STUDENTS = 5;
const int NUM_SUBJECTS = 3;
void generateRandomScores(int scores[NUM_STUDENTS][NUM_SUBJECTS]) {
for(int i = 0; i < NUM_STUDENTS; i++) {
for(int j = 0; j < NUM_SUBJECTS; j++) {
scores[i][j] = rand() % 101; // 生成0到100的随机数
cout << scores[i][j] << " ";
}
cout << endl;
}
}
void calculateStudentAverages(int scores[NUM_STUDENTS][NUM_SUBJECTS]) {
double avg;
for(int i = 0; i < NUM_STUDENTS; i++) {
avg = 0.0;
for(int j = 0; j < NUM_SUBJECTS; j++) {
avg += scores[i][j];
}
avg /= NUM_SUBJECTS;
cout << "stu" << i + 1 << "_avg_score: " << avg << " ";
}
cout << endl;
}
void calculateSubjectAverages(int scores[NUM_STUDENTS][NUM_SUBJECTS]) {
double avg;
for(int i = 0; i < NUM_SUBJECTS; i++) {
avg = 0.0;
for(int j = 0; j < NUM_STUDENTS; j++) {
avg += scores[j][i];
}
avg /= NUM_STUDENTS;
cout << "score" << i + 1 << "_avg_score: " << avg << " ";
}
cout << endl;
}
int main() {
int stu_score[NUM_STUDENTS][NUM_SUBJECTS];
srand(time(NULL)); // 设置随机数种子
cout << "Generating random scores:" << endl;
generateRandomScores(stu_score);
cout << "Calculating student averages:" << endl;
calculateStudentAverages(stu_score);
cout << "Calculating subject averages:" << endl;
calculateSubjectAverages(stu_score);
return 0;
}
12.函数
12.1 函数定义
返回值类型 函数名(参数1,参数2,参数3…)
返回值类型 函数名(无参)
函数调用:
函数体内的是局部变量,作用域只在当前函数
注意:如果函数是有参,调用的是无参,编译器会报错,要重新定义一个无参函数实现函数重载
12.2 案例
- 从终端输入两个数,实现两个函数
函数1:将这两个数相减,输出减的结果
函数2:得到这两个数的最大值,返回且输出
int sub(int a,int b)
{
return a-b;
}
int max(int a,int b)
{
if(a>b)
{
return a;
}
return b;
}
int main(int argc, char *argv[])
{
int a,b;
//函数的调用:函数名(参数)
cout<<"pls input a,b"<<endl;
//输入a和b的值
cin>>a>>b;
//a和b是实参
cout<<a<<"-"<<b<<"="<<sub(a,b)<<endl;
//函数调用
int max1;
max1=max(a,b);//此处变量名和函数名同名会冲突
cout<<"max="<<max1<<endl;
return 0;
}
- 实现一个函数,可以交换两个变量的值
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void swap(int& a, int& b)
{
if (a != b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}
int main(int argc, char *argv[])
{
int num1=10,num2=20;
cout<<"before swap :"<<"num1 = "<<num1<<", num2 = "<<num2<<endl;
swap(&num1,&num2);
cout<<"after swap :"<<"num1 = "<<num1<<", num2 = "<<num2<<endl;
int num3=100,num4=200;
cout<<"before swap :"<<"num3 = "<<num3<<", num4 = "<<num4<<endl;
swap1(num3,num4);
cout<<"after swap :"<<"num3 = "<<num3<<", num4 = "<<num4<<endl;
return 0;
}
- 实现一个函数,可将输入的字符串中的大小写字母保存并输出,并且统计大写字母个数,小写字母个数,其他字符个数
eg: 输入字符串:“13243432safsfadfadAAAAAAA%##*&^%%”
输出:safsfadfadAAAAAAA
void outAlphabet(char str[])
{
char CH[100],ch[100],others[100];
int CH_count = 0, ch_count = 0, others_count = 0;
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i]>='A'&&str[i]<='Z')
{
CH[CH_count]=str[i];
// cout << str[i] << " ";
CH_count++;
}
else if (str[i]>='a'&&str[i]<='z')
{
ch[ch_count]=str[i];
// cout << str[i] << " ";
ch_count++;
}
else
{
others_count++;
}
}
CH[CH_count]='\0';
ch[ch_count]='\0';
cout << CH << ch <<endl;
cout << "Total uppercase letters: " << CH_count << endl;
cout << "Total lowercase letters: " << ch_count << endl;
cout << "Total other characters: " << others_count << endl;
}
int main()
{
char myStr[100];
cout << "Enter a string: "<<endl;;
cin>>myStr;
cout<<"letters is : "<<endl;
outAlphabet(myStr);
return 0;
}
- 实现一个函数,将输入的字符串中的大小写字母互转,且将字符串的小写字母,大写字母,数字分别取出,用数组保存输出。
eg: 输入字符串:“132434353535AAAAABBBBB****abcbdgd887872&&%%%”
num[]={“132434353535887872”};
CH[]={“aaaaabbbbb”}
ch[]={“ABCBDGD”};
void reverse(char str[])
{
int CH_count = 0, ch_count = 0, num_count = 0;
char CH[100], ch[100], num[100];
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
CH[CH_count] = str[i] + ('a' - 'A');
CH_count++;
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
ch[ch_count] = str[i] - ('a' - 'A');
ch_count++;
}
else
{
num[num_count] = str[i];
num_count++;
}
}
cout << "CH to ch is: ";
for (int i = 0; i < CH_count; i++)
{
cout << CH[i] << " ";
}
cout << endl;
cout << "ch to CH is: ";
for (int i = 0; i < ch_count; i++)
{
cout << ch[i] << " ";
}
cout << endl;
cout << "num is: ";
for (int i = 0; i < num_count; i++)
{
cout << num[i] << " ";
}
cout << endl;
}
int main(int argc, char *argv[])
{
char myStr[100];
cout << "Please enter a string:" << endl;
cin>>myStr;
cout << "Output is:" << endl;
reverse(myStr);
return 0;
}