目錄
實驗一:
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';
}
}