最近準備考研上機複試,刷題的過程中,記錄了一些解題過程中的知識盲區和一些容易犯的錯,踩的坑。
【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;
}
}