文章目录
-
- 1.未知循环次数
- 2.字符串,字符数组,数字相互转换
- 3.整型数中查找数字个数组成的新数
- 4.字符串长度,与数字一起输入(输入带空格)
- 5.整数相除的四舍五入,保留小数点
- 6.多余空格的输出问题,输出不同段数组的基本方法(没想到)
- 7.题目要求,只满足结果,部分要求(过程)可不予考虑!
- 8.考虑题目中的限制范围
- 9.二维数组
- 10.map对应键值查找
- 11. while(scanf("%d%d",&n,&e)!=EOF)
- 12.break与continue的区别
- 13.math函数
- 14.C++中不能连写比较符号
- 15.数组反转
- 16.浮点数比较大小
- 17.double/int 不同强制类型转换
- 18.字符数组(存数字)想要判断是否满足一定要求,可以通过中间变量temp,转为数字,再通过正确要求传给新的数组,比较两个数组
- 19.遍历数字和数字不好比较,转为输入字符串,a.size(), ' '- '0'还为数字;或者转为字符数组和字符,strlen(a),a[i]==da
- 20.对于输入输入字符或者数字,计数
- 21.判断语句思想
- 22.存储真假值的bool数组,flag标志,temp
- 23.string不能用printf %s 输出
- 24.字符串数字相加
- 25.char[] 和 string不读取空格和换行符
- 26.结构体字符数组的输入
- 27.求数字各位之和
- 28.字符(串/数组)输入方式
- 29.字符本身是一个ASCII码值,可当作整数用
1.未知循环次数
参考1016 部分A+B(15 分):
用while(a!=0)
参考:1010 一元多项式求导 (25分)
while(…!=EOF),ctrl+z退出输出
2.字符串,字符数组,数字相互转换
char[] -> string:
str=c;
string -> char[] :strcpy(c,s.c_str())
char[] -> num:sscanf(c,"%d",&n);
num -> char[]:sprintf(c,"%d",n);
string -> num:n=stoi(str);
num -> string:str=to_string(n);
第一种:(字符数组与数字)sscanf()和sprintf():
string不适应这种方法
(1)sscanf(str,"%d",&n):将str字符串以%d的格式传给n
char a[10]="1234";
int n;
sscanf(a,"%d",&n);
printf("%d",n);
1234
(2)sprintf(str,"%d",n):将n以%d的格式传给str数组里
char a[10];
int n = 1234;
sprintf(a,"%d",n);
printf("%s",a);
1234
第二种:字符数字转为数字:str1[i]-‘0’
如果str里面存放的是数字字符的话就是转成其数值类型。
比如说str[i]是'1',其实ascii码值为0x31,而'0'的ascii码是0x30,用str[i]-'0'就得到了1。
①:输出字符所代表的十进制
char str=‘b’;
cout<<str-‘0’+‘0’;
cout<<'1'-'0'+'0'<<endl;
:49
cout<<'b'-'0'+'0';
:98
②:十进制代表的字符
char(98);:b
ASCII码表:
第三种:数字转字符串
#include<bits/stdc++.h>
using namespace std;
int main()
{
//数字---> 字符串
//1.stringstream;
int n;
string str;
stringstream ss;
cin>>n;
ss<<n;
ss>>str;
cout<<str;
//2.to_string():数字---> 字符串
int n;
cin>>n;
string str;
str = to_string(n);
cout<<str;
}
第四种:字符串转数字
#include<bits/stdc++.h>
using namespace std;
int main()
{
//字符串 ---> 数字
//1.stringstream
string str;
int n;
stringstream ss;
cin>>str;
ss<<str;
ss>>n;
cout<<n;
//2.<string>中的stoi()函数
int n;
string str;
cin>>str;
n = stoi(str);//string to int
cout<<n;
}
第五种:字符串,字符数组之间相互转换
- string->char[]:s.c_str()
string s="abcde";
const char *a;
a=s.c_str();
printf("%s",a);
string s="abcde";
char c[]={
0};
strcpy(c,s.c_str());
printf("%s",c);
2.char[] -> string
char c1[]=“abcde”;
string s1;
s1=c1;
cout<<s1;
string(char a);
3.整型数中查找数字个数组成的新数
if(a%10==da){//找对应数字
pa=pa*10+da;//进行上升位数,相加
}
a/=10;
4.字符串长度,与数字一起输入(输入带空格)
string a,b:a.size()
char a[20],b[20]:strlen(a)
1.第一种
string a,b;
int da,db;
cin>>a>>da>>b>>db;
2.第二种
char a[20],b[20];
int da,db;
scanf("%s %d %s %d",&a,&da,&b,&db);//一定要有空格,系统会读入空格
5.整数相除的四舍五入,保留小数点
参考:1026 程序运行时间
(15分)
1.整数除法用 “/”的话得到的是一个整数(得到小数的话自动去掉小数位只保留整数位)
2.先将两个数转化为double类型,再进行“/”除法。
double c1,c2;
scanf("%lf%lf",&c1,&c2);
double c = c2-c1;
double time = c/100;
printf("%f",time);
输出:
123 4577973
45778.500000
四舍五入:
1.round()
2."/100"之后要判断四舍五入,所以判断后两位 >=50与否!
if(time%100>=50){
time=time/100+1;
}
else{
time=time/100;
}
double c1,c2;
scanf("%lf%lf",&c1,&c2);
double c = c2-c1;
int time = round(c/100);//四舍五入 (round(c/100)是double型)
printf("%d",time);
123 4577973
45779
保留小数:
1.cout<<setprecision(2)<<fixed<<...
2.cout<<setiosflags(ios::fixed)<<setprecision(2)<<...
cout<<setprecision(2)<<fixed<< round(c/100)<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(2)<<round(c/100);
45779.00
45779.00
cout<<setprecision(2)<<fixed<<1.235;//1.24
6.多余空格的输出问题,输出不同段数组的基本方法(没想到)
最后一位不用输出空格?
//先输出内容,再确定范围
for(int i = 0; i < num.length(); i++){
cout<<pinyin[num[i]-'0'];
if(i < num.length()-1){
cout<<" ";
}
}
//先确定空格
for(int i = 0; i < num.length(); i++){
if(i!=0){
cout<<" ";
}//i=0;i=1;i=2
cout<<pinyin[num[i]-'0'];
}
输出数组不按从开头开始输?
for(int i = n-m; i < n; i++){
cout<<a[i]<<" ";
}
for(int i = 0; i < n-m; i++){
cout<<a[i];
if( i < n-m-1){//2.注意下标
cout<<" ";
}
}
//if(i!=0) 格式错误:只防止了最后一个数没有多输出;会导致中间数多输出
//printf(" ");
cnt--;
if(cnt!=0) printf(" ");//只要不是最后一个,就都可以输出空格
7.题目要求,只满足结果,部分要求(过程)可不予考虑!
8.考虑题目中的限制范围
1.没有给出范围,则要考虑周全。
参考:1008 数组元素循环右移问题 (20分) “m的取值考虑”
2.开数组,要比题目要求的再大一点
9.二维数组
char str[][10];//每个字符串10个字符,不限几个
char str[10][10];//每个字符串10个字符,有10个字符串
string str[10];//有10个字符串
10.map对应键值查找
参考:1018 锤子剪刀布
(20分)
map<char,int>mp1,mp2; mp1['C']=0; mp1['C']++;
用处:字符与其对应数字的存储
map遍历找最大值即相应字符:
map<char,int>::iterator it;
int max1=0;
char temp1='B';
for(it=mp1.begin();it!=mp1.end();it++){
if(it->second>max1){
max1=it->second;
temp1=it->first;
}
}
参考博客:
https://blog.csdn.net/qq_41531880/article/details/99675709
https://blog.csdn.net/shuzfan/article/details/53115922
https://blog.csdn.net/zhimeng567/article/details/78546199
字符与数字的相互对照,如果确定了字符顺序,可以分别设置字符char数组和乘放对应次数的int数组(一一对应)
参考:1018 锤子剪刀布(20分)中的思路2
11. while(scanf("%d%d",&n,&e)!=EOF)
12.break与continue的区别
break的用法在于此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),不是跳到下一个循环周期而是退出循环。意思就是如果break语句包含在嵌套循环里,它只跳出最里面的循环。
continue的用法是循环语句里有此语句时,程序运行到此语句时,不在执行循环体里continue后面的语句(后面所有)而是跳到下一个循环入口处执行下一个循环。
13.math函数
参考:1091N-自守数(15分)
1.pow(2,3)=8 返回类型是double!
14.C++中不能连写比较符号
if(1<=num[i].k && num[i].k<10)
错误的:if(1<=num[i].k<10)
❌
15.数组反转
reverse()
参考:1086 就不告诉你(15 分)
16.浮点数比较大小
0.前提是保存两位小数
1.判断a是否为0.00
if(fabs(a)<=0.001) printf("0.00");
17.double/int 不同强制类型转换
//double是整型时,输出就是整型,对它格式化,才输出格式化
double c=0;
c++;
cout<<c<<endl;//1
18.字符数组(存数字)想要判断是否满足一定要求,可以通过中间变量temp,转为数字,再通过正确要求传给新的数组,比较两个数组
//将a正确的格式通过中间变量temp传到b
char a[50]="132456.123";
cout<<"a:"<<a<<endl;
double temp;
sscanf(a,"%lf",&temp);
cout<<"temp:"<<temp<<endl;
char b[50];
sprintf(b,"%.2f",temp);
cout<<"b:"<<b<<endl;
19.遍历数字和数字不好比较,转为输入字符串,a.size(), ’ '- '0’还为数字;或者转为字符数组和字符,strlen(a),a[i]==da
20.对于输入输入字符或者数字,计数
pinyin[num[i]-‘0’]++
:数字充当下标,次数为内容
map[c[i]]++
:字符充当键,次数为值
21.判断语句思想
用次数,或者flag等…
先判断特殊情况;
再分别考虑其他情况
22.存储真假值的bool数组,flag标志,temp
可用来判断比较输入的是否已经有了,也可以用int型数组,令其值为1/0.
参考:1072 开学寄语 (20分)
#include<bits/stdc++.h>
using namespace std;
int main(){
bool flag = false;
//如果flag是true(false的值==true)
if(flag){
cout<<flag<<endl;
}
//如果!flag是true(!flag的值==true)
if(!flag){
cout<<"!flag:"<<!flag<<" flag:"<<flag<<endl;
}//1 0
}
23.string不能用printf %s 输出
cout
24.字符串数字相加
string a="123";
string b="321";
int n=stoi(a)+stoi(b);
cout<<n;
25.char[] 和 string不读取空格和换行符
char a[10];
scanf("%s",a);
printf("%s",a);
printf("ddd");
string s;
cin>>s;
cout<<s;
cout<<"dd";
26.结构体字符数组的输入
#include<bits/stdc++.h>
using namespace std;
struct stu {
char name[10];
};
int main(){
stu stu[2];
// for(int i = 0; i < 2; i++){
// cin>>stu[i].name;
// }
// for(int i = 0;i < 2; i++){
// cout<<stu[i].name<<" ";
// }
for(int i = 0; i < 2; i++){
scanf("%s",&stu[i].name);
}
for(int i = 0; i < 2; i++){
printf("%s\n",stu[i].name);
}
}
27.求数字各位之和
#include<bits/stdc++.h>
using namespace std;
int sum(int n){
int c=0;
int temp;
if(n>=0 && n<=9){
return n;
}
else{
while(n%10!=0){
temp=n%10;
c=c+temp;
n=n/10;
}
return c;
}
}
int main(){
int n;
cin>>n;
cout<<sum(n);
}
28.字符(串/数组)输入方式
字符串使用scanf输入方法:
string s1,s2;
int n;
scanf("%s %d, %s",s1.c_str(),&n,s2.c_str());
printf("%s %d %s",s1.c_str(),n,s2.c_str());
char s1[20],s2[20];
int n;
scanf("%s %d, %s",s1,&n,s2);
printf("%s %d %s",s1,n,s2);
字符数组:
char a[20];
cin>>a;
cout<<a;