2
3
4
5
6
7
8
9
10
很快的就到了第三天了,接下來的學(xué)習任務(wù)應(yīng)該越來越重了。至于今天講了些什么,現(xiàn)在想起來也覺得沒有什么似的,可能因為我之前已經(jīng)把這今天所講的內(nèi)容搞懂搞透的原因吧。不過也得把今天的寫下來,也沒有什么特別原因的,想有個回憶吧。
今天所講的都是圍繞著數(shù)組,我們在C語言里定義數(shù)組和其它高級語言定義的不同,這里示出C語言和其它語言的。
C語言 Foxbase
int a[10][10]; dim a(10,10)
是不是符號也不同了,我們以前用慣的都是小括號,但是現(xiàn)在突然來的是中括號真的是有些不習慣呢。但是誰叫我們是學(xué)C語言呢,不習慣都要得習慣了。還記得以前定數(shù)組根本就是不用理會它的地址,只知道用就行了,就算用錯了也會編譯出錯?墒荂語言可不是呢,一但你定義了一個數(shù)組之后,你就得好好的管住它,因為數(shù)組出了邊界是絕對不會通知你的。數(shù)組的定義和調(diào)用方法也是很多,真是靈活多變,這里不再重復(fù)書上里的東西了,F(xiàn)在就定義一個數(shù)組來看看:
int a[10];
如這個表所示,數(shù)組定義之后有相對地址,而且數(shù)組名a就是存放這些地址的首地址,F(xiàn)在我們定義多一個整型指針變量 int *p; ,讓他指向數(shù)組a,p=a; 我們試著讓指針運算遞增一個p++; 我們看到的結(jié)果是p指向了新的地址2003,原來的地址是2001,為什么遞增一個就移向了2003呢?不是2002才是正確的嗎?其實這里就說明了我們定義指針變量為什么要整型呢,是因為所有的指針運算也是看自己本身是什么類型的指針作出什么的運算,就是現(xiàn)在是整型類型,整型數(shù)據(jù)存儲是需要2字節(jié)的,所以針指運算也是按這個方式來到進行,結(jié)果很顯然就是往下移2了。其實這里說這么多,老潭那本書里基本上都有詳細說明介紹,所以我一開始說只要自己有看過書的,應(yīng)該也很容易明白了(反而上面可能給我說模糊了)。
好了,接下來我們做一些題目吧,這是今天老師給我們出的題,其實也是2001年程序員下午考試里出現(xiàn)過的題目。所以請大家自己也動手做做,多思考,看看誰的方法比較好。 在n行n列矩陣中,每行都有最大數(shù),本程序求這幾個最大數(shù)中的最小一個。
#include <stdio.h>
#define N 100
int a[N][N];
void main()
{
int row,col,max,min,n;
/*輸入合法的n和n*n個整數(shù)的代碼, 注,這里略了一部份到后面練習自己做回*/
for(row=0;row<n;row++)
{
for(max=a[row][0],col=1;col<n;col++)
if ( ) max=a[row][col];
if ( ) min=max;
else if ( ) min=max;
。
printf("最大數(shù)中的最小數(shù)為:%d\n",min);
}
這題可真有些難度,它的難就難在第二個空那里,相信第一個空絕大部分都會做,可是第二個空呢,真的下不筆了。當時看程序的最后繼續(xù)兩個空后面的語句為什么一樣的呢,可真的沒有想通,只是要死鉆牛解尖,老是想著一定是用數(shù)組的,第一個循環(huán)里是行,跟著就是列了?墒沁是想不到答案,因為我的思路已經(jīng)大錯特錯了。最后老師還是說出答案,也說這題真的是比較難。第二空其實是填row= =0,為什么這樣填呢,是因為這個矩陣里一開始要有一個BASE數(shù)做底,所以row= =0只出現(xiàn)一次,很自然的就成了第一個比較的基數(shù),跟著這個if語句里的就是比較這幾個最大數(shù)中的最小一個數(shù)了,第二個空填了出來當然答案也就隨之可以出來了max<min。看來我現(xiàn)在功力去考中程還是白費心機吧,因為這只是第一大題啊,有很多難的題都在后幾題。那么既然現(xiàn)在知道自己的弱點就應(yīng)該去好好克服改正它,好了,這只是第一道練習題,跟著下面還有將略了的那部份編出來。
我所寫的如下,因為考慮到整數(shù)類型界限的問題,我所編的所著重這里。
printf("please input n:";
scanf("%d",&n);
for(row=0;row<n;row++)
for(col=0;col<n;col++)
{
do
{
printf("please a[%d][%d]",row,col);
scanf("%d",&a[row][col]);
}while(a[row][col]<-32767 && a[row][col]>32767 );
}
接下的是第二題了,題目如下:
求n*n的對角線和
這題因為全由自己寫,所以各種寫法都有。在下面先寫我的最基礎(chǔ)簡單的方法吧。
#include <stdio.h>
#define n 5
main()
{
int a[n][n];
int row, col;
int sum=0;
/* 輸入略 */
for(row=col=0;row<n;row++,col++)
sum+=a[row][col];
for(row=0,col=n-1;row<n;row++,col--)
sum+=a[row][col];
if ( n%2 !=0)
sum-= a[n/2][n/2];
printf("%d",max);
}
這是最基本的方法了,兩個循環(huán)跟著判斷是否偶數(shù)來減去中間重復(fù)出現(xiàn)的一個數(shù),這樣就求得結(jié)果了
下面我寫一個我同學(xué)編的還比較簡單,而且方法獨到的(反正所有人都沒有想過這種方法,除了他)。這里主要寫一寫他的方法。
int sum=0,j;
for ( j=0; j<n; j++ )
sum+=a[j][j]+a[j][n-1-j];
if ( n%2 !=0 )
sum-=a[n/2][n/2];
夠簡單吧,一次循環(huán)就可以了,他的思路是這樣的,比方有一個如下的矩陣
每次都兩個兩個剛好相對立,所以可以一次就掃描完了。
好了,我寫的有些累了,因為今天沒有什么精神,最后老師還補充了另一個更簡單的,方法其實就是一種只是運用了條件運算符
sum+=a[j][j]+( (j == (n-1-j) ? 0: a[j][n-1-j];
C語言真的想有多簡潔有多簡潔。
轉(zhuǎn)帖于:軟件水平考試_考試吧
- 推薦給朋友
- 收藏此頁
·程序員考試補課筆記-第八天 (2004-12-27 13:29:00)
·程序員考試補課筆記-第七天 (2004-12-27 13:28:00)
·程序員考試補課筆記-第六天 (2004-12-27 13:27:00)
·程序員考試補課筆記-第四天 (2004-12-27 13:26:00)
·程序員考試補課筆記-第二天 (2004-12-26 13:20:00)
如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。