- update test -- test (2009-11-23 20:22:38)
Exercise 2-1.Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main(){
char a = 0;
short c = 0;
int e = 0;
long g = 0L;
int i;
puts("<from limits.h>");
printf("char_MAX : %d, char_MIN : %d¥n",CHAR_MAX,CHAR_MIN);
printf("unsigned_char_MAX : %u¥n", UCHAR_MAX);
printf("int_MAX : %d, int_MIN : %d¥n",INT_MAX, INT_MIN);
printf("unsgined_int_MAX : %u¥n", UINT_MAX);
printf("long_MAX : %ld, long_MIN : %ld¥n", LONG_MAX, LONG_MIN);
printf("unsigned_LONG_MAX : %lu¥n", ULONG_MAX);
puts("<by computation>");
printf("char_SIZE %d bit¥n", (int)sizeof(a) * 8 );
printf("char_MAX : %d, char_MIN : %d¥n", a | 0x7F, ~(a | 0x7F));
printf("unsigned_char_MAX : %u¥n", a | 0xFF);
printf("short_SIZE : %d bit¥n", (int)sizeof(c) * 8);
printf("short_MAX : %d, short_MIN : %d¥n", c | 0x7FFF, ~(c | 0x7FFF));
printf("unsigned_short_MAX : %u¥n", c | 0xFFFF);
printf("int_SIZE %d bit¥n", (int)sizeof(e) * 8 );
printf("int_MAX : %d, int_MIN : %d¥n", e | 0x7FFFFFFF, ~(e | 0x7FFFFFFF));
printf("unsgined_int_MAX : %u¥n", e | 0xFFFFFFFF);
printf("long_SIZE : %d¥n", (int)sizeof(g) * 8);
printf("long_MAX : %ld, long_MIN : %ld¥n", g | 0x7FFFFFFFFFFFFFFF, ~(g | 0x7FFFFFFFFFFFFFFF));
printf("unsignded_long_MAX : %lu¥n", g | 0xFFFFFFFFFFFFFFFF);
printf("float_MAX : %e, float_MIN : %e¥n", FLT_MAX, FLT_MIN);
}
Exercise 2-2.Write a loop equivalent to the for loop above without using && or || .
i = 0;
while(1){
if(i >= lim-1){
if((c = (getchar() != '¥n'){
if(c != EOF){
s[i++] = c;
}else break;
}else break;
}else break;
}
Exercise 2-3.Write the function htoi(s) , which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F .
#include<stdio.h>
int htoi(char s[]){
int i;
int result = 0;
for(i = 2; s[i] != '¥0'; i++){
if(s[i] >= '0' || s[i] <= '9'){
result <<= 4;
result += s[i] - 48;
// printf("%d ¥n ", result);
}
else if(s[i] >= 'a' || s[i] <= 'f' || s[i] >= 'A' || s[i] <= 'F'){
result <<= 4;
switch(s[i]){
case 'a' :
case 'A' :
result += 10;
break;
case 'b' :
case 'B' :
result += 11;
break;
case 'c' :
case 'C' :
result += 12;
break;
case 'd' :
case 'D' :
result += 13;
break;
case 'e' :
case 'E' :
result += 14;
break;
case 'f' :
case 'F' :
result += 15;
break;
}
}
}
return result;
}
int main(int argc, char *argv[]){
if(argc <= 1){
puts("please input the hex-number with formatting 0x??, or 0X???");
exit(1);
}
if(argc != 2){
puts("too many argments");
exit(1);
}
if( argv[1][0] != '0' || (argv[1][1] != 'x' && argv[1][1] != 'X')){
puts("please input like follwing format. 0x??, or 0X??");
exit(1);
}
int result = htoi(argv[1]);
printf("hex-num %s is converted to %d¥n", argv[1], result);
}
Exercise 2-4.Write an alternate version of squeeze(s1,s2) that deletes each character in the string s1 that matches any character in the string s2 .
#include<stdio.h>
char *squeeze(char s1[], char s2[]){
int i,j,k,l;
for(i = 0; s2[i] != '¥0'; i++){
k = 0;
for(j = 0; s1[j] != '¥0'; j++){
if( s1[j] != s2[i]){
s1[k++] = s1[j];
}
else{
for(l = j; s1[l] != '¥0'; l++){
s1[l] = s1[l+1];
}
j--;
}
}
}
s1[k] = '¥0';
return s1;
}
int main(int argc, char *argv[]){
if(argc <= 1){
puts("please input like following format, ./a.out s1 s2 ,replace s1,s2 arbitrary");
exit(1);
}
if(argc >= 4){
puts("too many arguments");
exit(1);
}
printf("your input ¥n s1: %s¥n s2: %s¥n", argv[1], argv[2]);
char *result = squeeze(argv[1], argv[2]);
printf("removed string : %s ¥n", result);
}
Exercise 2-5.Write the function any(s1,s2) , which returns the first location in the string s1 where any character from the string s2 occurs, or -1 if s1 contains no characters from s2 . (The standard library function strpbrk does the same job but returns a pointer to the location.)
#include<stdio.h>
#define MAX_CHAR 10000
int any(char s1[], char s2[]){
int candidates[MAX_CHAR] = {0};
int i,j,k = 0,l;
int first_check = 1;
for(i = 0; s2[i] != '¥0' ; i++){
if(first_check){
for(j = 0; s1[j] != '¥0'; j++){
if(s1[j] == s2[i])
candidates[k++] = j;
}
first_check--;
candidates[k] = -1;
}
else
for(j = 0; candidates[j] != -1; j++){
if(s1[candidates[j]+i] != s2[i]){
for(l = j; candidates[l] != -1; l++){
candidates[l] = candidates[l+1];
}
j--;
}
}
}
return candidates[0]+1;
}
int main(int argc, char *argv[]){
int result;
if(argc <= 1){
puts("please input like following format, ./a.out s1 s2 ,replace s1,s2 arbitrary");
exit(1);
}
if(argc != 3){
puts("please input properly");
exit(1);
}
printf("your input ¥n s1: %s¥n s2: %s¥n", argv[1], argv[2]);
if(result = any(argv[1], argv[2]))
printf("the placee of the word you chosed : %d ¥n", result);
else
puts("-1");
}
Exercise 2-6.Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.
Exercise 2-7.Write a function invert(x,p,n) that returns x with the n bits that begin at position p inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.
Exercise 2-8.Write a function rightrot(x,n) that returns the value of the integer x rotated to the right by n bit positions.
Exercise 2-9.In a two's complement number system, x &= (x-1) deletes the rightmost 1-bit in x . Explain why. Use this observation to write a faster version of bitcount .
Exercise 2-10.Rewrite the function lower, which converts upper case letters to lower case, with a conditional expression instead of if-else .
最終更新:2009年12月05日 03:06