C/C++的一些知識點歸納(一)

最近準備考研上機複試,刷題的過程中,記錄了一些解題過程中的知識盲區和一些容易犯的錯,踩的坑。
【1】string中+操作不能對整型進行運算。

int i=100;
string str="成績爲:";
string str2;
str2=str+i;//(x) 期望實現 str2="成績爲:100"
cout<<str2;

這樣明顯行不通,C語言中整型變量不能直接和字符串相加(Java中字符串String有這樣的語法糖可以直接相加),如何把整型變量轉換成字符串後再與另一個字符串相加?

#include <stdlib.h>
    ......

    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 <stdlib.h>
【2】外掛,sort 函數
sort函數是排序函數,功能十分強大,算的上是外掛,如何具體使用可以搜一下

 #include<algorithm>;
 using namespace std ;

我 們 在 頭 文 件 方 面 包 含 了algorithm 頭文件,並使用 using namespace std 語句聲明瞭我們將會使用標準命名空間(sort 被定義在其中);
【3】cout輸出控制
cout輸出精度用於浮點數輸出,包括float和double類型。
要控制輸出精度,需要引用頭文件iomanip,並使用setiosflags(ios::fixed);以及使用setprecision()來設置顯示的小數位數。

使用方法見示例代碼:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    double f = 3.1415926535;
    cout << f << endl; // 3.14159默認六位有效數字。
    cout <<setiosflags(ios::fixed);  //只有在這項設置後,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<sudio.h>
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<iostream>
using namespace std;
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        int temp=a*b;
        for(;b;)
        {
            a=b;
            b=a%b;
        }
        cout<<a<<endl; //最大公約數 
        cout<<temp/a<<endl;//最小公約數 
    }
}

【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<iostream>
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<<i<<"  "; 
                n=n/i;
                count++; 
                i--;
                /*i--和i++使得i的值不變,即能把N含有的所有的當前質因數除盡,
                例如:24會一直把2除盡再去除3*/
            }
        cout<<"\ntotal: "<<count<<endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章