1. 程式人生 > >C Primer Plus第六版第六章程式設計練習

C Primer Plus第六版第六章程式設計練習

/*
編寫一個程式,建立一個包含26個元素的陣列,並在其中儲存26個小寫字母。
然後列印陣列的所有內容
*/
#include <stdio.h>
#define SIZE 26
int main(void)
{
	char alphabet[26];
	int index;
	for (char ch = 'a', index = 0; ch <= 'z'; ch++, index++)
		alphabet[index] = ch;
	for (int index = 0; index < 26; index++)
		printf("%c \n", alphabet[index]);

	return 0;
}
/*
使用巢狀迴圈(nested loop)按照下面的格式列印字元:
$
$$
$$$
$$$$
$$$$$
*/
#include <stdio.h>
int main(void)
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < i+1; j++)
			printf("$");
		printf("\n");
	}
	
	return 0;
}
/*
使用巢狀迴圈nested loop,按下面的格式列印字母
F
FE
FED
FEDC
FEDCB
FEDCBA
此程式可以修改CH來列印各種字元遞減的三角形
比如當CH改為H時,輸出效果如下:
H
HG
HGF
HGFE
HGFED
HGFEDC
HGFEDCB
HGFEDCBA
*/
#include <stdio.h>
#define CH 'F'
int main(void)
{
	char ch = CH;
	for (int i = 0; i <=CH - 'A'; i++)
	{	
		for (int j = 0, ch = CH;  j<= i; j++, ch--)//從F開始列印,第一次列印1個
			printf("%c", ch);		  //第二次列印兩個,利用與外層迴圈變數i的關係控制	
		printf("\n");
	}	

	return 0;	
}
  1. 此程式提供了3個版本,依次改進

/*
使用巢狀迴圈,按下面的格式列印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
*/
#include <stdio.h>
int main(void)
{	
	const char end = 'U';
	char start;
	
	for (int i=0, start = 'A'; ch <= 'U'; i++)
	{
		for (int j=0; j <= i; j++)	//利用行數與列印字元之間的關係
		{
			printf("%c", start);
			start++;		//每列印一個字元,字元遞增至下一個字元	
		}
		printf("\n");			//每一行結束後,換行	
	}	

	return 0;
}
//*************************************************************************
/*
下面是增強版,簡化了程式碼行數,並可讓使用者輸入指定字元
列印三角形至輸入字元所在行
如輸入V,則列印:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZ[\
*/
#include <stdio.h>
int main(void)
{
	char end;
	char start;
	
	printf("Enter an character: \n");
	scanf("%c", &end);
	for (int i = 0, start = 'A'; start <= end; i++)
	{
		for (int j=0; j<=i; j++, printf("%c", start), start++);
		printf("\n");
	}

	return 0;
}
//*************************************************************************
/*
進了上個程式,使其只會列印至使用者輸入的字元處,不同於上個程式
會完整輸出字元所在的整行
*/
#include <stdio.h>
int main(void)
{
	char start;
	char end;

	printf("Enter an end of the character: \n");
	scanf("%c", &end);
	for (int i = 0, start = 'A'; start <= end; i++)
	{
		for (int j = 0; j <= i; j++,start++)
		{
			if (start<= end)
				printf("%c", start);
		}
		printf("\n");
	}

	return 0;
}
/*
編寫一個程式,提示使用者輸入大寫字母
使用巢狀迴圈以下面金字塔型的格式列印字母
        A       
       ABA
      ABCBA
     ABCDCBA
    ABCDEDCBA
 列印這樣的圖形,要根據使用者輸入的字母來決定。
 例如,上面的圖形是在輸入E後的列印結果。
*/
#include <stdio.h>
int main(void)
{

	char start = 'A';
	char end;
	char ch = start;
	
	printf("Enter an character i will give you a surprise now: \n");\
 	scanf("%c", &end);
 	printf("It's your own alphabet tree(haha): \n");
	for (int i = 0; i <= end-start; i++, ch = start)
	{
		for (int j = 0; j < end - start - i; j++)
			printf(" ");
		for (int k = 0; k <= i; k++)
		{
			printf("%c", ch);
			ch++;
		}
		ch -= 2;
		for (int c = 0; c < i; c++)
		{
			printf("%c",ch);
			ch--;
		}
		printf("\n");
	}	

	return 0;
}
//*************************************************************************
//下面利用for loop的特性,使程式碼更加緊湊
#include <stdio.h>
int main(void)
{
 	char end;
	char start = 'A';
 	char ch = start;
 	
	printf("Enter an character i will give you a surprise now: \n");
    	scanf("%c", &end);
    	printf("It's your own alphabet tree(haha): \n");
    	for (int i = 0; i <= end-start; i++, ch = start)
 	{
  		for (int j = 0; j < end - start - i; j++)
   			printf(" ");
  		for (int k = 0; k <= i; k++, ch++)
   			printf("%c", ch);
  		ch = ch - 2;
  		for (int c = 0; c < i; c++, ch--)
   			printf("%c",ch);
		printf("\n");
	}
	
	return 0;
 }
//小結一下,此題還是利用的是內外層迴圈的數值關係,搞清楚當中的關係也就不難了
/*
編寫一個程式列印一個表格,每行列印一個整數、該數的平方、該數的立方
要求使用者輸入表格的上下限。使用一個for loop
*/
#include <stdio.h>
int main(void)
{
	int start;
	int end;

	printf("Enter a number as start: \n");
	scanf("%d", &start);
	printf("Enter a number as end: \n");
	scanf("%d", &end);
	printf("_____________________________________\n");
	for (printf("original \t suqare \t cube\n"), start; start <= end; start++)
	{
		printf("%8d %14d %13d\n", start, start*start, start*start*start);
	}
	printf("_____________________________________\n");
	printf("That's all");
	
	return 0;		
}
/*
編寫一個程式把一個單詞讀入一個字元陣列中,然後倒序列印這個單詞。
提示strlen()函式可用於計算陣列最後一個字元的下標。
*/
#include <stdio.h>
#include <string.h>
#define SIZE 40
int main(void)
{	
	char words[SIZE];
	int end_index;
	
	printf("Please enter a word that"
			"you want to know it's revers order: \n");
	scanf("%s", words);
	end_index = strlen(words);
	for (end_index--; end_index >= 0; end_index--)
		printf("%c", words[end_index]); 
	
	return 0;
}
/*
編寫一個程式,要求使用者輸入兩個浮點數,並列印兩數之差除以兩數乘積的結果
在使用者輸入非數字之前,程式應迴圈處理使用者輸入的每對值。
*/
#include <stdio.h>
int main(void)
{
	float f_op;
	float s_op;
	int states;
	
	do
	{
		printf("Please enter two number: \n");
     		fflush(stdin);	//用來清除輸入緩衝區,否則如果輸入非float型別的值,這個值將在輸入緩衝區中一直被失敗讀取,導致無限迴圈“Please enter two number:”
		states = scanf("%f %f", &f_op, &s_op);
	}while (states != 2);
	printf("Result: %f \n", (f_op-s_op) / (f_op * s_op));

	return 0;
}
//小結:此程式有待改善

此程式有待改善

/*
修改練習8,使用一個函式返回計算的結果。
*/
#include <stdio.h>
float func1(float f_op, float s_op);
int main(void)
{	
	float f_op;
 	float s_op;
 	int states;
 	do
 	{
	  	printf("Please enter two number: \n");
       		fflush(stdin);
       		states = scanf("%f %f", &f_op, &s_op);
	}while (states != 2);
	printf("Result: %f \n", func1(f_op, s_op));

	return 0;
}
float func1(float f_op, float s_op)
{
	return (f_op-s_op) / (f_op * s_op);
} 
/*
編寫一個程式,要求使用者輸入一個上限整數和一個下限整數,
計算從上限到下限範圍內所有整數的平方和,並顯示計算結果
直到使用者輸入的上限整數小於下限整數為止。
程式的執行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
*/
#include <stdio.h>
int main(void)
{	
	int lower_num;
	int upper_num;
	
	printf("Enter lower and upper integer limits: ");
	scanf("%d %d", &lower_num, &upper_num);
	while (upper_num > lower_num)
	{
		int sum = 0;
		for (int count = lower_num; count <= upper_num; count++)
		{
			sum += count * count;
		}
		printf("The sums squares frome %d to %d is %d \n", 
			lower_num * lower_num, upper_num * upper_num, sum);
		printf("Enter lower and upper integer limits: ");
		scanf("%d %d", &lower_num, &upper_num);
	}
	printf("Done\n");
	
	return 0;
}
/*
編寫一個程式,在陣列中讀入8個整數,然後按倒序列印這8個整數
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{	
	int num[SIZE];
	printf("Start:");
	for (int i = 0; i < SIZE; i++)
		scanf("%d", &num[i]);
	for (int j = SIZE-1; j >= 0; j--)
		printf("%d \n", num[j]);
	printf("Done! \n");
	
	return 0;
}
/*
考慮下面兩個無限序列:
1.0 + 1.0/2.0 + 1.0/3.0 +1.0/4.0 + ...
1.0 - 1.0/2.0 + 1.0/3.0 -1.0/4.0 + ...
編寫一個程式計算這兩個無限序列的綜合,直到到達某次數。
提示:奇數個-相乘得-1,偶數個-1相乘得1
讓使用者互動的輸入指定的次數,當用戶輸入0或負值時結束輸入
檢視執行100項、1000項、10000項後的總和,是否發現每個序列都收斂於某值?
*/
#include <stdio.h>
int main(void)
{	
	int times;
	float count1 = 1.0f;
	float count2 = 1.0f;
	float sum1 = 0.0;
	float sum2 = 0.0;

	printf("How many times adddtion you want : \n");
	scanf("%d", &times);
	for (int i = 1; i <= times; i++, count++)
	{
		sum += 1.0 / count;	
	}
	for (int j = 1; j <= times; j++, count2++)
	{
		if (j % 2 == 0)
		{
			sum2 -= 1.0 / count2;
		}
		else
		{
			sum2 += 1.0 / count2;	
		}
	}
	printf("The first infinite series: %f\n", sum1);
	printf("The second infinite series: %f \n", sum2);

	return 0;
}

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

在這裡插入圖片描述

第二個級數是收斂的,第一個級數不收斂,數學過程怎麼證明來著我忘了 = =待我看完書再補上ORZ 13.

/*
編寫一個程式,建立一個包含八個元素的int型別陣列,
分別把陣列元素設定為2的前8次冪。
使用for迴圈設定陣列元素的值,使用do while迴圈顯示陣列的值
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
	int num[SIZE];
	int power_of_two;
	int index = 0;
	
	for (int i = 0; i < SIZE; i++, power_of_two = 1)
	{
		for (int j = 1; j < i+1; j++)
			power_of_two = power_of_two * 2;   
		num[i] = power_of_two;
	}
	do
	{
		printf("%d \n", num[index]);
		index++;
	} while (index < SIZE);
	
	return 0;
}

/*
編寫一個程式,建立兩個包含8個元素的double型別陣列
使用迴圈提示使用者為第一個陣列輸入8個值。
第二個元素的值設定為第一個陣列對應元素的累積之和。
例如:第二個陣列的第4個元素是第一個陣列前4個元素之和
(利用巢狀迴圈完成,但是第二個陣列的第5個元素是第二個陣列的第4個元素
與第一個陣列的第5個元素之和,只用一個迴圈就能完成任務,不需要使用巢狀迴圈)
最後,使用迴圈顯示兩個陣列的內容,每個陣列各佔一行且相應元素上下對齊
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
	double arr1[SIZE];
	double arr2[SIZE];

	printf("Please input the value of the first array: \n");
	for (int i = 0; i < SIZE; i++)
	{	
		scanf("%lf", &arr1[i]);
		for (int j = 1 ; j <= i; j++)
		{
			arr2[0] = arr1[0];	//這條初始化語句放在for loop裡會報錯,原因尚不得知
			arr2[j] =  arr2[j-1] + arr1[j]  ; 
		}
	}	
	printf("Good job ! \n");
	printf("————————————————————————————————————————\n");
	for (int i = 0; i < SIZE; i++)
	{
		printf ("%7.2f", arr1[i]);
	}
	printf("\n");
	for (int i = 0; i < SIZE; i++)
	{
  		printf ("%7.2f", arr2[i]);
 	}
 	 printf("\n————————————————————————————————————————\n");

	return 0;
}

/*
編寫一個程式,讀取一行輸入,讓後把輸入的內容倒序打印出來。
可以把輸入儲存在char型別的陣列中,假設每行字元不超過255.
回憶一下,根據%c轉換說明(conversation specification)
scanf()每次只能中輸入中讀取一個字元,
而且在使用者按下Enter鍵時,scanf()會生成一個換行字元(\n).
*/
#include <stdio.h>
#define SIZE 256
int main(void)
{
	char str[SIZE];	
	int index = -1;
	
	printf("Please input everyting your like,"
		" but no more than 255 characters: \n");
	for (int i = 0; i < SIZE; i++)
	{	
		scanf("%c", &str[i]);
		index++;		//統計字元個數
		if (str[i] == '\n')
			break;	//用到了後一章的break,暫時沒找到用前幾章的解法
	}	
	for (int j = index - 1; j >= 0; j--)	//從index處倒序列印
		printf("%c", str[j]);
	
	return 0;
}
/*
Daphne以10%的單利息投資了100美元(也就是說,每年投資獲利相當於原始投資的10%)
Deirdre以5%的複合利息投資了100美元(也就是說,利息是當前餘額的5%,包含之前的利息)
編寫一個程式,計算需要多少年Deirade的投資額才會超過Daphne,並顯示那時兩人的投資額
*/
#include <stdio.h>
#define SIMP_RATE 10%
#define COM_RATE 5%
int main(void)
{
	int base_money = 100;
	float simple_interest = (float)base_money;
	float compound_interest = (float)base_money; 
	int years = 0;
	
	while (compound_interest <= simple_interest)
	{
		simple_interest += base_money * (10.0 / 100);
		compound_interest *= (105.0 / 100);
		years++;
		printf("The %d year \n", years);
  		printf("simple interest: %16.3f \n", simple_interest);
  		printf("compound interest: %14.3f \n", compound_interest);
  		printf("---------------------------------\n");
	}
	printf("Finally it spend %d Years.", years);

	return 0;
}
/*
Chuckie Lucky 贏得了100萬美元(稅後),他把獎金存入年利率8%的賬戶。
在每年的最後一天,Chuckie取出10萬美元。
編寫一個程式,計算需要多少年後Chuckie會取完賬戶的錢?
*/
#include <stdio.h>
int main(void)
{	
	int base_money = 100;
	const float RATE = 108.0 / 100;
	float total = 100;
	int years;
	
	while (total > 0)
	{
		total *= RATE;
		total -= 10; 	
		years++;
		printf("%4d years %f\n", years, total);
	}
	printf("%4d years later you have no money in the bank", years);

	return 0;
}
/*
Rabnud博士加入了一個社交圈。起初他有5個朋友,他注意到他的朋友以下面的方式進行增長
第1周少了1個朋友,剩下的朋友數量翻倍;第二週少了兩個朋友,剩下朋友數量翻倍
一般而言,第N周少了N個朋友,剩下的朋友數量翻倍。
編寫一個程式,計算並顯示Rabnud博士每週朋友的數量。
該程式一直執行,直到超過鄧巴數(Dunbar's number)。
鄧巴數是粗略估計一個人在社交圈中有穩定關係的成員的最大值,該值大約是150
*/
#include <stdio.h>
#define DUNBAR 150
int main(void)
{	
	int start_f = 5;
	int total_f = start_f;
	int weeks = 1;
	
	while (total_f < DUNBAR)
	{
		
		total_f = (total_f - weeks) * 2; 
		printf(" %d weeks later, %d friends\n", weeks, total_f);
		weeks++;
	}
	printf("After %d weeks your have touch the Dunbar. \n", weeks-1);

	return 0;
}