最近准备考研上机复试,刷题的过程中,记录了一些解题过程中的知识盲区和一些容易犯的错,踩的坑。
【1】string中+操作不能对整型进行运算。
int i=100;
string str="成绩为:";
string str2;
str2=str+i;//(x) 期望实现 str2="成绩为:100"
cout<
这样明显行不通,C语言中整型变量不能直接和字符串相加(Java中字符串String有这样的语法糖可以直接相加),如何把整型变量转换成字符串后再与另一个字符串相加?
#include
......
int a=125;
char b[50];
printf("%s\n",itoa(a,b,10));//把10进制的125转成字符并输出。
函数原型:
char*itoa(int value,char*string,int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等
使用itoa需要导入#include
【2】外挂,sort 函数
sort函数是排序函数,功能十分强大,算的上是外挂,如何具体使用可以搜一下
#include;
using namespace std ;
我 们 在 头 文 件 方 面 包 含 了algorithm 头文件,并使用 using namespace std 语句声明了我们将会使用标准命名空间(sort 被定义在其中);
【3】cout输出控制
cout输出精度用于浮点数输出,包括float和double类型。
要控制输出精度,需要引用头文件iomanip,并使用setiosflags(ios::fixed);以及使用setprecision()来设置显示的小数位数。
使用方法见示例代码:
#include
#include
using namespace std;
int main()
{
double f = 3.1415926535;
cout << f << endl; // 3.14159默认六位有效数字。
cout <//只有在这项设置后,setprecision才是设置小数的位数。
cout << setprecision(0) << f << endl; //输出0位小数,3
cout << setprecision(1) << f << endl; //输出1位小数,3.1
cout << setprecision(2) << f << endl; //输出2位小数,3.14
cout << setprecision(3) << f << endl; //输出3位小数,3.142
cout << setprecision(4) << f << endl; //输出4位小数,3.1416
return 0;
}
【4】str[i]!=0和 str[i]!=’\0’的区别和用法
源程序:计算字符串长度
#include
void main()
{
char str[ 80];
int i,len;
scanf("%s",str);
len=0;
for (i=0;str[i]!='\0';i++)
len++;
for (i=0;str[i]!=0;i++)
putchar(str[i]);
printf("strlenth=%d\n",len);
}
把NULL也放进来一起说说。
‘\0’、0、NULL这三者的真值都是0,没有任何区别。之所以有三种写法,完全是为了程序的阅读:
当用’\0’时表示是在操作一个字符串的结束符,比如ch!=’\0’;用NULL时常常是在将一个指针置为“空”指针,比如int *p=NULL;而0自然是数字0了,如int c=0。
【5】scanf,gets,getline的使用区别
如果你用scanf()函数的话,遇到空格会返回;
如果你用gets()函数的话,遇到空格就不会返回了,遇到回车才返回;
gets()格式:
char *p;
gets(p);
那么字符串就以p为首地址存放,记得给p分配足够的空间就好。
例子:
char str[20]; // 定义一个字符数组,大小为20个字节
gets(str); // 将用户输入的字符串(可以包含空格)存储到字符数组str中,以回车结束输入
printf("%s", str); // 输出用户输入的字符串(包含空格)
c++ string
string str;
getline(cin,str)//读取一行以回车为结束
【6】不同类型的变量没法放在for循环中一起初始化
//eg1 (x)
int i;double j;
for(i=0,j=1;i<10;i++;j--)//j i不同类型
{
//......
}
//eg2(x)//j i不同类型
for(double i=0,int j=1;i<10;i++;j--)
{
//......
}
【7】如何自动完成测试数据的输入
freopen("a.txt","r",stdin);
//以a.txt文件作为输入流;当前项目同一个目录下的a.txt
【8】字符比较转换判断查找函数库
ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节(Byte)字符,也支持宽字符。
isalpha
函数名称: isalpha
函数原型: int isalpha(char ch);
函数功能: 检查ch是否是字母.
函数返回: 是字母返回非0(在vs2015中为2) ,否则返回 0.
isdigit
函数名称: isdigit
函数原型: int isdigit(char ch);
函数功能: 检查ch是否是数字(0-9)
函数返回: 是返回非0,否则返回0
islower
函数名称: islower
函数原型: int islower(int ch);
函数功能: 检查ch是否小写字母(a-z)
函数返回: 是返回非0,否则返回0
isupper
函数名称: isupper
函数原型: int isupper(int ch);
函数功能: 检查ch是否是大写字母(A-Z)
函数返回: 是返回非0,否则返回0
isalnum
函数名称: isalnum
函数原型: int isalnum(int ch);
函数功能: 检查ch是否是字母或数字
函数返回: 是字母或数字返回非0,否则返回0
链接:http://baike.baidu.com/link?url=UJCJrGBrFwCil15bQbEBbpovyLBdOjVBTXi7JFoVSKqrza9NdI4ovoCZbmngLhSh4_5fwg-gWZHhOud9Hqm0Pq
【9】数学公式
大多数矩阵函数都只对方阵进行定义,A^0也是如此
对于n阶方阵A而言,不论A是否为零,A^0都定义成n阶单位阵
重视余数的性质:
(a+b)%m = (a%m+b%m)%m
a*b%c=((a%c)*b)%c
a^b%c=(a%c)^b%c
整数a,b最大公约数
a,b最大的公约数=b,a%b的最大公约数
整数a,b最小公约数
a,b最小的公约数=a*b/(a,b最大的公约数)
#include
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
int temp=a*b;
for(;b;)
{
a=b;
b=a%b;
}
cout<//最大公约数
cout<//最小公约数
}
}
【10】~scanf(“%d”, &a)
while(~scanf(“%d”, &a))
这个相当于scanf(“%d”,&a) != EOF
EOF一般定义的是-1
而-1按位取反(~)就是0。
【11】取值范围
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
【12】运算符含义描述
& 按位与: 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或: 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或: 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反: ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移: 用来将一个数的各二进制位全部左移N位,右补0
>> 右移: 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
【13】数组是不可以整体赋值的
数组是不可以整体赋值的,只能初始化时统一赋值为如int data[3]={0,1,2};(如果不进行赋值的话、系统会自动把他们初始化为0,(如果是字符型数组则初始化为’\0’,如果是指针数组,则初始化为NULL,即空指针))
但常常需要用到数组的赋值,以避免写循环。这能否做到?
C语言中能赋值的只有变量,只要让数组变量化,变量赋值时岂不捎带将数组完成了赋值?!
能含有数组的类型只有结构体。于是可以:
struct name
{
int array[10];
}a, b;
于是,在a = b;时就完成了数组的赋值。
【14】分解质因数的方法
#include
using namespace std;
int main()
{
int n;
int count;
while(cin>>n)
{
count=0;
for(int i=2;n!=1;i++)
if(n%i==0)
{
cout<" ";
n=n/i;
count++;
i--;
/*i--和i++使得i的值不变,即能把N含有的所有的当前质因数除尽,
例如:24会一直把2除尽再去除3*/
}
cout<<"\ntotal: "<