BFU 2020級程序設計基礎 實驗題整理

目錄

實驗一

實驗二

實驗三

實驗四


實驗一:

 

1.編寫程序,實現如下功能:求之值。

思考:注意分數之前的符號,什麼時候爲正什麼時候爲負?

2.編寫程序,實現如下功能:求出200到300之間的數,且滿足條件:它們三個數字之積爲42,三個數字之和爲12。

思考:如何求出一個三位數的百位、十位和個位?

 

思路:

1.該程序通過for循環即可實現,其關鍵在於奇加偶減,求和輸出即可。

#include<stdio.h>

int main()
{
	double dsum = 0.; // 用於存儲最終答案的數值
	int i;

	for(i = 1; i <= 100; i++) // 通過for循環實現對1~100的操作
	{
		if (1 == i % 2)// int強制類型轉換 以滿足取模的參數要求 
		{	// 通過取模操作判斷當前的i是奇還是偶,若奇則加
			dsum += 1. / i;
		}
		else
		{	// 若偶則減
			dsum -= 1. / i;
		}
	}

	printf("ans = %f", dsum);

	return 0;
}

 

2.該程序通過對數字的拆解,並分別進行求積及求和的操作,之後判斷結果是否與題目要求相符合即可。

#include<stdio.h>

int main()
{
	int i;
	int cnt = 0; // 對答案進行編碼並計數

	for (i = 200; i <= 300; i++)
	{
		int a = i % 10; // 取出個位數字
		int b = (i / 10) % 10; // 取出十位數字
		int c = i / 100; // 取出百位數字

		if ( (42 == a * b * c) && (12 == a + b + c) ) 
		{ // 如若滿足題述條件
			printf("ans%d = %d\n", ++cnt, i);
		}
	}

	return 0;
}

 

 

實驗二:

編寫程序,實現如下任務:從鍵盤輸入若干個整數,輸入整數的個數小於100,其值在0~100範圍內,用-1作爲輸入結束的標誌。統計每個整數的個數並從大到小排序,輸出排序後的結果。

提示:定義兩個數組,一個用來存放輸入整數,另一個用來存放統計信息。

 

思路:

該程序開設了一個acnt數組,用於記錄索引所對應的數字的出現次數,首先通過獲取用戶輸入,來初始化acnt數組。

代碼從17行開始是實現按照出現次數從大到小輸出的功能,其中i用來做出現次數的比對,其變化從大到小,以實現按出現次數的降序輸出,j用來遍歷數組,判斷每一個數出現的次數是否與 比對變量i 相同 。通過該過程即可實現要求的功能。

#include<stdio.h>

int acnt[101];// 該數組用於記錄 索引所對應的數字 的出現次數

int main()
{
	while(1)
	{ // 通過while循環進行對數據的持續輸入
		int t;
		scanf("%d", &t);
		if (-1 == t) break; // 如果輸入是-1則跳出循環 即停止輸入
		acnt[t]++; // 對數字t的出現次數進行+1
	}

	int i, j;

	for (i = 100; i > 0; i--)
	{ // i用來做出現次數的比對,從大到小,以實現按次數的降序輸出
		for (j = 100; j >= 0 ; j--)
		{ // j用來遍歷數組,判斷每一個數出現的次數是否與 比對變量i 相同
			if(acnt[j] == i) // 數字j出現的次數爲i
			{
				printf("出現:%d次的是數字:%d\n", i, j);
			}
		}
	}


	return 0;
}

 

實驗三:

編寫函數,從標準輸入中讀取字符,直到遇到EOF。程序要輸出每個字符是否是字母。如果是,還要求輸出該字母在字母表中的數值位置。

 

思路:

該程序通過在主函數中讀取字符,將字符作爲實參傳入CheckAlpha函數中,通過該函數的返回值,可以得知當前字符是否爲字母,及其在字母表中的順序。

CheckAlpha函數的實現方法爲:通過判斷該字符的ascii值是否介於字母a/A 與 z/Z之間,若是,則與a/A做差加1 即爲字母表順序。若非字母或爲換行,則返回相應的標識數值,用以main函數中的處理操作。

#include<stdio.h>

int CheckAlpha (char a)
{
	if ( a >= 'A' && a <= 'Z')
	{ // 返回字母所在字母表中的位置
		return a - 'A' + 1;
	}
	if ( a >= 'a' && a <= 'z')
	{ // 返回字母所在字母表中的位置
		return a - 'a' + 1;
	}
	if (10 == a) 
	{ // 如果是換行符(ascii對應10)
		return -1;
	}
	else 
	{ // 如果是非字母
		return 0;
	}
}

int main()
{
	char t;// 用於臨時存儲當前輸入的字符

	while ((t = getchar()) != EOF)
	{
		int re = CheckAlpha(t); // re用於存儲check函數的返回值,以減少重複調用

		if (0 == re)
		{ // 若非字母
			printf("該字符不是字母\n");
		}
		else if (-1 == re)
		{ // 若爲回車鍵 則不進行操作
			continue;
		}
		else
		{ // 若爲字母
			printf("該字符是字母,其位置是%d\n", re);
		}
	}

	return 0;
}

 

實驗四:

定義函數 void  mystrcat(char *s1,char *s2,char *new_s) 實現對兩個字符串進行交叉連接。

例如:有兩個字符串“abcd”、“1234”,交叉連接後結果爲“a4b3c2d1”。

 

思路:
首先對該程序的核心函數進行需求分析,其需要將字符串s1與字符串s2進行交叉連接,並將交叉連接的結果存於new_s字符串中,故根據數學分析,可得出表達通項,並根據該通項公式設計for循環即可得出答案,參數的傳遞則通過指針實現。

但是,在考慮特殊的情況下(s1,s2長度不一樣)需要將餘項接在字符串後

 

全部代碼:

#include<stdio.h>
#include<string.h>
#define LEN 100

void mystrcat (char *s1, char *s2, char *new_s);

int main()
{
	char a[LEN], b[LEN], c[LEN * 2];
	
	printf("pleas input two strings, separated by ENTER\n");
	scanf("%s", a);
	scanf("%s", b);


	mystrcat(a, b, c); // 進行處理 

	printf("After merged: %s\n", c);

	return 0;
}

void mystrcat (char *s1, char *s2, char *new_s)
{
	int l1=strlen(s1),l2=strlen(s2), i;
	
	if(l1 == l2)
	{
		for(i = 0; i < l1; i++)
		{
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		}
		new_s[l1 + l2]= '\0'; 
	}
	
	if (l1 > l2)
	{
		for (i = 0; i < l2; i++)
		{ // 把能正常弄得先弄上 
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		} 
		// now i = l2  
		// new should start from 
		for (; i < l1; i++)
		{
			// 根據算法推導可知 從l2 + i 開始記錄新數 
			new_s[l2 + i] = s1[i];
		}
		new_s[l1 + l2]= '\0'; 
		
	}
	
	if (l1 < l2)
	{
		for (i = 0; i < l1; i++)
		{ // 把能正常弄得先弄上 
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		} 
		// now i = l1 
		// new should start from 
		for (; i < l2; i++)
		{
			// 根據算法推導可知 從l2 + i 開始記錄新數 
			new_s[l1 + i] = s2[l2 - i - 1];
		}
		new_s[l1 + l2]= '\0'; 
		
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章