算法:
通俗的讲,
算法是解决一系列问题的清晰步骤和方法,
是准确解决问题方案的完整描述,
是对有一定规范的输入,
在有限的时间内获得所要求的输出的这种能力的表达。
vector:
容器内元素访问:
1.通过下标访问:类似普通数组,下标从0开始。
2.通过迭代器访问:vector<DataType>::iterator it;
应用后续参考后续 EXAMPLE
1. C++ 程序结构
#include <iostream> //include 包括包含 引入头文件(导入工具箱)
using namespace std; //使用 标准的 名字空间
int main() // main() 是程序开始执行的地方
{
// 写指令的地方
return 0;//程序的出口 返回0 归零
}
1.C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 <iostream>。
2. using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
3. int main() 是主函数,程序从这里开始执行。
4. cout << "Hello World"; 会在屏幕上显示消息 "Hello World"
5.return 0; 终止 main( )函数,并向调用进程返回值 0。
3.评测状态含义:
AC:Accept,程序通过。
WA:Wrong Answer,答案错误。
CE:Compile Error,编译错误。
PC:Partially Correct,部分正确。
RE:Runtime Error,运行时错误。
TLE:Time Limit Exceeded,超出时间限制。
MLE:Memory Limit Exceeded,超出内存限制。
OLE:Output Limit Exceeded,输出超过限制。
UKE:Unknown Error,出现未知错误。
变量:
1.变量的命名规范
2.类型的区分
C++中变量是区分类型的,不同类型的盒子存放不同类型的数据
3.变量的声明:
#include<iostream>
using namespace std;
int main() {
//声明变量
int a; //告诉计算机我需要一个用来存放整型数据的变量,取名为a
a=2; // = 赋值符 往变量a里放入一个数字2
a=3; // 往变量a里放入一个数字3 之前的2就被覆盖掉了
return 0;
}
约瑟夫环:
#include<iostream>
using namespace std;
int n,m,s,x;
int a[105];
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){ //设置每一个人的转台,1表示或者
a[i]=1;
}
while(s!=n){ //s为出局人数
for(int i=1;i<=n;i++){
if(a[i]1){//只有还在场的人才能参与游戏
x++; //报数加一
if(x%m0){ //如果所报的数x是m的倍数
a[i]=0; //此人出局
s++; //出局人数加一
pintf("%d ",i);//输出编号
}
}
}
}
return 0;
}
开关灯问题:
注:0<n<=k
#include <iostream>
using namespace std;
int a[1005]={0};
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++){//i表示轮数,也就是第几个人
for(int j=1;j<=n;j++){ //j表示每一项灯
if(j%i==0){ //判断该灯是否是i的倍数
if(a[j]==0){ //关灯变成开灯
a[j]=1;
}
else{ //开灯变成关灯
a[j]=0;
}
}
}
}
0713.数组增删除改查
1. 普通查找
方法:遍历数组获取目标元素索引位置
2.数组的增加
第一步:获取目标位置的索引为m
第二步:从最后一项索引为n到索引为m项的元素依次往后移动一步
for(int i=n;i>=m;i--){
a[i+1]=a[i];
}
第三步:a[m]=x; //向目标索引位置插入数据
3.数组的删除
第一步:获取目标位置的索引为m
第二步:从索引为m+1项到索引为n项的元素依次往前移动一步
第三步:打印输出
4.二分查找
二分查找 也称折半查找,是一种效率较高的查找方法。
算法要求:
1.必须采用顺序存储结构-数组。
2.必须按关键字大小有序排列。
猜数字:1-100中 猜一个数字,大了说大了,小了说小了,使用二分查找最多用多少次方法?
若查找不到的情况
//二分查找模板代码
#include<bits/stdc++.h>
using namespace std;
int a[10005],x,n;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>x; //目标值
int l=1,r=n,mid;
while(l<=r){ //在左边界小于等于右边界的时候可以进入循环
mid=(l+r)/2; //获取中间位置索引
if(a[mid]>x){ //中间值大于目标值
r=mid-1; //右边界移到mid-1
}else if(a[mid]<x){ //中间值小于目标值
l=mid+1; //左边界移到mid+1
}else{ //中间值等于目标值
cout<<mid;
return 0;
}
}
cout<<"-1";
return 0;
}5.cin输入cout输出
注意:在输出变量值和输出文本时,必须用“<<”分开输出,“<<”和“<<”之间要不是一段文本要不是一个变量的值(计算结果)。
换行:cout<<a<<endl<<b; // end结束 l行line 所以是结束这一行 换行的作用
在格式化输入输出的时候,必须选择scanf和printf,无格式要求两种均可使用。
0714 字符数组
1.字符数组:存储字符的数组
字符数组的定义:
char site[] = {‘H’, ‘E’, ‘L’, ‘L’, ‘O’};
char site[5] = {‘H’, ‘E’, ‘L’, ‘L’, ‘O’};
char site[10] = {‘H’, ‘E’, ‘L’, ‘L’, ‘O’};
//没有被定义的字符数组就是空字符
2.字符串
字符串:是使用最频繁的字符数组,是一个特殊的字符数组。
char site[] = “Hello";
//字符串变量的赋值必须要用双引号括起来。
//思考?数组site的数组长度为多少?? 答案为:6
注:C++中并没有专门的字符串的类型,一个字符串实际上就是一个字符数组,与普通字符数组不同的是,字符串的结尾有一个字符‘\0’,表示字符串的结束。
3.输出
1. 输出整个字符数组
格式符:%s
//试一试分别会得到什么?
char a[4] = "abc";
char b[4] = {'a','b','c','\0'};
char d[3] = {'a','b','c'};
char e[3] = {'a','b','c'};
printf("%s\n", a); //可用
printf("%s\n", b); //可用
printf("%s\n", d); //不可用
printf("%s\n", e); //不可用
得到:
abc
abc
abcabc
abcabcabc
注:字符数组输出遇到0会自动结束。
2.输出数组中的前三个
输入一串字符串,输出前3个? 例如: 输入:abcdefg ;输出:abc
char s1[100]={0};
scanf("%s",s1);
//方法一
printf("%c %c %c\n",s1[0],s1[1],s1[2]);
//方法二
for(int i=0;i<=2;i++){
printf("%c",s1[i]);
}
printf("\n");
//方法三
s1[3]='\0';
printf("%s",s1);
4.输入
1.普通输入
char
a[100];
scanf("%s",a);
//cin>>a;注意:
(1)不加地址符,
(2)系统会自动在输入的字符串后面加入\0
(3) 输入多个字符串时用空格隔开
2.gets()输入
gets()输入与scanf类似,但是遇到空格、Tab时,不会结束写入,仅当遇到回车时结束写入;,也就是可以读取空格。
char s1[100];
gets(s1);
printf("%s",s1);5.练习
1.统计数字字符个数
#include <iostream>
#include <cstring> //// 此头文件,可使用strlen()函数
#include <cstdio> // 此头文件,可使用gets()函数
using namespace std;
int main()
{
char s1[256]={0}; //创建数组并初始化
int x=0,l;
gets(s1); //输入
l=strlen(s1); //获取数组长度
for(int i=0;i<l;i++){
if(s1[i]>='0'&& s1[i]<='9'){ //判断字符是否是在'0'-'9'之间
x++; //个数增加
}
}
printf("%d",x);
} 2.
3.
0715 字符串常用函数
练习1:字符串比较函数strcmp ()的用法
编写一个程序.使用char数组和循环来每次从键盘读取一个单词、直到用户输入done为止。随后输出该程序让用户输入了多少个单词。数组长度不超过100。
char s1[100]={0};
int x=0;
scanf("%s",s1);
while (strcmp(s1,"done")){
x++;
scanf("%s",s1);
}
printf("%d",x);练习2:找第一个只出现一个的字符
#include <iostream>
#include <cstring> // 此头文件,可使用strlen()函数
#include <cstdio> // 此头文件,可使用gets()函数
using namespace std;
int main()
{
char s1[200]={0},t;
int a[200]={0}; //用来记录的字母个数
int l=0,x;
scanf("%s",s1);
l=strlen(s1);
for(int i=0;i<l;i++){
x=s1[i]; //把获取的字母转换为对于ASCII数
a[x]; //在数组a的x索引位置记录x出现的次数
}
for(int i=97;i<=122;i){ //遍历数组a中第97到122的所有
if(a[i]==1){ //数组里面存放的数字为1
printf("%c",i); //把i格式化为对于字符
return 0; //结束
}
}
printf("no"); //没有找到就输出no
} 0819二维数组
二维数组就是在一维数组上,多加一个维度。
我们把二维数组的两个下标分别称为行下标和列下标,在前面的是行下标,在后面的是列下标.
注意:二维数组的下标也都是从0开始的。
1.二维数组定义方式:
1. 数据类型 数组名[ 行数 ] [列数];
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 5;
cout << arr[0][0] << endl;
cout << arr[0][1] << endl;
cout << arr[0][2] << endl;
cout << arr[1][0] << endl;
cout << arr[1][1] << endl;
cout << arr[1][2] << endl;2、数据类型 数组名[行数][列数] = {{数据1,数据2,数据3},{数据4,数据5}};//行列存储
int arr2[2][3] ={{1,2},{3,4,5} };
// 问 arr2[0][2]是多少?3、数据类型 数组名[ 行数 ][列数] ={数据1,数据2,数据3,数据4}; //顺序存储,建议不使用
int arr3[2][3] = { 1,2,3,4,5,6 };
2 数组的输入输出:
例:输入2行3列的数据,然后并打印
int a[10][10]={0};
//输入
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cin>>a[i][j];
}
}
//外层循环打印行数,内层循环打印列数
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout<<arr[i][j] << endl;
}
}实例1
【实例2】
一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的平均分和总平均分。
思路:对于该题目,可以定义一个二维数组 a[5][3] 存放 5 个人 3 门课的成绩,定义一个一维数组 v[3] 存放各科平均分,再定义一个变量 average 存放总平均分.
输入:
80 61 59 85 76
75 65 63 87 77
92 71 70 90 85
输出:
Math: 72
C Languag: 73
English: 81
Total: 75
二维数组的初始化还要注意以下几点:
1. 可以只对部分元素赋值,未赋值的元素自动取“零”值
0904二维数组2
1. 杨辉三角
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合
2. 扫雷游戏
3. 蛇形方阵
0911 二维字符数组
二维字符数组一般用于存储和处理多个字符串,二维字符数组中的每一行均可存储表示一个字符串。
1.二维字符数组的定义
二维字符数组的定义格式为:
char数组名[第一维大小】[第二维大小};
如:
char c[3][10]定义了一个3行10列的二维字符数组c
由于该二维数组的每一行c[0]、c[1]、 c[2] 均是含有10个元素的一维字符数组,即二维数组的每一行均可表示一个字符串。
2.二维字符数组的初始化
通常情况下,二维数组的每一行分别使用一个字符串进行初始化。例如:
4. char c[3][8]={{"apple"},{"orange"},{"banana'}};
等价于:
5. char c[3][8]={"apple","orange","banana"};
以上两条初始化语句中,二维数组的第一维大小均可省略。数组c的逻辑结构如下所示:
3.二维字符数组元素的合法引用:
6. printf ("%c"c[1][4]); //输出1行4列元素'g'字符
7. scanf ("%c" ,&c[2][3]); //输入一个字符到2行3列元素中
8. c[2][0]='B'; //把字符赋值给2行0列元索
9. printf ("%s",c[1]); //c[1]为第2行的数组名(首元素地址),输出orange
10. scanf ("%s' ,c[2]); //输入字符串到c[2]行,从c[2]行的首地址开始存放
4.二维字符数组元素的非法引用:
c[0][0]="A"; //行、列下标表示的为字符型元素,不能使用字符串赋值
printf ("%c",c[2]); //c[2]为第3行的首地址,不是字符元素,故不能用%c
5.实例
11. 定义二维字符数组,输入5个英文名字,并依次输出,名字长度<=20.
12.
13. 姓名排序
0918string类型
string——字符串,不必担心内存是否足够,字符串长度等等,是C基本数据类型。
1.初始化
string s1; // 初始化一个空字符串
string s2 = s1; // 初始化s2,并用s1初始化
string s3(s2); // 作用同上
string s4 = "hello world"; // 用 "hello world" 初始化
string s5("hello world"); // 作用同上
string s6(6,'a'); // 初始化s6为:aaaaaa
string s7(s6, 3); // s7 是从 s6 的下标 3 开始的字符拷贝
string s8(s6, pos, len); // s8 是从 s6 的下标 pos 开始的 len 个字符的拷贝2.字符串操作
输入
string str;
cin>>str; //输入不能存储空格
getline(cin,str); //输入包含空格函数
#include <bits/stdc.h>
using namespace std;
int main()
{
string s1 = "abc"; // 初始化一个字符串
cout << s1.empty() << endl; // s 为空返回 true,否则返回 false
cout << s1.size() << endl; // 返回 s 中字符个数,不包含空字符
cout << s1.length() << endl; // 作用同上
cout << s1[1] << endl; // 字符串本质是字符数组
cout << s1[3] << endl; // 空字符还是存在的
}
// 运行结果 //
0
3
3
b
基本操作
s1+s2 // 返回 s1 和 s2 拼接后的结果。
s1 == s2 // 如果 s1 和 s2 中的元素完全相等则它们相等,区分大小写
s1 != s2
<, <=, >, >= // 利用字符的字典序进行比较,区分大小写
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 = "runoob";
string str2 = "google";
string str3;
int len ;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}0925函数
函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。这样编制的程序结构清晰,逻辑关系明确,无论是阅读、编写、调试、还是修改都会带来极大的好处。
函数声明告诉编译器函数的名称、返回类型和参数。
函数定义提供了函数的实际主体。
C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,abs() 用与求绝对值。
函数还有很多叫法,比如方法、子例程或程序,等等
1. 函数的定义
在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,