double a;
int b = a;
会直接输出a的整数部分。
考点:负数;小数点后没有数字
四舍五入到最邻近的整数
需要额外 #include
#include方法二:直接写round(1.56)=2.000000 round(-1.99)=-2.000000
double x;
int y;
if(d>=0) y = d+0.5;
else y = d- 0.5;
cout << y <
cpp7. 三元表达式
#include
using namespace std;
int main() {
int a, b, c;
cin >> a;
cin >> b;
cin >> c;
// write your code here......
(a>=b&&a>=c? (cout<=a&&b>=c? cout<
cpp8. 取小数点后1位
setprecision()为了精确小数位数
setiosflags(ios::fixed)为了保证当只有一位小数位且该小数位是0时,避免用e的指数输出
cout << setiosflags(ios::fixed) << setprecision(1) << cost << endl;
取小数点后1位 :
printf("%.2lfn",sum);
输出两个数,中间隔空格:
cout<
cpp10-11.switch函数
题目:
判断成绩等级(不要忘记在 case 语句的结尾添加 break 语句)
判断季节(闭区间:** … 左右必须加空格**)
default可以处理12、1、2这样不好分类的case,但可能与switch之前的不合法判断重复!因此,不合法判断写作if,switch写在else中较好!或者如下,提前return:
cin >> score;
if(score > 12 || score < 0){
cout<<"不合法"<
case 10: case 9: //可以一起取两种情况
cout << "优秀" << endl; break;
case 3 ... 5: //连续的值
cout << "春季" << endl; break;
default: //其余情况
cout << "差" << endl;
cpp12.for循环の跳步:
for(int i = n; i >0; i-=2)
cpp14.水仙花数:获取个十百位数字的方法 + main以外的bool函数
#include
using namespace std;
bool isNarcissus(int num){
// bool flag;//不需要flag,直接return即可!
// int a = num/100;//百位
// int b = (num%100)/10;//十位
//以下是另一种方法,更通用but需要先用tmp保存初始num值
int tmp = num;
int c = num%10;//个位
num /= 10;
int b = num % 10; //十位
num /= 10;
int a = num % 10; //百位
if ((a*a*a + b*b*b + c*c*c)==tmp){
// flag= true;
return true;
}else return false;//flag = false;
// return flag;
}
int main(){
for(int i = 100; i <=999; i++){
if (isNarcissus(i)) cout<
cpp16. long long的应用
求9 + 99 + … + 9999999999(10个9) 的和
如果用int会溢出。
#include
using namespace std;
int main(){
long long sum = 0;
long long j = 0;
for(int i = 0; i<10; i++){
j = j*10 + 9;
sum += j;
}
cout<
cpp17 如何输出“100.0 50.0”
cout<
double一般就用来表示小数;
cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符,所以输入100 3就等同于输入了100、输入了3(空格分隔)
https://blog.csdn.net/Buster001/article/details/100083803后续去看!
数组
cpp19. 获取数组最大最小值
自己思路:预定max为整数下限INT_MIN,min为整数上限INT_MAX
实际上可以将其都预定为 arr[0],这样输出的总为数组中的实际值;
int数组初始化为空:int arr[6] = {};初始化为0:int arr[6] = { 0 }
#include
using namespace std;
int main(){
int arr[6] = {};
int max = 0;
int min = 99999;
for(int i = 0; i < 6; i++){
cin>>arr[i];
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
cout<
int数组创建+输入+求元素个数
int arr[6] = { 0 };
int len = sizeof(arr) / sizeof(int); // 24/4=6
for (int i = 0; i < len; i++) {
cin >> arr[i];
}
另外:
char 数组里面是一个1 个元素1 个字节
int 和 long 数组里面在32位环境中都是1 个元素 4 个字节
long long 数组里面是1 个元素 8个字节:
#include
using namespace std;
int main()
{
char arr1[10]; // 10
int arr2[10]; // 40
long arr3[10]; // 40
long long arr4[10]; // 80
cout << sizeof(arr1) << endl << sizeof(arr2) << endl << sizeof(arr3)<
cpp21.冒泡排序
输入一个6元素的数组,进行冒泡排序
(未知个数,则使用:
int arr[9999] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++) { ...
重点在于 for(int i = 0; i <5 ; i++) (01234)和 for( int j = 0; j<5-i; j++)(01234,0123,012,01,0)的含义和上限:
i 表示遍历的轮数,总共需要len-1轮;实际上只是用来计数的,用12345、54321也一样,不参与实际操作(swap)
j 表示每次遍历相邻的j和j+1两个元素
i 和 j 的关系是和为 len-1,因为第一轮需要遍历到倒数第二和第一个元素,最后一轮只比较第一二个元素。
另外,标准库也可以使用swap(arr[j], arr[j + 1]) !
#include
using namespace std;
int main(){
int arr[6]= {0};
for(int i = 0; i<6;i++){
cin>>arr[i];
}
for(int i = 0; i <5 ; i++){
for( int j = 0; j<5-i; j++){
if(arr[j]>arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1]= tmp;
}
}
}
for(int i = 0; i<6;i++){
cout<
复杂度分析:
时间复杂度:O(n2),n为数组长度,冒泡排序两层循环,最坏情况下是逆序,一共比较(n∗(n−1)/2)次
空间复杂度:O(1),无额外空间
cpp22.选择排序
以下的注释行,死记住……不能改任何一处
#include
using namespace std;
int main() {
int arr[6] = {0};
int len = sizeof(arr) / sizeof(int);
for(int i = 0; i < len; i++) cin>>arr[i];
for(int i = 0; i
int min = i;/
for(int j = i+1; j < len; j++){
if(arr[j] < arr[min]) min = j;/
}
swap(arr[i], arr[min]);/交换两个变量的内容
}
for(int i = 0; i < len; i++) cout<
复杂度分析:
时间复杂度:O(n2),一共n轮选择,每轮要比较O(n)次
空间复杂度:O(1),无额外空间
cpp23. 创建二维int数组
int arr[4][3] = {
22,66,44, //有逗号,然后换行即可
77,33,88,
25,45,65,
11,66,99 //没有逗号
};
cpp29. 创建动态数组(※再看)
为什么网上都说要用 arr = (int*)malloc( arrLen*sizeof(int) );
int* arr = new int[n];
解析用的是
int* arr = new int[n];
之后一切如常。。。
#include
using namespace std;
int main() {
int n;
cin >> n;
int* arr = new int[n]; //指针申请n个空间
for(int i = 0; i < n; i++) //初始化
arr[i] = n + i;
for(int i = 0; i < n; i++) //输出
cout << arr[i] << " ";
return 0;
}
cpp26. 指针遍历 int 数组+输出
类似指路:cpp28指针处理char数组+输出
#include
using namespace std;
int main(){
int arr[6] = {0};
int len = sizeof(arr)/sizeof(int);
for(int i = 0; i < len ; i++) cin>>arr[i];
int* p = arr;
while(*p != ' '){///for (ptr ; ptr < arr + len ; ptr++)
cout<< *p <<" ";
p++;
}
cout<
字符串
字符串介绍:
https://www.nowcoder.com/knowledge/intro-index?kcid=95
字符串是存储在内存连续字节中的一系列字符。C++ 处理字符串有两种方式,一种是 C-风格字符串,另一种是基于 string 类。
C-风格字符串
可以将字符串存储在 char 数组中,每个字符都位于自己的数组元素中。
char name[5] = {'K', 'i', 't', 't', 'y'}; // 字符数组,不是字符串
C-风格字符串是以空字符结尾(空字符被写作 ,ASCII码为0),用来标记字符串的结尾。
char name[6] = {'K', 'i', 't', 't', 'y', ' '}; // C-风格字符串
字符数组初始化为字符串,可以使用双引号(“”)将字符串内容括起来。
char name[16] = "Hello Kitty";
char name[] = "Daniel";
// 双引号括起来的部分称之为字符串常量或者字符串字面值
string 类
可以使用 string 类型的变量来存储字符串。提供了将字符串作为一种数据类型的表示方法,使用起来比数组简单。
要使用 string 类,必须包含头文件**#include< string >**
string 初始化:
string str = {'h', 'e', 'l', 'l', 'o'};
string str = "hello world";
string str = {"hello world"}
string str {"hello world"}
显著区别:
① 可以将一个 string 对象赋值给另一个 string 对象,而数组不可以。
string str1;
string str2 = "hello";
str1 = str2;
② 可以使用运算符 + 将两个 string 对象合并起来,还可以使用 += 运算符。
string str3 = str1 + str2;
str1 += str2;
③ string对象用size()和length()方法获取字符串长度。
cpp24.string输入+合并+输出
输出两个字符串拼接后的结果
输入:
hello
nihao
复制
输出:
hellonihao
#include
#include ///!
using namespace std;
int main() {
string s1, s2;
getline(cin, s1);
getline(cin, s2);
s1 = s1+s2;
cout<
cpp56.string输入+统计其中某些char的个数
题目描述:输入一个只包含’a’,‘b’,‘c’的字符串,问’a’,‘b’,'c’分别出现了多少次。
getline(cin, s) 可以包含空格,可以输入ab c这样的字符串。
sizeof(s) / sizeof(string) 值为1,不能这样获取字符串长度,应该用s.size()或者s.length()。
s[i] 是单引号的 ‘a’ 。
#include
using namespace std;
int main(){
string s;
getline(cin, s);
// write your code here......
// int len = sizeof(s) / sizeof(string);cout<
if(s[i]=='a')aa++;
else if(s[i]=='b')bb++;
else if(s[i]=='c')cc++;
}
cout<
cpp34(类似) 统计空格、数字、字母等
#include
#include
using namespace std;
int main() {
string str;
getline(cin, str);
int whitespace = 0;
int digits = 0;
int chars = 0;
int others = 0;
// write your code here......
for(int i = 0; i < str.length(); i++){ //遍历字符串
if(isalpha(str[i])) //判断是否是字母
chars++;
else if(isdigit(str[i])) //判断是否是数字
digits++;
else if(isspace(str[i])) //判断是否是空格
whitespace++;
else
others++;
}
cout << "chars : " << chars
<< " whitespace : " << whitespace
<< " digits : " << digits
<< " others : " << others << endl;
return 0;
}
cpp27. char ch[100] :初始化、输入、输出;指针法求长度
初始化:char ch [100] = { 0 };
输入:cin . getline ( str , sizeof ( ch ) ); 包含空格
输出:cout << str << endl; 直接输出
思路:
求长度,便捷是用 char 数组,而不是string;
但此时对char 数组,不可以用 int len = sizeof(ch) / sizeof(char),会直达9999(数组的真正长度)
正解如下:(指针法)
#include
#include
using namespace std;
int main() {
char ch[9999] = {0};
cin.getline(ch,sizeof(ch));
//int len = sizeof(ch) / sizeof(char);///不可以用这句,会直达9999(数组的真正长度)
char* p = ch;
int i = 0;
while(*p != ' '){
i++;
p++;
}
cout<
cpp28. 指针法,创建新 char 数组+输出
题目描述:
在 char ch[100] 原字符串后半段,创建新字符串:指针做法
判断字符数组结束的标志:
for(int i = 0; ch [ i ] ! = ’ 0 ’ ; i++)
或者
while (*p != ‘ ’) ,注意是反斜杠0
或者
for (ptr ; ptr < arr + len ; ptr++)
求字符数组长度:
与 int 数组类似,可用 int len = sizeof (ch) / sizeof (char)
指针:
char* p = ch 指向 char数组的起始处,+ m - 1 指向第 m 个元素;
*p 表示 p 所指向的值
#include
#include
using namespace std;
int main(){
char ch[30]={0};
char copych[30]={0};
cin.getline(ch, sizeof(ch));/
int m;
cin>>m;
char* p = ch + m - 1;//
char* q = copych;
for(int i = 0; ch[i]!=' '; i++){///while(*p != ' ') //判断字符数组结束的标志
*q = *p;/复制值
q++;/同时移动
p++;
}
cout<
不用指针的做法:
...
#include //上面的char数组做法,不需要额外这句
int main(){
string s;
getline(cin,s);
int len = s.size();
int m;
cin>>m;
string s1="";
for(int i = m-1; i < len; i++){
s1+=s[i];
}
cout<
cpp29.char s[100]输入+转化为string+统计子串出现次数-find函数
用find函数
#include
#include
using namespace std;
int main() {
char str[100] = { 0 };
char substr[100] = { 0 };
cin.getline(str, sizeof(str));
cin.getline(substr, sizeof(substr));
int count = 0;
//转化为字符串!!!!!!!!!!!!!!
string str1(str);
string str2(substr);
int i=0;
//从str1下标i开始查找str2
while(str1.find(str2,i)!=-1){
//如果找得到,计数加1
count++;
//i从找到的位置,后移一位
i=str1.find(str2,i)+1;
}
cout << count << endl;
return 0;
}
不用find函数:(用char s[100])
#include
#include
using namespace std;
int main() {
char str[100] = { 0 };
char substr[100] = { 0 };
cin.getline(str, sizeof(str));
cin.getline(substr, sizeof(substr));
int count = 0;
for(int i = 0; str[i] != ' '; i++){ //遍历字符串str
bool flag = true;
for(int j = 0; substr[j] != ' '; j++){ //以字符串str的i位置为起点,每次同步遍历substr长度
if(str[i + j] != ' ' && str[i + j] == substr[j]) //比较每个字符
continue;
else{
flag = false; //不相同,这一次不是子串
break;
}
}
if(flag)
count++;
}
cout << count << endl;
return 0;
}
cpp31. 比较字符串大小:函数写法
比较思路:不等长则长的大;等长则有第一次出现更大字符的大
例如: hello < helloworld hello < Hello
注意点:
函数顺序:先声明,再main函数,再定义
(const char* src, const char* dst)在函数体内直接用,不可以另外初始化
求char数组长度的便捷方法: int len1=strlen(src);
int len1=strlen(src);
int len2=strlen(dst);
int i=0,j=0;
while(i
//如果src当前字符小于dst,说明src小于dst,返回-1
if(src[i]
自己的做法:
#include
using namespace std;
//先声明,再main函数,再定义
int mystrcmp(const char* src, const char* dst);
int IfLenEqual(const char* src, const char* dst);
int main() {
char s1[100] = { 0 };
char s2[100] = { 0 };
cin.getline(s1, sizeof(s1));
cin.getline(s2, sizeof(s2));
int ret = mystrcmp(s1, s2);
cout << ret << endl;
return 0;
}
int mystrcmp(const char* src, const char* dst) {
int equal = IfLenEqual(src,dst);
if(equal == 1) return 1;
if(equal == -1) return -1;
if(equal == 0){
while(*src!=' ' && *dst !=' '){
if(*src > *dst)return 1;
if(*src < *dst)return -1;
src++;
dst++;
}
return 0;
}
return 0;
}
int IfLenEqual(const char* src, const char* dst) {
int len1 = 0, len2= 0;
//char* p = src;///不可以另外初始化
// char* q= dst;
while(*src != ' ') {
len1++;
src++;
}
while(*dst != ' ') {
len2++;
dst++;
}
return len1>len2 ? 1 : len1



