剛學習c語言,做了一個簡陋的計算器,請問需要加入什么代碼才能夠支持括號優先,現在加入括號就會崩潰,還有就是求對數時,如何讓使用者輸入對數的底數然后進行計算嗎?求幫忙看看
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//預處理指令
int main(void)
{
double bNumber, Number, Result; //給加減乘除定義的變數
int No; //選項的定義變數
double a, b, c, x1, x2, Rad; //給乘方指數對數定義變數
int Ary_10; //定義進制的變數
char string[32]; //二進制變數定義
system ("簡單計算器 "); //程式視窗上的標題
while(1)
{
//界面
printf ("請選擇你要計算的方法: \n");
printf ("加法請按1 進制轉換5 \n");
printf (" 減法請按2 請按6 \n");
printf (" 乘法請按3 乘方請按7 \n");
printf ( 除法請按4 求對數請按8 退出_0 \n");
printf ("Please write down the number:");
scanf ("%d",&No);
if (No == 1)
{
// 加法
printf (" 請輸入被加數:");
scanf ("%lf",&bNumber);
printf (" 請輸入加數:");
scanf ("%lf",&Number);
Result = bNumber + Number;
printf (" 結果是: %lf\n\n",Result);
}
else if (No == 2)
{
// 減法
printf (" 請輸入被減數:");
scanf ("%lf",&bNumber);
printf (" 請輸入減數:");
scanf ("%lf",&Number);
Result = bNumber - Number;
printf (" 結果是: %lf\n\n",Result);
}
else if (No == 3)
{
// 乘法
printf (" 請輸入被乘數:");
scanf ("%lf",&bNumber);
printf (" 請輸入乘數:");
scanf ("%lf",&Number);
Result = bNumber * Number;
printf (" 結果是: %lf\n\n",Result);
}
else if (No == 4)
{
// 除法
printf (" 請輸入被除數:");
scanf ("%lf",&bNumber);
printf (" 請輸入除數:");
scanf ("%lf",&Number);
Result = bNumber / Number;
printf (" 結果是: %lf\n\n",Result);
}
else if (No == 5)
{
//進制轉換的代碼
printf("請輸入需要轉換的十進制數:");
scanf("%d", &Ary_10);
itoa (Ary_10, string ,2);
printf("二進制: %s\n", &string);
printf("八進制: %o\n", &Ary_10);
printf("十六進制: %x\n", &Ary_10);
}
else if (No == 6)
{
//
printf("請輸入需要的一個數:");
scanf("%lf",&a);
printf (" 結果是: %lf\n",sqrt(a));
}
else if (No == 7)
{
//求一個數的乘方
printf("請輸入底數:");
scanf("%lf",&a);
printf("請輸入指數: ");
scanf("%lf",&b);
printf (" 結果是: %lf\n",pow(a,b));
}
else if (No == 8)
{
//求一個數的對數
printf("請輸入需要求對數的數字:");
scanf("%lf", &a);
printf("以e為底的對數為: %lf\n", log(a));
printf("以10為底的對數為: %lf\n", log10(a));
}
else if (No == 0)
{
// 退出程式
break;
}
else
{
// 輸入的選項不對
printf(" 請輸入正確的數字。\n\n");
}
system ("pause"); //按任意鍵繼續
system ("cls"); //清屏
}
return 0;
getchar();
}
uj5u.com熱心網友回復:
僅供參考:#pragma warning(disable:4996)
/*---------------------------------------
函式型計算器(VC++6.0,Win32 Console)
功能:
目前提供了10多個常用數學函式:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷開平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用對數lg
⑼自然對數ln
⑽e指數exp
⑾乘冪函式^
⑿向上取整ceil
⒀向下取整floor
⒁四舍五入取整round
⒂取符號sign
⒃取絕對值abs
用法:
如果要求2的32次冪,可以打入2^32<回車>
如果要求30度角的正切可鍵入tan(Pi/6)<回車>
注意不能打入:tan(30)<Enter>
如果要求1.23弧度的正弦,有幾種方法都有效:
sin(1.23)<Enter>
sin 1.23 <Enter>
sin1.23 <Enter>
如果驗證正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter>
此外兩函式運算式連在一起,自動理解為相乘如:sin1.23cos0.77+cos1.23sin0.77就等價于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
當然你還可以依據三角變換,再用sin(1.23+0.77)也即sin2驗證一下。
本計算器充分考慮了運算子的優先級因此諸如:2+3*4^2 實際上相當于:2+(3*(4*4))
另外函式名前面如果是數字,那么自動認為二者相乘.
同理,如果某數的右側是左括號,則自動認為該數與括弧項之間隱含一乘號。
如:3sin1.2^2+5cos2.1^2 相當于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5 相當于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,本計算器提供了圓周率Pi鍵入字母時不區分大小寫,以方便使用。
16進制整數以0x或0X開頭。
----------------------------------------*/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
const char Tab = 0x9;
const int DIGIT = 1;
const int MAXLEN = 16384;
char s[MAXLEN], *endss;
int pcs = 15;
double sign(double dVal) {
if (dVal>0.0) return 1.0;
else if (dVal<0.0) return -1.0;
else return 0.0;
}
double round(double dVal, short iPlaces) {//iPlaces>=0
char s[30];
double dRetval;
sprintf(s, "%.*lf", iPlaces, dVal);
sscanf(s, "%lf", &dRetval);
return (dRetval);
}
double fun(double x, char op[], int *iop) {
while (op[*iop - 1]<32) //本行使得函式嵌套呼叫時不必加括號,如 arc sin(sin(1.234)) 只需鍵入arc sin sin 1.234<Enter>
switch (op[*iop - 1]) {
case 7: x = sin(x); (*iop)--; break;
case 8: x = cos(x); (*iop)--; break;
case 9: x = tan(x); (*iop)--; break;
case 10: x = sqrt(x); (*iop)--; break;
case 11: x = asin(x); (*iop)--; break;
case 12: x = acos(x); (*iop)--; break;
case 13: x = atan(x); (*iop)--; break;
case 14: x = log10(x); (*iop)--; break;
case 15: x = log(x); (*iop)--; break;
case 16: x = exp(x); (*iop)--; break;
case 17: x = ceil(x); (*iop)--; break;
case 18: x = floor(x); (*iop)--; break;
case 19: x = round(x,0);(*iop)--; break;
case 20: x = sign(x); (*iop)--; break;
case 21: x = fabs(x); (*iop)--; break;
}
return x;
}
double calc(char *expr, char **addr) {
static int deep; //遞回深度
static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs",NULL };
double ST[10] = { 0.0 }; //數字堆疊
char op[10] = { '+' }; //運算子堆疊
char c, *rexp, *pp, *pf;
int ist = 1, iop = 1, last, i, n;
__int64 i64;
if (!deep) {
pp = pf = expr;
do {
c = *pp++;
if (c != ' '&& c != Tab)
*pf++ = c;
} while (c != '\0');
}
pp = expr;
if ((c = *pp) == '-' || c == '+') {
op[0] = c;
pp++;
}
last = !DIGIT;
while ((c = *pp) != '\0') {
if (c == '(') {//左圓括弧
deep++;
ST[ist++] = calc(++pp, addr);
deep--;
ST[ist - 1] = fun(ST[ist - 1], op, &iop);
pp = *addr;
last = DIGIT;
if (*pp == '(' || isalpha(*pp) && strnicmp(pp, "Pi", 2)) {//目的是:當右圓括弧的右惻為左圓括弧或函式名字時,默認其為乘法
op[iop++] = '*';
last = !DIGIT;
c = op[--iop];
goto operate;
}
}
else if (c == ')') {//右圓括弧
pp++;
break;
}
else if (isalpha(c)) {
if (!strnicmp(pp, "Pi", 2)) {
if (last == DIGIT) {
wcout << L"π左側遇)" << endl; exit(1);
}
ST[ist++] = 3.14159265358979323846264338328;
ST[ist - 1] = fun(ST[ist - 1], op, &iop);
pp += 2;
last = DIGIT;
if (!strnicmp(pp, "Pi", 2)) {
wcout << L"兩個π相連" << endl; exit(2);
}
if (*pp == '(') {
wcout << L"π右側遇(" << endl; exit(3);
}
}
else {
for (i = 0; (pf = fname[i]) != NULL; i++)
if (!strnicmp(pp, pf, strlen(pf))) break;
if (pf != NULL) {
op[iop++] = 07 + i;
pp += strlen(pf);
}
else {
wcout << L"陌生函式名" << endl; exit(4);
}
}
}
else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^') {
char cc;
if (last != DIGIT) {
wcout << L"運算子粘連" << endl; exit(5);
}
pp++;
if (c == '+' || c == '-') {
do {
cc = op[--iop];
--ist;
switch (cc) {
case '+': ST[ist - 1] += ST[ist]; break;
case '-': ST[ist - 1] -= ST[ist]; break;
case '*': ST[ist - 1] *= ST[ist]; break;
case '/': ST[ist - 1] /= ST[ist]; break;
case '%': ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
case '^': ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
}
} while (iop);
op[iop++] = c;
}
else if (c == '*' || c == '/' || c == '%') {
operate: cc = op[iop - 1];
if (cc == '+' || cc == '-') {
op[iop++] = c;
}
else {
--ist;
op[iop - 1] = c;
switch (cc) {
case '*': ST[ist - 1] *= ST[ist]; break;
case '/': ST[ist - 1] /= ST[ist]; break;
case '%': ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
case '^': ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
}
}
}
else {
cc = op[iop - 1];
if (cc == '^') {
wcout << L"乘冪符連用" << endl; exit(6);
}
op[iop++] = c;
}
last = !DIGIT;
}
else {
if (last == DIGIT) {
wcout << L"兩數字粘連" << endl; exit(7);
}
if (pp[0] == '0' && (pp[1] == 'x' || pp[1] == 'X')) {
sscanf(pp + 2, "%I64x%n", &i64, &n);
rexp = pp + 2 + n;
ST[ist++] = (double)i64;
}
else ST[ist++] = strtod(pp, &rexp);
ST[ist - 1] = fun(ST[ist - 1], op, &iop);
if (pp == rexp) {
wcout << L"非法字符" << endl; exit(8);
}
pp = rexp;
last = DIGIT;
if (*pp == '(' || isalpha(*pp)) {
op[iop++] = '*';
last = !DIGIT;
c = op[--iop];
goto operate;
}
}
}
*addr = pp;
if (iop >= ist) {
wcout << L"運算式有誤" << endl; exit(9);
}
while (iop) {
--ist;
switch (op[--iop]) {
case '+': ST[ist - 1] += ST[ist]; break;
case '-': ST[ist - 1] -= ST[ist]; break;
case '*': ST[ist - 1] *= ST[ist]; break;
case '/': ST[ist - 1] /= ST[ist]; break;
case '%': ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;
case '^': ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;
}
}
return ST[0];
}
int main(int argc, char **argv) {
int a;
wcout.imbue(locale("chs"));
if (argc<2) {
//if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代碼頁
wcout << L"計算函式運算式的值。" << endl << L"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs" << endl;
while (1) {
wcout << L"請輸入運算式:";
fgets(s,16384,stdin);
if ('\n' == s[strlen(s)-1]) s[strlen(s) - 1] = 0;
if (s[0] == 0) break;//
cout << s << "=";
cout << setprecision(15) << calc(s, &endss) << endl;
}
}
else if (argc == 2 && 0 == strcmp(argv[1], "/?")) {
//if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代碼頁
wcout << L"計算由≥1個命令列引數給出的函式運算式的值。\n"
"最后一個引數是.0~.15表示將計算結果保留小數0~15位\n"
"最后一個引數是x表示將計算結果以16進制正整數格式輸出\n"
"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs\n"
"16進制整數以0x或0X開頭\n";
}
else {
strncpy(s, argv[1], MAXLEN - 1); s[MAXLEN - 1] = 0;
if (argc>2) {
for (a = 2; a<argc - 1; a++) strncat(s, argv[a], MAXLEN - 1);//將空格間隔的各引數連接到s
if (1 == sscanf(argv[a], ".%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一個引數是.0~.15表示將計算結果保留小數0~15位
printf("%.*lf\n", pcs, calc(s, &endss));
}
else if (argv[a][0] == 'x' || argv[a][0] == 'X') {//最后一個引數是x表示將計算結果以16進制正整數格式輸出
printf("0x%016I64x\n", (__int64)calc(s, &endss));
}
else {
strncat(s, argv[a], MAXLEN - 1);
printf("%.15lg\n", calc(s, &endss));
}
}
else {
printf("%.15lg\n", calc(s, &endss));
}
}
return 0;
}
uj5u.com熱心網友回復:
...真是什么代碼你都有啊...uj5u.com熱心網友回復:
看出我有收藏癖了吧。
uj5u.com熱心網友回復:
我認為你應該開源你的收藏
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266446.html
標籤:C++ 語言
上一篇:在邁克爾遜干涉儀中怎么把等傾干涉的matlab代碼改成等厚干涉的matlab代碼
下一篇:大佬趕緊進來
