7.编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要报告每个字符是否是字母。如果是,还要报告该字母在字母表中的数值位置。例如,c和C在字母表中的位置都是3。合并一个函数,以一个字符作为参数,如果该字符是一个字母则返回一个数值位置,否则返回-1。
int char_is_letter(char ch)
{int pos = -1;if(ch >= 'a' && ch <= 'z')pos = ch - 'a' + 1;else if(ch >= 'A' && ch <= 'Z')pos = ch - 'A' + 1;return pos;
}
int main()
{system("chcp 65001");char ch;while ((ch = getchar()) != EOF){int pos = char_is_letter(ch);if (char_is_letter(ch) != -1){printf("输入的字母是:%c, 在字母表中的位置是%d\n", ch, pos);}else{char printChar[4] = { 0 };if(ch == '\n')sprintf_s(printChar, "\\n");else if(ch == '\r')sprintf_s(printChar, "\\r");else if(ch == '\t')sprintf_s(printChar, "\\t");else if(ch < 32)sprintf_s(printChar, "^%c", ch + 'A');elsesprintf_s(printChar, "%c", ch);printf("输入的%s不是字母!\n", printChar);}}return 0;
}
8.第6章的程序清单6.20中,power()函数返回一个double类型数的正整数次幂。改进该函数,使其能正确计算负幂。另外,函数要处理0的任何次幂都为0,任何数的0次幂都为1(函数应报告0的0次幂未定义,因此把该值处理为1)。要使用一个循环,并在程序中测试该函数。
double power(double x, int n)
{double pow = 1;if (n == 0){if (x == 0)printf("0的0次幂未定义\n");return 1;}else if (n < 0){if (x == 0)return 0;pow = power(1 / x, -n);}elsefor(int i = 0; i < n; i++)pow *= x;return pow;
}
int main()
{system("chcp 65001");printf("%f\n", power(0, 10));printf("%f\n", power(0, 0));printf("%f\n", power(0, -2));printf("%f\n", power(2, 10));printf("%f\n", power(2, -2));
}
9.使用递归函数重写编程练习8。
double power(double x, int n)
{double pow = 1;if (n == 1)return x;if (n == 0){if (x == 0)printf("0的0次幂未定义\n");return 1;}else if (n < 0){if (x == 0)return 0;pow = power(1 / x, -n);}elsepow = x * power(x, n - 1);return pow;
}
int main()
{system("chcp 65001");printf("%f\n", power(0, 10));printf("%f\n", power(0, 0));printf("%f\n", power(0, -2));printf("%f\n", power(2, 10));printf("%f\n", power(2, -2));
}
10.为了让程序清单9.8中的to_binary()函数更通用,编写一个to_base_n()函数接受两个参数,且第二个参数在2~10范围内,然后以第2个参数中指定的进制打印第1个参数的数值。例如,to_base_n(129,8)显示的结果为201,也就是129的八进制数。在一个完整的程序中测试该函数。
void to_base_n(int n, int base)
{int r;r = n % base;if (n >= base)to_base_n(n / base, base);printf("%x", r);
}
int main()
{to_base_n(123456789, 2);printf("\n");to_base_n(123456789, 8);printf("\n");to_base_n(123456789, 10);printf("\n");to_base_n(123456789, 16);printf("\n");
}
11.编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契数。
int Fibonacci(int n)
{if (n == 0)return 0;if (n == 1)return 1;return Fibonacci(n -1) + Fibonacci(n-2);
}
unsigned int Fibonacci(unsigned int n)
{if (n == 0)return 0;if (n == 1)return 1;unsigned int a = 0, b = 1;for (unsigned int i = 0; i < n; i++){int temp = a;a = b;b = temp + b;}return a;
}
int main()
{for (unsigned int i = 0; i <= 10; i++){printf("Fibonacci(%d) is %d\n", i, Fibonacci(i));}return 0;
}