c++注意点(刷题笔记)
C/C++编程注意点
如果在scanf后⽤gets需要注意⼀点,gets是遇到’\n’直接返回,⽽输⼊scanf后回车会将’\n’留在输⼊缓存⾥,
⽽gets正好遇到’\n’就直接返回了,所以你没有机会继续输⼊了。gets 在输⼊的时候,会结束循环。
C 库函数 - gets()
C 标准库 - <stdio.h>
描述
C 库函数 char *gets(char *str) 从标准输⼊ stdin 读取⼀⾏,并把它存储在 str 所指向的字符串中。当读取到换⾏符时,或者到达⽂件末尾时,它会停⽌,具体视情况⽽定。
2.闰年的判断⽅法
year%100==0||year%4==0&&i%100
3.long long 类型的输⼊输出
C:输⼊:scanf("I64d",&I)
输出:printf("I64d",s)
4.c++设置输出的精度问题
⾸先,需要包含头⽂件#include<iomanip>,该头⽂件控制输⼊输出流的格式;
其次:setiosflags(ios::fixed)与后⾯的setprecision(1)连⽤可以控制输出⼩数⼩数点后⾯的位数。
另外,如果在输出的时候设置域宽,则使⽤setw()函数,右对齐。
空出来的部分的填充内容setfill('0')
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
double pi =3.1415926;
cout <<setiosflags(ios::fixed)<<setprecision(2)<< pi << endl;
system("pause");
return0;
}
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
const double value =12.3456789;
cout << value << endl;// 默认以6精度,所以输出为 12.3457
cout<setprecision(4)<< value << endl;// 改成4精度,所以输出为12.35
cout <<setprecision(8)<< value << endl;// 改成8精度,所以输出为12.345679
cout << fixed <<setprecision(4)<< value << endl;// 加了fixed意味着是固定点⽅式显⽰,所以这⾥的精度指的是⼩数位,输出为12.3457
cout << value << endl;// fixed和setprecision的作⽤还在,依然显⽰12.3457
cout.unsetf( ios::fixed );// 去掉了fixed,所以精度恢复成整个数值的有效位数,显⽰为12.35
cout << value << endl;
cout.precision(6);// 恢复成原来的样⼦,输出为12.3457
cout << value << endl;
}
C++ 域宽
需要头⽂件#include <iomanip>
Setw(6)
C语⾔精度问题
%.2d输出整形时最少输出2位,如果不够前⾯以补0占位。如输出2时变成02。200时只输出200;输出浮点型时(%.2f)⼩数点后强制2位输出,
%2d 输出占2个位置,如输出2时,是⼀个空格和2,如200时输出200
%2d是将数字按宽度为2,采⽤右对齐⽅式输出,若数据位数不到2位,则左边补空格
5.abs()函数 abs(x)
1.返回x的绝对值。
2.x为数字型表达式
3.返回值为数字
不同类型的数据使⽤不同类型的绝对值函数:
整型:
int abs(int i) //返回整型参数i的绝对值
复数:
double cabs(struct complex znum) //返回复数znum的绝对值
双精度浮点型:
double fabs(double x) //返回双精度参数x的绝对值
长整型:
long labs(long n) //返回长整型参数n的绝对值
6.%s
在使⽤scanf()函数输⼊字符串的时候,地址列表直接写字符数组的名字。
输出字符数组的时候,printf()函数中的输出项是字符数组名,不是数组元素名。
利⽤%s输⼊字符串不能接收空格,c语⾔规定,scanf()函数遇到空格或回车就结束本次输⼊。
7.数组
定义数组时不能使⽤变量。
下列定义⽅法不能允许:
int n;
scanf("%d",&n);
int a[n];
8.将字符型转换为整型的办法
1)减去⼀个‘0’
2)减去⼀个48
9.strlen 和sizeof 的区别
1)strlen 是函数 ,sizeof是运算符。
2) strlen 是测量的是字符的实际长度,以‘\0’结束。⽽sizeof测量的是字符的分配⼤⼩(存储空间)。
10.在进⾏次⽅运算时,使⽤pow()函数。
并且要使⽤#include <math.h>作头⽂件。
11.定义字符串类型,不⽤为它指定分配空间的⾸地址。
12.⼆进制转⼋进制(取三合⼀)
⽅法为:3位进制数按权展开相加得到1位数⼋进制数(注意事项: 3位⼆进制转成⼋进制是从右到左开始转换,不⾜时补0)13.⼆进制转⼗六进制(取四合⼀)
4位⼆进制转成⼗六进制是从右到左开始转换的,不⾜时补0.
14. i&1
当⼀个数是奇数时,返回1
是偶数时,返回0
15. int , float , double , long , long long , usigned 的取值范围
int:4byte =32 bit有符号signed范围:2^31-1~-2^31即:2147483647~-2147483648⽆符号unsigned范围:2^32-1~0即:4294967295~0 long:4 byte =32 bit同int型
double:8 byte =64 bit范围:1.79769e+308~2.22507e-308
long double:12 byte =96 bit范围:1.18973e+4932~3.3621e-4932
float:4 byte =32 bit范围:3.40282e+038~1.17549e-038
long long的最⼤值:9223372036854775807(>10^18)
long long的最⼩值:-9223372036854775808
unsigned long long的最⼤值:18446744073709551615
__int64的最⼤值:9223372036854775807
__int64的最⼩值:-9223372036854775808
unsigned __int64的最⼤值:18446744073709551615
16.sort()函数
1、头⽂件:#include<algorithm>
2、时间复杂度:类似于快排,为nlog(2)n,效率较⾼
3、sort函数有三个参数:
(1)要排序数组的起始地址
(2)要排序数组的最后⼀个数据元素的下⼀个地址
(3)排序⽅法,如果没有排序⽅法的话,默认从⼩到⼤排序
1.sort函数实现数的排序
system的头文件
sort(arr,arr+10,cmp);
2、sort函数实现字符串的排序(根据长度,字母顺序两种情况)
(1)sort函数对string内的字符进⾏排序(string为字符串类型数据)
sort(s.begin(),s.end());///从⼩到⼤
cout<<s<<endl;
sort(s.begin(),s.end(),cmp);///从⼤到⼩
cout<<s<<endl;
(2)sort对⼀维字符数组内的字符进⾏排序
sort(s.begin(),s.end());///从⼩到⼤
cout<<s<<endl;
sort(s.begin(),s.end(),cmp);///从⼤到⼩
cout<<s<<endl;
(3)sort对string类型的数组按照字典序排序
sort(s,s+12);///字符串默认按照字典序从⼩到⼤排序,数默认按照⼤⼩从⼩到⼤排序
sort(s,s+12,cmp);///按照字典序从⼤到⼩排序
(4)sort对char类型的⼆维数组进⾏字典序排序
错误,不能这样做。同样也不能进⾏根据字符串长度的排序. 解决⽅法有:1、使⽤qsort 2、改⽤string
(5)sort对string类型的数组根据长度进⾏排序
sort(s,s+12,cmp1);///按照长度从⼩到⼤排序
sort(s,s+12,cmp2);///按照长度从⼤到⼩排序
6、对结构体数组进⾏排序(根据结构体中的某元素)
sort(stu,stu+n,cmp);
sort(begin, end, cmp),其中begin为指向待sort()的数组的第⼀个元素的指针,end为指向待sort()的数组的最后⼀个元素的下⼀个位置的指针,cmp参数为排序准则,如果没有的话,默认以⾮降序排序。
以int为例的基本数据类型的sort()使⽤
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[5]={1,3,4,2,5};
sort(a, a +5);
for(int i =0; i <5; i++) cout << a[i]<<' ';
return0;
输出结果为:12345
⾃定义cmp参数
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x > y;
}
int main(){
int a[5]={1,3,4,2,5};
sort(a, a +5, cmp);
for(int i =0; i <5; i++) cout << a[i]<<' ';
return0;
}
输出结果为:54321
17. unique函数
在STL中unique函数是⼀个去重函数, unique的功能是去除相邻的重复元素(只保留⼀个),其实它并不真正把重复的元素删除,是把重复的元素移到后⾯去了,然后依然保存到了原数组中,然后 返回去重后最后⼀个元素的地址,因为unique去除的是相邻的重复元素,所以⼀般⽤之前都会要排⼀下序。
注意,words的⼤⼩并没有改变,依然保存着10个元素;只是这些元素的顺序改变了。调⽤unique“删除”了相邻的重复值。给“删
除”加上引号是因为unique实际上并没有删除任何元素,⽽是将⽆重复的元素复制到序列的前段,从⽽覆盖相邻的重复元素。unique返回的迭代器指向超出⽆重复的元素范围末端的下⼀个位置。
注意:算法不直接修改容器的⼤⼩。如果需要添加或删除元素,则必须使⽤容器操作。
个⼈感觉,unique是STL中很实⽤的函数之⼀,需要#include <algorithm>,下⾯来简单介绍⼀下它的作⽤。
unique的作⽤是“去掉”容器中相邻元素的重复元素,这⾥去掉要加⼀个引号,为什么呢,是因为它实质上是⼀个伪去除,它会把重复的元素添加到容器末尾,⽽返回值是去重之后的尾地址(是地址!!),举个例⼦:
1.int num[10]={1,1,2,2,2,3,4,5,5,5};
2.int ans=unique(num,num+10)-num;
3.
所以要将unique()后的函数,⽤unique的返回值去减去⾸地址。就可输出去重之后的值了。
18.c++ line() getline()的⽤法
⼀、cin>>
⽤法1:输⼊⼀个数字或字符
⽤法2:接收⼀个字符串,遇“空格”、“TAB”、“回车”就结束
⼆、line()
⽤法:接收⼀个字符串,可以接收空格并输出
#include<iostream>
using namespace std;
main()
{
char m[20];
cout<<m<<endl;
}
接收5个字符到m中,其中最后⼀个为'\0',所以只看到4个字符输出;
延伸:
1、line()实际上有三个参数,line(接收字符串的变量,接收字符个数,结束字符)
2、当第三个参数省略时,系统默认为'\0'
3、如果将例⼦中line()改为line(m,5,'a');当输⼊jlkjkljkl时输出jklj,输⼊jkaljkljkl时,输出jk。
三、getline()
⽤法:接收⼀个字符串,可以接收空格并输出,需包含“#include <string>”
#include<iostream>
#include<string>
using namespace std;
main()
{
string str;
getline(cin,str);
cout<<str<<endl;
}
四、注意的问题
1、line()属于istream流,⽽getline()属于string流,是不⼀样的两个函数
2、当同时使⽤cin>>,getline()时,需要注意的是,在cin>>输⼊流完成之后,getline()之前,需要通过
⽅法⼀:str="\n"; getline(cin,str);
⽅法⼆:cin.clear(); cin.sync();
的⽅式作为输⼊流cin以清除缓存,如果不这样做的话,在控制台上就不会出现getline()的输⼊提⽰,⽽直接跳过,因为程序默认地将之前的变量作为输⼊流。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string s1; string s2;
cin>>s1;
cout <<"s1 is :"<< s1 << endl;
getline(cin, s2); cout <<"s2 is :"<< s2 << endl;
system("pause");return0;
}
#include<iostream>
#include<string>
#include<sstream>using namespace std;
int main(){
string s1;
string s2;
cin>>s1;
cout <<"s1 is :"<< s1 << endl;
cin.clear();cin.sync();getline(cin, s2); cout <<"s2 is :"<< s2 << endl;system("pause");
return0;
}
C语⾔清除缓存fflush(stdin);//清除缓冲区
19. while(scanf("%s", map[r]) != EOF)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。