數組與文字處理
一、
數組
數據集合、元素、下表
文字處理程序處理字符數據
字符編碼
ASCII-英文
字符類型
字符數組
+數組定義
數據類型 數組變量名[表達式....];
+size
sizeof(數據類型名)//計算結果是指定數據類型占用的字節數
或
sizeof(表達式)//計算結果是指定表達式結果類型占用的字節數 表達式可以是單個變量、常量或數組變量,這時sizeof的計算結果就是該變量、常量或數組變量占用的字節數
sizeof(int) sizeof(double)
sizeof(2.0) sizeof(2+3.5)
+訪問數組元素
數組變量名[下標1][下標2]....
+數組的整體輸入與輸出
+數組初始化
int x[3]={2,4,6};
//求數組元素最大值、最小值 #include <isostream> using namespace std; int main() { int x[6]={1,4,6,2,5,3}; int max,min;//定義變量max保存最大值 min保存最小值 max=x[0];min=x[0];//先假設第0個元素就是最大值,也是最小值 for(int n=1;n<6;n++) { if(x[n]>max)max=x[n];//如果x[n]比max大,則這個值是最大值,修改max if(x[n]<min)min=x[n];//如果x[n]比min小,則這個值是最小值,修改min } cout<<"最大值="<<max<<"最小值="<<min<<endl;// return 0; }
+數據排序
二、指針與數組
+通過指針變量間接訪問數組元素
int x[6]={1,4,6,2,5,3};//定義一維數組變量x,並初始化
int p;
p=&x[0];//將指針變量配指向第0個元素,第0個元素的地址是數組的首地址
cout<<p;//通過指針變量p間接訪問第0個元素,顯示結果 1
p=&x[1];
cout<<*p;
+首地址
p=&x[0];//將指針變量p指向數組的首地址
p=x;
+指針變量的算數運算
數組變量在內存中連續存放
int型數組 指針變量p指向下一個數組元素 p+=4;
double型數組: p+=8
+指針變量與整數進行加減運算
表達式p±n 的結果仍為T類型的指針,其地址值等於p的地制指: ±n*sizeof(T)
+同類型指針變量之間相減
表達式p1-p2 的結果為int型,數值等於: (p1-p2)/sizeof(T) //下標的差值
+void型指針
不能參與上述運算
sizeof(void)沒有確切的定義
#include <isostream>
using namespace std;
int main()
{
int x[6]={1,4,6,2,5,3};
int *p,*p1m*p2;
p=&x[0];//將指針變量p指向第0個元素
for(int n=0;n<6;n++)
cout<<*(p+n)<<",";//通過指針變量與整數的算術運算符依次訪問各數組元素
int d;
p1=p+1;//將指針變量p1指向第1個元素
p2=p+4;//將指針變量p2指向第4個元素
d=p2-p1;//指針變量之間的差值等於其所指向數組元素下標之間的差值,即4-1
cout<<d<<endl;//顯示結果為3
return 0;
}
+指針的關系運算
+指針的取內容運算
int x[6]={1,4,6,2,5,3},p=x;
通過指針運算符訪問數組元素
p,(p+1),(p+2)
通過下標運算符[]訪問數組元素
p[0],p[1],p[2]
此時指針相當於數組名
通過數組名訪問數組元素
x[0],x[1],x[2]
x,(x+1),(x+2)
數組名相當於指針
+動態內存分配
針對不確定情況
new delete 運算符
靜態分配 int x;x=10;
++單個變量的動態分配與釋放 :
指針變量名=new 數據類型(初始值);
delete指針變量名;
初始值可省略
計算機執行new運算符時將按照數據類型指定的字節數分配內存空間並初始化,然後返回所分配內存單元的首地址。應當通過賦值語句將該首地址保存到一個預先定義好的同類型指針變量中
執行delete運算符時將按照指針變量中的地址釋放指定的內存單元
int *p;
p=new int;
*p=10;
delete p;
int *p=new int(10);//簡化
++一維數組的動態分配與釋放
指針變量名=new 數據類型[整數表達式];
delete []指針變量名
int *p=new int[5];//動態分配一個int型一維數組變量,包含5個數組元素
*(p+1)=10;//通過指針運算符訪問第1個元素,向其中寫入數據10
//或過下標運算符訪問第一個元素: p[1]=10;
cout<<*(p+1);//通過指針運算符訪問第1個元素,讀出數據10並顯示出來
//或通過下標運算符訪問第一個元素: cout<<p[1];
delete []p;//內存使用完後,用delete運算符釋放該數組變量所分配的內存空間
#include <ostream>
using namespace std;
int main()
{
int N;
cin>>N;
int *p=new int[N];//動態創建包含N個元素的數組,用於保存數列的前N項
p[0]=0;p[1]=1;//指定數列的前2項
int n;
for(n=2;n<N;n++)//使用循環結構計算出剩余的數列項
p[n]=p[n-1]+p[n-2];//每一項等於其前來2項之和
for(n=0;n<N;n++)
{
cout<<p[n]<<",";
if((n+1)%5==0) cout<<endl;
}
delete[]p;//數組使用結束,動態釋放其內存空間
return 0;
}
三、字符類型
+文字處理
字符編碼
字符集
編碼值
ASCII編碼 0-9從小到大;英文字母案字母順序連續編碼;大小寫分別編碼,小寫比大寫大32;0表示一種特殊字符,稱為空字符
+字符類型
字符類型與單字節整數類型合二為一:char ,一個字節
char ch=77;
+字符常量 ‘a‘ ‘A‘ ‘?‘ ‘@‘ ch=‘M‘;等價於ch=77
不可見字符 Esc鍵(27)
使用轉義字符形式 ‘\x1B‘ ‘\33‘
可字符也可以使用轉義的形式來書寫 例如‘M‘(77) 轉義形式 ‘\x4D‘ ‘\115‘
+字符型運算
可以對字符型數據進行算數運算,運算時,將字符的ASCII碼值作為整數參與運算
四、字符數組與文字處理
+字符數組
char str[10]={‘h‘,‘e‘,‘l‘,l‘‘,‘o‘};
+字符串
""
+字符串常量
"hello" "A"
末尾自動加結束標識\0 長度等於字符個數+1
char *p;
p="hello"; 字符串常量賦值給字符型指針變量:字符串在內存中的首地址賦給指針/指針指向字符串的首地址
cout<<"yse\nNo"; 可插入轉義字符
cout<<""yse",‘no‘"; //"yse",‘no‘
初始化
char str[10]={‘h‘,‘e‘,‘l‘,l‘‘,‘o‘};//不初始化默認0
char str[]={‘h‘,‘e‘,‘l‘,l‘‘,‘o‘};
char str[10]="hello";
char str[]="hello";
char str[3][10]={};
+字符數組的整體輸入輸出
可以整體輸入輸出
char str[10];
cin>>str;
cout<<str;
+指針變量的輸出
int x,*p=&x;
cout<<p<<endl;
char str[10]="hello";
char *p=str;
cout<<p<<endl;//顯示 hello
cout<<p+2<<endl;//顯示 llo
cout<<(int *)p<<endl;//顯示p中的地址 強制轉為其他類型
+常用文字處理算法
//檢測有多少非0字符
#include <iostream>
using namespace std;
int main()
{
char str[10]="hello";
int n=0;//定義int型變量n來保存元素下標,初始化為0
while(str[n]!=‘\0‘)
n++;
cout<<n<<endl;
return 0;
}
//字符串插入
#include <iostream>
using namespace std;
int main()
{
char str[10]="helo";
char ch=‘l‘;//插入的字符
char oldch;
int n=2;//在哪個位置插入
do
{
oldch=str[n];//插入前要吧當前位置原來的字符先暫存起來,以便後移
str[n]=ch;//ch保存在當前位置
ch=oldch;//oldch轉存到ch中,算法含義:將當前字符作為下一次循環時
//將插入在下一元素位置的字符,這樣後移操作被轉為在下一位置的插入操作
n++;//轉入下一元素位置,循環做插入操作
}while(ch!=‘\0‘);//如果ch是結束符,則停止循環
str[n]=‘\0‘;//為插入操作後的字符串添加結束符‘\0‘
cout<<str<<endl;
return 0;
}
//字符串拷貝
#include <iostream>
using namespace std;
int main()
{
char str1[10]="hello";
char str2[20];//將str1種的字符串拷貝到str2
//註意 定義str2時的數組長度應大於字符串長度,否則會越界
int n=0;//保存元素下標
while(str1[n]!=‘\0‘)//通過循環結構從第0個元素開始拷貝
{
str2[n]=str1[n];//拷貝第n個元素
n++;//下標加1 繼續拷貝下一個元素
}
str2[n]=‘\0‘;
cout<<str2<<endl;
return 0;
}
五、中文處理
+漢子字符編碼標準 例如GB2312
+中文操作系統 例如中文windows
+處理中文的應用軟件 例如中文word
char str[]="你好,hello";
cout<<str<<endl;
+字符編碼標準
ASCII 單字節字符集
漢子編碼 雙字節字符集
ANSI : 英文+中文、英文+日文 缺陷:前面不能中文+日文
Unicode編碼: 英文+中文+日文+......
數組與文字處理