首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言經典題庫精選:字符串、數組、遞歸、數學問題與綜合編程訓練

     編輯:關於C語言

C語言經典題庫精選:字符串、數組、遞歸、數學問題與綜合編程訓練

匯總C語言學習階段的高頻練習題,涵蓋字符處理、數組操作、字符串算法、數學計算、遊戲邏輯等,附帶標準答案與代碼註釋,適合夯實基礎、備考刷題。

一、字符與字符串處理

1. 小寫轉大寫(函數版)

char zhuanhua(char s) { return s - 32; }  // ASCII碼差值32
// 或更安全:if(s>='a'&&s<='z') return s-32; else return s;

2. 字符串大寫轉換 toUpperCase(char str[])

void toUpperCase(char str[]) {
    for(int i=0; str[i]!='\0'; i++)
        if(str[i]>='a' && str[i]<='z') str[i] -= 32;
}

3. 字符串逆置 reverseStr(char *str)

void reverseStr(char *str) {
    char *pi=str, *pj=str+strlen(str)-1, tmp;
    while(pi < pj) { tmp=*pi; *pi=*pj; *pj=tmp; pi++; pj--; }
}

4. 刪除字符串中所有指定字符 deleteAll(char str[], char ch)

void deleteAll(char str[], char ch) {
    int oldi=0, newi=0;
    while(str[oldi]) {
        if(str[oldi] != ch) str[newi++] = str[oldi];
        oldi++;
    }
    str[newi] = '\0';
}

5. 字符替換 replaceAll(char str[], char ch1, char ch2)

void replaceAll(char str[], char ch1, char ch2) {
    for(int i=0; str[i]; i++) if(str[i]==ch1) str[i]=ch2;
}

6. 統計字母出現次數(不區分大小寫) countAlpha(char str[], int count[])

void countAlpha(char str[], int count[]) {
    for(int i=0; str[i]; i++) {
        if(str[i]>='a'&&str[i]<='z') count[str[i]-'a']++;
        else if(str[i]>='A'&&str[i]<='Z') count[str[i]-'A']++;
    }
}

二、數組操作經典

1. 數組逆序存儲 reverse(int *p, int n) / reverse(int a[], int n)

void reverse(int a[], int n) {
    for(int i=0; i

2. 復制數組中所有奇數 copyTo(int *s1, int n, int *s2)

int copyTo(int *s1, int n, int *s2) {
    int *ps1=s1, *ps2=s2;
    while(ps1 < s1+n) { if(*ps1%2) *ps2++ = *ps1; ps1++; }
    return ps2 - s2;  // 返回奇數個數
}

3. 查找最小元素下標 / 最大元素值

int getMinid(int a[], int n) {
    int minid=0;
    for(int i=1;i

4. 十進制轉二進制(存入數組逆序,輸出時正序)

int transformToBin(int dnum, int bin[]) {
    int cnt=0;
    while(dnum) { bin[cnt++] = dnum%2; dnum/=2; }
    return cnt;  // 位數
}
// 輸出:for(i=cnt-1; i>=0; i--) printf("%d", bin[i]);

三、數學與邏輯題

1. 素數判斷 prime(int n)

int prime(int n) {
    if(n<2) return 0;
    for(int i=2; i<=sqrt(n); i++) if(n%i==0) return 0;
    return 1;
}

2. 百馬百擔 / 百雞問題(三重循環優化為雙重)

// 百馬:大馬3擔,中馬2擔,小馬0.5擔
for(int big=0; big<=33; big++)
  for(int mid=0; mid<=50; mid++) {
    int lit = 100-big-mid;
    if(lit%2==0 && 3*big+2*mid+lit/2==100) printf(...);
  }
// 百雞:公5元,母3元,雛1元3只
for(int cock=0; cock<=20; cock++)
  for(int hen=0; hen<=33; hen++) {
    int chick = 100-cock-hen;
    if(chick%3==0 && 5*cock+3*hen+chick/3==100) printf(...);
  }

3. 多項式求值 / 方程求根

// 3x^3 - 5x^2 + 6 在 x=2.55 處的值
double x=2.55, y=3*x*x*x - 5*x*x + 6;
// 二次方程 ax^2+bx+c=0 求根
double delt=b*b-4*a*c;
if(delt>=0) { r1=(-b+sqrt(delt))/(2*a); r2=(-b-sqrt(delt))/(2*a); }

4. 統計正負數個數、奇偶平均值、各位數字和能被15整除的數

均採用 while(num) 循環配合 num%=10 num/=10 提取位,或 num%2 判斷奇偶,num>0 判斷正負,邊讀邊統計,遇0結束。

四、圖形輸出與巢狀循環

1. 漏斗圖形 printFunnel(int n)

void printFunnel(int n) {
    // 上半部:遞減星號,遞增空格
    for(int row=1; row<=n; row++) {
        for(int s=1; s

2. W字形輸出(填空題邏輯)

關鍵:外層循環行數,內層雙列,每列前導空格、星號、中間空格、星號、後綴空格,行末換行。

五、輸入輸出與異常處理

  • scanf("%c%c", &x, &y) 讀兩字符,用 tmp 交換。
  • 出租車計費:分檔計價(起步價+超里程單價),if-else 分車型。
  • 程序返回值獲取:Linux下 echo $? 獲取 main 返回值或 exit() 參數。
  • 錯誤碼處理:全局 errno + strerror(errno) 獲取錯誤信息。

六、遞歸與優化思考

遞歸階乘 rfact(x) 在 gcc -O2 下會被編譯器自動優化為迭代循環(尾遞歸優化),生成的匯編無調用棧增長。同理 15*x 優化為 (x<<4)-x(乘16減一次)。結論:現代編譯器優化極其激進,手動微優化多為畫蛇添足,應專注算法選擇與代碼可讀性。

總結

題庫覆蓋C語言核心考點:指針與數組操作、字符串原地修改、經典數學建模、巢狀循環圖形、標準庫函數綜合應用。建議:先獨立思考邏輯,再對照標準答案分析邊界條件(空指針、\0結束、越界、除零),養成防御性編程習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved