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

C 語言實踐項目:算術運算符與表達式核心技法精講

     編輯:關於C

本文記錄《C 語言及程序設計》實踐項目 11 的五個經典練習,聚焦整數拆分、浮點數分離、分級優惠計算、統計運算、極坐標轉換五大場景,通過代碼實戰強化運算符優先級、類型轉換、數學庫調用等核心技能。

任務 1:三位整數逐位拆解

問題

輸入三位整數 x,輸出百位、十位、個位,空格分隔。

核心邏輯

  • 百位:x / 100(整數除法截斷)
  • 十位:(x % 100) / 10(先取后兩位,再取十位)
  • 個位:x % 10(模 10 取余)

代碼實現

#include <stdio.h>
int main() {
    int x, a, b, c;
    printf("請輸入一個三位數:");
    scanf("%d", &x);
    a = x / 100;
    c = x % 10;
    b = (x % 100) / 10;
    printf("%d %d %d", a, b, c);
    return 0;
}

知識點

/ 與 % 組合實現位權分解。注意輸出格式題目要求空格,原代碼用逗號需調整。

任務 2:浮點數整數/小數部分分離

問題

輸入小數點後三位的浮點數,分別輸出整數部分與小數部分(作為整數)。

核心邏輯

  • 整數部分:(int)(x) 或 x / 1 截斷小數
  • 小數部分:(int)(x * 1000) % 1000 — 先放大 1000 倍轉整數,再取模 1000 保留後三位

代碼實現

#include <stdio.h>
int main() {
    float x;
    int integer_part, decimal_part;
    printf("請輸入一個浮點數:");
    scanf("%f", &x);
    integer_part = (int)x;
    decimal_part = (int)(x * 1000) % 1000;
    printf("%d %d", integer_part, decimal_part);
    return 0;
}

心得

浮點數精度陷阱:3.14 * 1000 可能得 3139.999...,轉 int 變 3139。工程上應加 0.5 四捨五入或用 round(),或改用字符串解析避免精度損失。

任務 3:鮮花優惠購買最優策略

問題

紅玫瑰 5 元/枝,買 5 送 1,買 20 送 5。給定金額 n (n>10),求最大可得花枝數。

分析與優化

原代碼分支過多,實際可統一公式:

  1. 基礎購買枝數:base = money / 5
  2. 滿 20 送 5:gift20 = (base / 20) * 5
  3. 剩餘枝數滿 5 送 1:gift5 = ((base % 20) / 5) * 1
  4. 總計:total = base + gift20 + gift5

優化代碼

#include <stdio.h>
int main() {
    int money, base, total;
    printf("請輸入金額:");
    scanf("%d", &money);
    base = money / 5;
    total = base + (base / 20) * 5 + ((base % 20) / 5);
    printf("最多可買 %d 枝", total);
    return 0;
}

心得

數學建模優於條件分支:將離散優惠規則轉化為整除/取模組合,代碼更簡潔、擴展性更強(如新增滿 50 送 15 只需加一項)。

任務 4:三實數統計特徵值計算

問題

輸入三個雙精度實數,輸出和、平均值、平方和、平方和開方。

代碼實現

#include <stdio.h>
#include <math.h>
int main() {
    double a, b, c;
    printf("請輸入三個實數:");
    scanf("%lf %lf %lf", &a, &b, &c);
    double sum = a + b + c;
    double avg = sum / 3.0;
    double sq_sum = a*a + b*b + c*c;
    double root = sqrt(sq_sum);
    printf("和:%.2f\n平均值:%.2f\n平方和:%.2f\n平方和開方:%.2f\n",
           sum, avg, sq_sum, root);
    return 0;
}

知識點

  • %lf 掃描 double,printf 中 %f 通用
  • math.h 提供 sqrt(),編譯需鏈接 -lm (Linux/GCC)
  • 建議用 double 替代 float 提高精度

任務 5:極坐標轉直角坐標

問題

輸入極坐標 (r, θ)(角度制),輸出直角坐標 (x, y)。

數學公式

x = r * cos(θ * π / 180), y = r * sin(θ * π / 180)

代碼實現

#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main() {
    double r, degree;
    printf("請輸入極坐標 r 和角度(度):");
    scanf("%lf %lf", &r, &degree);
    double rad = degree * PI / 180.0;
    double x = r * cos(rad);
    double y = r * sin(rad);
    printf("直角坐標:(%.4f, %.4f)", x, y);
    return 0;
}

關鍵修正

  • 原代碼變量誤定為 int,導致 degree/180 整除得 0 — 浮點運算變量必須聲明為浮點類型
  • #define PI 使用更高精度常量
  • cos/sin 參數為弧度,必須角度轉弧度

綜合心得與最佳實踐總結

場景核心技法易錯點優化方向
整數位拆解/ 與 % 組合負數取模語義斷言輸入範圍
浮點部分分離縮放 + 取模二進制精度誤差字符串解析或 round()
分級優惠計算整除/取模建模條件分支爆炸統一數學公式
統計特徵值單遍歷累加float 精度不足用 double + Kahan 求和
坐標系統轉換三角函數 + 角度轉弧度整型變量截斷強類型聲明 + 常量精度

這五個任務雖屬基礎,卻涵蓋了 C 語言數值計算的精髓:**類型系統、運算符語義、數學建模、庫函數調用、精度控制**。建議讀者嘗試擴展:任務 1 支持任意位數輸出;任務 2 處理科學計數法輸入;任務 3 實現通用優惠規則引擎;任務 4 增加方差/標準差;任務 5 支持批量轉換與文件 IO。

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