一維數(shù)組的定義,、初始化和使用
定義一個一維數(shù)組的格式如下:類型 數(shù)組名[數(shù)組大小];
數(shù)組的下標(biāo)范圍總是從0開始(因此下標(biāo)最大為數(shù)組大小減一),。下面一行語句定義了一個大小為10的長整型數(shù)組:long value[10];
這相當(dāng)于下面的Pascal語句:var value:array[0..9]of longint;
C語言的數(shù)組范圍左端點不能自定義,它的數(shù)組下標(biāo)只能從0開始,。
下面幾種方式可以在定義數(shù)組的同時進(jìn)行初始化:long value[10] = { 0, 8, 2, 0, 3 } ;
long value[10] = { [1]=8, [2]=2, [4]=3 } ;
上面兩個語句是等價的,。其中前一種方法依次對數(shù)組的前5個數(shù)進(jìn)行初始賦值,后一種方法僅對數(shù)組的其中三個位置進(jìn)行初始化,。初始化中沒有涉及到的下標(biāo)所對應(yīng)的數(shù)值自動被設(shè)為0,。
C語言允許數(shù)組的大小為一個變量,但這樣的數(shù)組在定義時不能像上面一樣進(jìn)行初始化,。
這種初始化方法只在定義數(shù)組時用,,不能用于程序中的賦值。數(shù)組之間也不能直接賦值,,你不能把數(shù)組a整個賦值給數(shù)組b,。
程序中使用數(shù)組的方法和Pascal一樣。下面的程序?qū)⑤敵?000以內(nèi)的素數(shù):#include <stdio.h>
#include <stdbool.h>
int main()
{
bool isPrime[1000];
int i,j;
for(i=2;i<1000;i=i+1)
isPrime[i]=true;
for(i=2;i<1000;i=i+1)
{
if (isPrime[i])
{
printf("%d ",i);
for(j=2*i;j<1000;j=j+i)
isPrime[j]=false;
}
}
return 0;
}
當(dāng)一維數(shù)組作為函數(shù)參數(shù)時,,數(shù)組大小可以不寫,,以適應(yīng)不同長度的數(shù)組。通常你還需要另一個參數(shù)告訴函數(shù)你的數(shù)組有多大,。下面這個函數(shù)返回數(shù)組中的最大值:long maxValue ( long length, long array[] )
{
long i, max = 0;
for ( i=0; i<length; i=i+1)
if (array[i]>max) max = array[i];
return max;
}
下面的代碼合法地調(diào)用了上面的函數(shù),。long a[5] = { 1, 5, 7, 3, 4 };
printf( "%d" , maxValue( 5,a ) );
C語言中的字符串
C語言也使用字符數(shù)組作為字符串。定義一個char a[20],,就相當(dāng)于定義了一個長度不超過20的字符串,。Pascal中使用a[0]記錄字符串的長度,字符串內(nèi)容從a[1]開始,;但C語言并不直接記錄字符串長度,,a[0]表示字符串的第一個字符,最后以ASCII碼0(或?qū)懗勺址?\0')標(biāo)記字符串結(jié)尾,。你可以直接將一個字符串賦給字符數(shù)組,,也可以在printf中使用%s標(biāo)識輸出一個字符數(shù)組。記住,,a[2]表示字符串中的第三個字符,因為C的數(shù)組下標(biāo)是從0開始的,。
觀察下列代碼:int i;
char a[20]="";
for (i=0;i<20;i=i+1)
printf("%d ",a[i]);
printf("\n%c\n",a[2]);
printf("%s\n",a);
printf("%16s\n",a);
printf("%.8s\n",a);
printf("%16.8s\n",a);
程序的輸出為:109 97 116 114 105 120 54 55 46 99 111 109 0 0 0 0 0 0 0 0
t
matrix67
matrix67
== 或 + 等運算符對字符串無效,。
下面的函數(shù)返回字符串的字符數(shù):int stringLength( char a[] )
{
int count=0;
while ( a[count] )
count=count+1;
return count;
}
賦值時,如果字符串太長了,,有兩種方法可以讓你分行寫,。一是在行末加一個反斜杠表示和下一行相連,二是每一行都用雙引號注明(編譯器會自動把它連接起來),。下面兩個代碼是等價的,。注意第一個代碼中的第二行必須頂格寫,,否則第二行前面的空格也要算進(jìn)字符串里。char blogTitle[100]="Matrix67: My Blog - 50% Informatics, 50% \
Mathematics, and 50% Imagination";char blogTitle[100]="Matrix67: My Blog - 50% Informatics, 50% "
"Mathematics, and 50% Imagination";
和數(shù)組一樣,,對字符串的賦值只能在定義時使用,,程序中不能這樣做。
多維數(shù)組的定義,、初始化和使用
定義一個多維數(shù)組的格式如下:類型 數(shù)組名[大小1][大小2]...[大小n];
例如,,下面這個語句定義了一個三維數(shù)組:int matrix[100][100][2];
同樣地,每一維的大小都是從0開始算的,。因此上面的語句相當(dāng)于Pascal中的:var matrix:array[0..99][0.99][0..1]of integer;
多維數(shù)組的初始化和一維數(shù)組類似,。例如,我們經(jīng)常需要定義方向常量:const int dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
這還可以直接寫成:const int dir[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 };
多維數(shù)組的初始化同樣是未定義者自動填零,,因此還可以寫成:const int dir[4][2] = { [0][0]=1, [1][1]=1, [2][0]=-1, [3][1]=-1 };
程序中使用多維數(shù)組時必須用多個方括號,,即dir[2][1]不能寫成dir[2,1]。
當(dāng)多維數(shù)組作為函數(shù)的參數(shù)時,,只有第一維的大小可以不寫,。因此,下面的三個函數(shù)中前兩個是合法的,,第三個是不合法的,。long function_1( int m, int n, long a[20][20] );
long function_2( int m, int n, long a[][20] );
long function_3( int m, int n, long a[][] );
為了讓參數(shù)仍然適用于各種大小的數(shù)組,C語言允許這樣定義函數(shù):long function_4( int m, int n, long[m][n] );
例如,,下面的函數(shù)遞歸地計算行列式:long determinant( int n, long a[n][n] )
{
if (n==1) return(a[0][0]);
int i,j,k;
long ans = 0;
long sub[n-1][n-1];
for ( i=0; i<n; i=i+1 )
{
for ( j=1; j<n; j=j+1 )
{
for ( k=0; k<i; k=k+1 )
sub[j-1][k]=a[j][k];
for ( k=i+1; k<n; k=k+1 )
sub[j-1][k-1]=a[j][k];
}
ans = ans + (1-i%2*2)*a[0][i]*determinant(n-1, sub);
}
return ans;
}
下面的代碼片段正確地調(diào)用了上面的函數(shù):long a[4][4]={
{ 1, 4, -1, 4 },
{ 2, 1, 4, 3 },
{ 4, 2, 3, 11 },
{ 3, 0, 9, 2 }
};
printf( "%d" , determinant(4,a) );
結(jié)構(gòu)的定義,、初始化和使用
Pascal中的記錄類型在C語言中叫做“結(jié)構(gòu)”。定義一個結(jié)構(gòu)的方式如下:struct 結(jié)構(gòu)名
{
在此定義若干變量(域)
};
注意花括號后面需要有一個分號,。下面定義一個date結(jié)構(gòu):struct date
{
int year;
short month,day;
};
這樣你就獲得了一個名為struct date的類型名,。和變量的定義一樣,一個結(jié)構(gòu)的定義只能供當(dāng)前函數(shù)(的當(dāng)前語句塊)中后面的部分使用,。因此通常把結(jié)構(gòu)的定義放在所有函數(shù)的前面作為一個全局的定義,。之后,你便可以寫這樣的語句:struct date today;
結(jié)構(gòu)的使用方法同Pascal的記錄類型一樣,。例如,,下面的函數(shù)用于計算某一天是星期幾(Zeller公式):int zeller( struct date t )
{
if (t.month<3)
{
t.year = t.year - 1;
t.month = t.month + 12;
}
int c = t.year / 100;
int y = t.year % 100;
int ans = ( c/4 - 2*c + y + y/4 + (26*(t.month+1))/10 + t.day - 1 ) % 7;
if (ans>0) return ans;
else return ans+7;
}
給一個結(jié)構(gòu)賦初始值和數(shù)組的初始化差不多。下面兩個語句是等價的:struct date myBirthday = { 1988, 5, 16 };
struct date myBirthday = { .year=1988, .month=5, .day=16 };
這種方法也可以用于程序中的賦值操作,,但需要加上一個類型轉(zhuǎn)換(見這里的“名詞動用”一節(jié)),。例如,下面三個代碼片段都是等價的:myBirthday.year = 1988;
myBirthday.month = 5;
myBirthday.day = 16;myBirthday = (struct date){ .year=1988, .month=5, .day=16 };
myBirthday = (struct date){ 1988, 5, 16 };
下面的語句調(diào)用了zeller函數(shù),,輸出自1583年來的每個13日都是星期幾,。和本文無關(guān)的問題:有人知道為什么我從1583年開始算么?int y,m;
for ( y=1583; y<=2000; y=y+1)
for ( m=1; m<=12; m=m+1 )
printf( "%d ", zeller( (struct date){y,m,13} ) );
Matrix67原創(chuàng)
轉(zhuǎn)貼請注明出處