今天看到有位童鞋在TopLanguage上面提了個(gè)問(wèn)題:
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
不用編譯器,說(shuō)說(shuō)b里是什么?
其實(shí)這種問(wèn)題在《C專(zhuān)家編程》的P65中的神器解碼環(huán)中有很詳盡的解釋。
在這里首先考察等式左邊的int (*b)[3]
1.最左邊的標(biāo)識(shí)符是b |
表示b是...
|
2.b的左邊是*
|
表明b是指向...的指針
|
3.*的左邊是左括號(hào)
|
左括號(hào)把已經(jīng)處理的部分聲明組合在一起,知道遇見(jiàn)相應(yīng)的右括號(hào)
|
4.(*b)左邊是方括號(hào)
|
表示大小為3的數(shù)組
|
5.剩下的符號(hào)形成基本類(lèi)型int
|
表明b是一個(gè)指針,它指向一個(gè)大小為3的int型數(shù)組。
|
而把a(bǔ)的值賦給b,表明是將b指向a。
之后sagasw給出一個(gè)demo,可以更清楚的了解指針相關(guān)各種。
int main(int argc, char* argv[])
{
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
printf("a %p b %p \n", a, b);
++b;
printf("a1 %p a10 %p a11 %p b %p \n", a[1], &a[1][0], &a[1][1], b);
++b;
printf("a %p b %p \n", a[2], b);
return 0;
}
//輸出漢字
char temp[3];
char c;
temp[0]=getchar();
temp[1]=getchar();
temp[2]='\0';
cout<<temp<<endl;
這道題是很簡(jiǎn)單的一個(gè)題目。我的題目理解稍微有點(diǎn)問(wèn)題,所以花了一些時(shí)間才搞清楚。
還碰巧發(fā)現(xiàn)了一個(gè)討論uva的論壇,很好很強(qiáng)大。就是里面一位老大的一句話讓我豁然開(kāi)朗。
關(guān)鍵在于題目里面關(guān)于word的定義。
A “word” is defined as a consecutive sequence of letters (upper and/or lower case).
Your program should output a word count for each line of input. Each word count should be printed on a separate line.
一開(kāi)始我以為直接判斷scanf(“%s”,s)的次數(shù)就ok。后來(lái)不停地wa。發(fā)現(xiàn)題目里面怎么連did!也算作一個(gè)單詞,不是連續(xù)的字母嗎?
I did! I did! I did taw a putty tat.
比如這個(gè)字符串用我的理解就是應(yīng)該是八個(gè)word。后來(lái)想到,是一開(kāi)始用讀入字符傳的思維導(dǎo)致了我的錯(cuò)誤。這個(gè)題目是一個(gè)字符一個(gè)字符的處理的,并不是一下讀進(jìn)來(lái)一個(gè)字符串然后一個(gè)個(gè)的判斷。
想到這里,我豁然開(kāi)朗。
This is a blog post published via Windows Live Writer.
This is a great tool.
用1,2,3,···,9 組成 3 個(gè)三位數(shù) abc,def和ghi,每個(gè)數(shù)字恰好使用一次,要求abc:def:ghi=1:2:3。輸出所有解。
題目特別寫(xiě)出了提示:不必太動(dòng)腦筋。(其實(shí)這句話讓我現(xiàn)在都不清楚我的解法是不是符合要求......)
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 {
5 int num;
6 char chr;
7 char a[10];
8 char temp[3];
9 char pos;
10 //num*3<=987 所以 num<=329
11 for(num=123;num<=329;num++)
12 {
13 itoa(num,temp,10);
14 strcpy(a,temp);
15 itoa(num*2,temp,10);
16 strcat(a,temp);
17 itoa(num*3,temp,10);
18 strcat(a,temp);//a保存了num以及num*2和num*3組成的字符串
19
20 for(chr='1';chr<='9' && (pos=strchr(a,chr))!=NULL;chr++)
21 ;
22 if(pos!=NULL)
23 printf("%d:%d:%d=1:2:3\n",num,num*2,num*3);
24 }
25 return 0;
26 }
27
今天繼續(xù)讀到了分?jǐn)?shù)化小數(shù)題目,感覺(jué)挺簡(jiǎn)單的一個(gè)問(wèn)題。實(shí)際藏著一個(gè)我并不知道的printf妙用。
輸入正整數(shù)a,b,c,輸出a/b的小數(shù)形式,精確到小數(shù)點(diǎn)后c位。a,b<=10^6,c<=100.例如a=1,b=6,c=4時(shí)應(yīng)輸出0.1667.
printf的特殊用法,對(duì)于m.n的格式可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前邊的*定義的是總的寬度,后邊的定義的是輸出的個(gè)數(shù)。分別對(duì)應(yīng)外面的參數(shù)m和n 。 這種方法的好處是可以在語(yǔ)句之外對(duì)參數(shù)m和n賦值,從而控制輸出格式。 1 #include<stdio.h>
2 int main()
3 {
4 int a,b,c;
5 scanf("%d %d %d",&a,&b,&c);
6 printf("%.*lf",c,(double)a/b);
7 return 0;
8 }
一開(kāi)始在家里面有了一點(diǎn)思路,用兩重循環(huán)。后來(lái)真正開(kāi)始在紙上寫(xiě)代碼的時(shí)候發(fā)現(xiàn)只要一重循環(huán)即可。
#include<stdio.h>
int main()
{
int a[10][10];
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};
int value=1;
int i,j,n,x,y;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
//初始位置為(1,n),初始值為1
x=1;
y=n;
i=0;
a[x][y]=value++;
//循環(huán)結(jié)束的條件為n*n個(gè)值已經(jīng)賦完
while(value<=n*n)
{
//按照當(dāng)前的方向進(jìn)行探測(cè)
x+=dx[i];
y+=dy[i];
//如果符合條件,賦值
if(x>=1 && x<=n && y>=1 && y<=n && a[x][y]==0)
a[x][y]=value++;
//如果不符合條件,把坐標(biāo)退回,方向進(jìn)行逆時(shí)針旋轉(zhuǎn)
else
{
x-=dx[i];
y-=dy[i];
i=(i+1)%4;
}
printf("\nvalue=%d\n",value);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
后來(lái)看到書(shū)上的sample代碼,我覺(jué)著我的代碼顯然要好很多:-)