C/C++編程筆記:大一C語言案例《簡單計算器》,遲早用上!
大一學了C語言老師肯定會要求你們做一個這個課后作業(yè)!所以,先收藏是關(guān)鍵~

本文案例用C語言做一個簡單的計算器,進行加、減、乘、除操作。本程序涉及的所有數(shù)學知識都很簡單,但輸入過程會增加復(fù)雜性。都是C語言很基礎(chǔ)的東西(輸入輸出),學了之后能寫出一個完整的C語言程序。適合涉及C語言的基本語法,與輸入與輸出。適合初學者學習。
代碼如下:
/*===============================================*\
** 設(shè)計目的:簡單計算器,計算形如10*(20.2-30.6)+5.0/2的表達式值
** 簡要原理:中綴式轉(zhuǎn)逆波蘭式(后綴式)
** IDE:Dev-Cpp 4.9.9.2
** 注意事項:括號必須是英文狀態(tài)的
** 時間: 2020-9-05
\*===============================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 1000
char buf[maxn], str[maxn], signStack[maxn], ch[2];
int len, id, idSign, idAns, i, n;
double ans[maxn];
void checkSign(char sign){
if(sign == '(') signStack[idSign++] = sign;
else if(sign == '*' || sign == '/'){
while(idSign && (signStack[idSign-1] == '*' || signStack[idSign-1] == '/'))
str[id++] = signStack[--idSign];
signStack[idSign++] = sign;
}else if(sign == ')'){
while(signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
--idSign;
}else{
while(idSign && signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
signStack[idSign++] = sign;
}
str[id++] = ' ';
}
int check(double a, char sign){
if(a == 0 && sign == '/'){
printf("除數(shù)不能為0!,程序結(jié)束。\n");
system("pause");
exit(EXIT_FAILURE);
}
return 1;
}
double cal(double a, double b, char sign){
switch(sign){
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int main(){
printf("\t\t\t\t簡單計算器\n\n");
printf("\t\t? ======================================\n");
printf("\t\t? ||? 支持+ - * / ( ) 等符號和負數(shù)輸入? ||\n");
printf("\t\t? ======================================\n");
printf("\t\t\t\t\t\t\n");
printf("\t\t\t\t\t\t完成時間:2020年9月5日\n");
printf("\t\t\t\t\t\tUP編制\n");
printf("請輸入一個表達式,如 -10*(20.2-30.6)+5.0/2\n以回車結(jié)束:\n");
do{
gets(buf); id = idSign = idAns = 0;
if((len = strlen(buf)) == 0) continue;
int flag = 0; //這個是用來判斷'-'字符是負號還是減號的。1表示數(shù)字,0表示 +*/(
/*判斷原理:如果第一次讀取就碰到-,那么一定是負號,若最近一次讀取是+*-/(那么
也一定是負號,如果是右括號或數(shù)字那么是減號*/
for(i = 0; i < len; ++i){
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9' || buf[i] == '.' || buf[i] == '-' && !flag){
str[id++] = buf[i]; flag = 1;
}
else {
str[id++] = ' '; checkSign(buf[i]);
if(buf[i] != ')') flag = 0;
else flag = 1;
}
}
while(idSign) str[id++] = signStack[--idSign];
for(i = 0, n = 0; i < id; ++i){
if(str[i] == ' ') continue;
/*用增加空格的方式判斷‘-’字符是負號還是減號,若‘-’后面挨著數(shù)字或小數(shù)點,那么一定是負號*/
if(str[i] >= '0' && str[i] <= '9' || str[i] == '.' || str[i] == '-'
&& (str[i+1] >= '0' && str[i+1] <= '9' || str[i+1] == '.')){
sscanf(str + i, "%lf%n", &ans[idAns++], &n);
i += n - 1;? continue;
}else if(check(ans[idAns-1], str[i])){
ans[idAns-2] = cal(ans[idAns-2], ans[idAns-1], str[i]);
--idAns;
}
}
printf("結(jié)果是 %.2lf\n", ans[0]);
printf("輸入Y 繼續(xù), N 退出: ");
scanf("%s", ch);
}while(ch[0] == 'Y' || ch[0] == 'y');
printf("感謝您的使用!再見\n");
system("pause");
return 0;
}
遲早你會使用到的一個C語言案例,如果你是剛剛開學的小學弟,還沒有開始學習C語言,那么你可以收藏一下!如果你是已經(jīng)開始學了C語言的小伙伴,那么就希望本案例能夠?qū)δ阌袔椭鷡
自學C/C++編程難度很大,如果你想更快提升自己的編程能力和編寫項目的水平,歡迎一起共同成長!
分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

學習C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學習C/C++編程的視頻教程(含C語言入門教程),有興趣或者正在學習的小伙伴一定要去看一看哦!會對你有幫助的~