C/C++的一些知识点归纳(一)

最近准备考研上机复试,刷题的过程中,记录了一些解题过程中的知识盲区和一些容易犯的错,踩的坑。
【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: "<

你可能感兴趣的:(C-C++心得)