1. 程式人生 > >C Primer Plus(第6版)第九章程式設計練習答案

C Primer Plus(第6版)第九章程式設計練習答案

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).
要使用一個迴圈,並在程式中測試該函式。
*/