读书人

可以帮忙解释一上吗

发布时间: 2012-08-14 10:39:57 作者: rapoo

可以帮忙解释一下吗
请补充函数fun(),该函数的功能是:按'0'到'9'统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。
例如:输入"x=112385713.456+0.909*bc",结果为:1=3,3=2,5=2,7=1,9=2。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include<stdlib.h>
#include<stdio.h>
#define N 1000
void fun(char *tt,int num[])
{
int i,j;
int bb[10];
char *p=tt;
for(i=0;i<10;i++)
{
num[i]=0;
bb[i]=0;
}
while(*p)
{
if(*p>='0'&&*p<='9')
bb[*p-'0']++;

p++;
}
for(i=1,j=0;i<10;i=i+2,j++)
num[j] =bb[i];
}
void main()
{
char str[N];
int num[10],k;
system("CLS");
printf("\nPlease enter a char string:");
gets(str);
printf("\n**The original string**\n");
puts(str);
fun(str,num);
printf("\n**The number of letter**\n");
for(k=0;k<5;k++)
{
printf("\n");
printf("%d=%d",2*k+1,num[k]);
}
printf("\n");
}


bb[*p-'0']++;这句是什么意思,它的作用是什么呢?
还有printf("%d=%d",2*k+1,num[k]);中,2*k+1有什么用,为什么要*2呢?谢谢讲解



[解决办法]
bb[*p-'0']中:*p为指针p当前所指向的字符,并且已经判断过了*p>=‘0’&&*p<=‘9’那么以字符的ASSIC进行运算,那么*p-'0'就等于数字字母在bb中的下标。比如bb[0]代表了'0'字母的个数。依次类推。
[解决办法]
bb[*p-'0']中:*p为指针p当前所指向的字符,并且已经判断过了*p>=‘0’&&*p<=‘9’那么以字符的ASSIC进行运算,那么*p-'0'就等于数字字母在bb中的下标。比如bb[0]代表了'0'字母的个数。依次类推。
[解决办法]
bb[*p-'0']++ 就是把*p所表示的数字对应的数量+1

*p-'0'是把*p转换成数组下标,如*p='5', 则*p-'0'=5
[解决办法]
假设输入的字符串是“123”,p已指向该字符串首地址。

bb[*p-'0']++;

顺序是先计算*p,因为*p='1',这是字符串的'1',是ASCII码,数值表示是49。字符'0'的值是48。

再计算*p-'0',*p的值是49,这里就是49-48,结果是1。

再计算b[1]++,到这一步应该看明白了吧。


字符串里面每一个字节,都是用ascii码存的,转换到数组下表0~9,需要一个减法。
[解决办法]
*p 是指针指向位置的值 就例子中应该是个char型值

*p - '0' 意思是求这个char型值与字符‘0’的偏移量,比如若*p==‘5’,则与‘0’的偏移量为5;

bb[*p - '0'] 就是以这个偏移量为下标的数组元素,比如bb[5];

bb[*p-'0']++ 就不用解释了吧,代码是用bb[*p-'0'] 来存储 *p 这个数字出现的次数;

2k+1 表示 奇数,因为题目要求奇数数字字符,但是后面的num[k] 似乎有问题,应该是num[2k+1]对应前面2k+1才对。


[解决办法]
这个地方用的确实很巧。'9' - '0'是下标为9,然后该下标的元素值自增1,即字符为9的统计数自增1.
[解决办法]
类似的用法可以使统计字母出现的次数。用法是一样的。

读书人网 >C语言

热点推荐