今天看到有位童鞋在TopLanguage上面提了個問題:
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
不用編譯器,說說b里是什么?
其實這種問題在《C專家編程》的P65中的神器解碼環中有很詳盡的解釋。
在這里首先考察等式左邊的int (*b)[3]
1.最左邊的標識符是b |
表示b是...
|
2.b的左邊是*
|
表明b是指向...的指針
|
3.*的左邊是左括號
|
左括號把已經處理的部分聲明組合在一起,知道遇見相應的右括號
|
4.(*b)左邊是方括號
|
表示大小為3的數組
|
5.剩下的符號形成基本類型int
|
表明b是一個指針,它指向一個大小為3的int型數組。
|
而把a的值賦給b,表明是將b指向a。
之后sagasw給出一個demo,可以更清楚的了解指針相關各種。
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;
這道題是很簡單的一個題目。我的題目理解稍微有點問題,所以花了一些時間才搞清楚。
還碰巧發現了一個討論uva的論壇,很好很強大。就是里面一位老大的一句話讓我豁然開朗。
關鍵在于題目里面關于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.
一開始我以為直接判斷scanf(“%s”,s)的次數就ok。后來不停地wa。發現題目里面怎么連did!也算作一個單詞,不是連續的字母嗎?
I did! I did! I did taw a putty tat.
比如這個字符串用我的理解就是應該是八個word。后來想到,是一開始用讀入字符傳的思維導致了我的錯誤。這個題目是一個字符一個字符的處理的,并不是一下讀進來一個字符串然后一個個的判斷。
想到這里,我豁然開朗。
This is a blog post published via Windows Live Writer.
This is a great tool.
一開始在家里面有了一點思路,用兩重循環。后來真正開始在紙上寫代碼的時候發現只要一重循環即可。
#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++;
//循環結束的條件為n*n個值已經賦完
while(value<=n*n)
{
//按照當前的方向進行探測
x+=dx[i];
y+=dy[i];
//如果符合條件,賦值
if(x>=1 && x<=n && y>=1 && y<=n && a[x][y]==0)
a[x][y]=value++;
//如果不符合條件,把坐標退回,方向進行逆時針旋轉
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;
}
后來看到書上的sample代碼,我覺著我的代碼顯然要好很多:-)
用1,2,3,···,9 組成 3 個三位數 abc,def和ghi,每個數字恰好使用一次,要求abc:def:ghi=1:2:3。輸出所有解。
題目特別寫出了提示:不必太動腦筋。(其實這句話讓我現在都不清楚我的解法是不是符合要求......)
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
今天繼續讀到了分數化小數題目,感覺挺簡單的一個問題。實際藏著一個我并不知道的printf妙用。
輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點后c位。a,b<=10^6,c<=100.例如a=1,b=6,c=4時應輸出0.1667.
printf的特殊用法,對于m.n的格式可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前邊的*定義的是總的寬度,后邊的定義的是輸出的個數。分別對應外面的參數m和n 。 這種方法的好處是可以在語句之外對參數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 }