C Primer Plus(第6版)第九章程式設計練習答案
阿新 • • 發佈:2018-12-13
9.11程式設計練習
/*
PE 9-1
設計一個函式min(x, y),返回兩個double型別值的較小值,在一個簡單的驅動程式中測試該函式
*/
#include <stdio.h>
double min(double a, double b);
int main(void)
{
printf("The min number between 1 and 5 is %.2f \n", min(1.0, 2.0));
return 0;
}
double min(double a, double b)
{
return a <= b ? a : b;
}
/*
PE 9-2
設計一個函式chline(ch, j, i),列印指定的字元j行i列(書又翻譯錯了)
原文that prints the requested character in columns i through j .
在一個簡單的驅動程式中測試該函式。
*/
#include <stdio.h>
void chline(char ch, int row, int col);
int main(void)
{
chline('*', 3, 5);
return 0;
}
void chline(char ch, int row, int col)
{
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++)
putchar(ch);
putchar('\n');
}
return;
}
/*
PE 9-3
編寫一個函式,接受三個引數,一個字元和兩個整數。
字元引數是待列印的字元,第1個整數指定一行中列印字元的次數,
第2個整數指定列印指定字元的行數。編寫一個呼叫該程式的函式。
注意:第1個引數是列數,第2個引數是行數
*/
#include <stdio.h>
int main(void)
{
print_ch('#', 3, 4);
return 0;
}
void print_ch(char ch, int col, int row)
{
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++)
putchar(ch);
putchar('\n');
}
return;
}
/* EP 9-4 兩數的調和平均數這樣計算:先得到兩數的倒數,然後計算這兩個倒數的平均值, 最後取計算結果的倒數, 編寫一個函式,接受兩個double型別的引數,返回這兩個引數的調和平均數 */ #include <stdio.h> double harmonic(double d1, double d2); int main(void) { double x, y; double result; printf("Enter two numbers and i will return it's harmonic mean: \n"); scanf("%lf %lf", &x, &y); result = harmonic(x, y); if (result > 0) printf("Harmonic mean is %.2f", result); else printf("The number have no hamonic mean. \n"); return 0; } double harmonic(double d1, double d2) { if (d1 != 0 && d2 != 0) { return 1.0 / ((1.0/d1 + 1.0/d2) / 2.0); } else return -1; }
/*
PE 9-5
編寫並測試一個函式large_of(),該函式把兩個double型別變數的值替換為較大的值。
例如large_of(x, y)會把x,y中較大的值重新賦給兩個變數
*/
#include <stdio.h>
void large_of(double*, double*);
int main(void)
{
double x = 2.0;
double y = 3.0;
printf("Original x is %.2f, y is %.2f. \n", x, y);
large_of(&x, &y);
printf("After large_of x is %.2f, y is %.2f. \n", x, y);
}
void large_of(double *pa, double *pb)
{
*pb = *pa >= *pb ? *pa : *pb;
*pa = *pb;
return;
}
/*
PE 9-6
編寫並測試一個函式,該函式以3個double變數的地址作為引數,
把最小值放入第1個變數(這裡書又翻譯錯了= =!),
中間值放入第2個變數,最大值放入第三個變數。
*/
#include <stdio.h>
int main(void)
{
double x = 5.0;
double y = 3.0;
double z = 6.0;
printf("Original value x %.2f, y %.2f, z %.2f. \n", x, y, z);
change3d(&x, &y, &z);
printf("After change3d value x %.2f, y %.2f, z %.2f. \n", x, y, z);
return 0;
}
void change3d(double * smal, double * mid, double * larg)
{
double temp;
if (*smal >= *mid)
{
temp = *smal;
*smal = *mid;
*mid = temp;
}
if (*smal >= *larg)
{
temp = *smal;
*smal = *larg;
*larg = temp;
}
if (*mid >= *larg)
{
temp = *mid;
*mid = *larg;
*larg = temp;
}
return;
}
/*
PE 9-7
編寫一個函式,從標準輸入中讀取字元,直到遇到檔案結尾。程式要報告每個字元是否是字母。
如果是,還要報告該字母在字母表中的位置。
例如,c和C在字母表中的位置都是3。
合併一個函式,以一個字元作為引數,如果該字元是一個字母則返回一個數值位置,否則返回-1
*/
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char ch;
while ((ch = getchar()) != EOF)
{
int location = ch_loc(ch);
printf("%c location %d \n", ch, location);
}
}
int ch_loc(ch)
{
int back;
if (isalpha(ch))
{
if (islower(ch))
back = ch - 96;
if (isupper(ch))
back = ch - 64;
}
else
back = -1;
return back;
}
每次後面都會列印-1是因為鍵入的換行符
/*
PE 9-8
第6章的程式清單6.20中,power()函式返回一個double型別書的正整數次冪。
改進該函式,使其能正確計算負冪。
另外,函式要處理0的任何次冪都為0,
任何數的0次冪都為1(函式應報告0的0次冪未定義,因此把該值處理為1).
要使用一個迴圈,並在程式中測試該函式。
*/