您的位置:首页 > 其它

The C programing language 第三章课后题

2016-04-06 14:45 218 查看
#include <stdio.h>
#include "chap1.c"
/*这个是上一章的课后题,里面的函数,刚好这次需要,但是需要把chap1.c 中的main方面注释掉
因为,c语言中,一个文件中只能有一个main方法
*/
#include "chap2.c" /* chap2.c 是第二章的课后题 里面有的函数,这里需要使用使用 */
#define abs(x) ((x)<0?-(x):(x))
/* 注意这里只是abs() 进行替换,如果看不懂可以看看这个 http://blog.csdn.net/li740207611/article/details/51074103  */
/*
3-3 : expand(s1,s2)
*/
int is_digit_letter(int c)
{
if(c >= 'a' && c <= 'z')
return 1;
else if(c >= '0' && c <= '9')
return 1;
return 0;
}
int  expand_s2(char s2[], int start_point, int start, int end)
{
while(start <= end)
s2[start_point++] = start++;
s2[start_point] = '\0';
return start_point;  //return s2 length
}
void expand(char s1[], char s2[])
{
int i ,start , end;
int index = 0;
(s1[0] == '-')?(i=1,s1[0]='a'):(i=0);
while(s1[i] != '\0')
{
if(is_digit_letter(s1[i])==1 && s1[i-1]=='-')
{
end = s1[i];
printf("end :  %c :  %d \n ", end, end);
index = expand_s2(s2, index, start, end);
printf("index :  %c :  %d \n ", index, index);
if(s1[i+1] == '-')
{
start = ++end;
printf("start : %c :  %d \n ", start, start);
}
}
else if(is_digit_letter(s1[i]))
{
start =s1[i];
printf("start : %c :  %d \n ", start, start);
}
i++;
}
}
/*
看完答案之后,修改如下
*/
void expand_(char s1[], char s2[])
{
char c;
int i, j;

i = j = 0;

while((c=s1[i++]) != '\0')
{
if(is_digit_letter(c) && s1[i] == '-' && s1[i+1] >= c)
{
i++;
while(c <= s1[i])
s2[j++] = c++;
(s1[i+1] == '-')?(j--):' '; //处理 a-b-g ,重复出现b这种情况
}
}
s2[j] = '\0';

}
/*
test_expand function:
evaluating  the expand function
*/
void test_expand()
{
char s1[] = "a-z";
char s2[] = "a-c-g";
char s3[] = "a-c0-9";
char s4[] = "-a-c-g";
char s5[50];
expand_(s1,s5);
printf("%s \n",s5);
expand_(s2,s5);
printf("%s \n",s5);
expand_(s3,s5);
printf("%s \n",s5);
expand_(s4,s5);
printf("%s \n",s5);
}
/* 3-4
首先,我们知道,有符号char 的取值范围: -128 到 127
同样的有符号的 int 取值范围是: 2^(sizeof(int)*8-1) 到 2^(sizeof(int)*8-1)-1
这个时候 : 2^(sizeof(int)*8-1) 这个值,在计算机输出的时候是一个负值,这个是最大负值
其实在补码表示的时候,他的补码和反码一样,举个例子char -128 补码 反码都是 1000 0000
所以,假如我们要把最大负数,转成字符串输出,就不能直接对n进行 n=-n 赋值操作,这样的操作
计算的结果肯定有问题,我们把n=-n 赋值操作,间接的放到处理数据的过程中去,这样就不存在
最大值的问题,因为处理数据的过程中,结果范围是 0-9
itoa : convert n to characters in s
and can handle the largest negative numbner
n = -2^(wordsize-1),regardless of the machine on which it runs*/
void itoa(int n, char s[])
{
int sign, i;
i = 0;
sign = n;
do
{
s[i++] = abs(n%10) + '0';
}while(n /= 10);
(sign<0)? (s[i++] = '-'):' ';
s[i] = '\0';
reverse(s,_strlen(s));

}
/*
test_itoa
evaluating the brove of function
*/
void test_itoa()
{
char s[100];
int n = power(2,sizeof(int)*8-1);
printf("%d \n",n);
itoa(n,s);
printf("%s \n",s);

n = 0;
printf("%d \n",n);
itoa(n,s);
printf("%s \n",s);

n = 23;
printf("%d \n",n);
itoa(n,s);
printf("%s \n",s);

}
/*
3-5
itob function : converts the integer n into a base b character representation in the string s
*/
void itob(int n, char s[], int b)
{
int i = 0;
int sign = n;
int temp;
do{
temp = abs(n%b);
s[i++]= (temp >9)? (temp+55): (temp+'0');
}while(n /= b);

(sign < 0)? (s[i++]='-'): ' ';
s[i] = '\0';
reverse(s,_strlen(s));

}
void test_itob()
{
char s[55];
itob(18, s, 10);
printf("%s \n",s);
itoa(18, s);
printf("%s \n",s);

itob(18, s, 16);
printf("%s \n",s);
itob(-18, s, 8);
printf("%s \n",s);

itob(255, s, 16);
printf("%s \n",s);
}
/*
itoa : convert n to characters in s
and can handle the largest negative numbner
n = -2^(wordsize-1),regardless of the machine on which it runs
minwidth is the least width of s that must be padded with blanks
on the left if necessary to make it wide enough
*/
void itoa_three(int n, char s[], int minwidth)
{
int sign, i;
i = 0;
sign = n;
do
{
s[i++] = abs(n%10) + '0';
}while(n /= 10);
(sign<0)? (s[i++] = '-'):' ';

while(i < minwidth)
s[i++] = ' ';
s[i] = '\0';
reverse(s,_strlen(s));

}
/*
test_itoa
evaluating the brove of function
*/
void test_itoa_three()
{
char s[100];
int n = power(2,sizeof(int)*8-1);
printf("%d \n",n);
itoa_three(n, s,1);
printf("%s \n",s);

itoa_three(n, s, 38);
printf("%s \n",s);
}

main()
{

test_itoa_three();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: