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;
}