目錄
實驗一
實驗二
實驗三
實驗四
實驗一:
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';
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/247211.html
標籤:其他
上一篇:回應式編程是什么?
下一篇:c語言刷題篇易錯
