今天看到有位童鞋在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.
用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 }
一开始在家里面有了一点思路,用两重循环。后来真正开始在纸上写代码的时候发现只要一重循环即可。
#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代码,我觉着我的代码显然要好很多:-)