Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 108,122

HOME > กระทู้สำหรับภาษาต่าง ๆ > [ภาษา C] ผมอยากให้เครื่องคิดเลขที่ผมทำสามารถคำนวณเลขทศนิยม 2 ตำแหน่งได้ครับ ตอนนี้ได้แค่จำนวนเต็ม



[ภาษา C] ผมอยากให้เครื่องคิดเลขที่ผมทำสามารถคำนวณเลขทศนิยม 2 ตำแหน่งได้ครับ ตอนนี้ได้แค่จำนวนเต็ม

 
Topic : 134539



โพสกระทู้ ( 103 )
บทความ ( 0 )



สถานะออฟไลน์



สวัสดีครับพี่ๆในกลุ่ม ThaiCreate ทุกท่านพอดีผมกำลังหัดสร้างเครื่องคิดเลขบนภาษา C ครับ ซึ่งทำงานบนบอร์ด STM32 โดยระบบของผมจะมีฟังก์ชันแปลง infix เป็น postfix จากนั้น จะคำนวณ postfix มาเป็นคำตอบสุดท้าย ซึ่งผมทำมาหมดแล้วแต่ติดตรงที่ทั้งหมดที่ผมทำใส่ได้แค่จำนวณเต็ม คำนวณได้แค่จำนวนเต็ม แสดงคำตอบได้แค่จำนวนเต็มครับ ผมเองก็ไม่ค่อยแม่น syntax ของภาษา C ครับเพราะปกติจะใช้แต่ php จึงอยากรบกวนพี่ๆช่วยดู code ที่ผมเขียนให้หน่อยครับว่าต้องเพิ่มยังไงระบบถึงจะสามารถคิดเลขทศนิยมได้ครับผม ขออนุญาตฝากของพระคุณไว้ ณ ที่นี้ครับผม

Code
#include "header.h" struct __filter { int state; int result; int timecount; int lastoutput; }filter={0,0,0,0}; #define TIMECOUNT 10 int Filter(unsigned char (*bt)(void), struct __filter *p) { switch(p->state) { case 0: if(bt()==1)//bt=pass function to function { p->timecount=0; p->state++; } p->result=0; break; case 1: if(bt()==0) { p->state--; } if(++p->timecount>=TIMECOUNT) { p->state++; } p->result=0; break; case 2: if(bt()==0) { p->state++; p->timecount=0; } p->result=1; break; case 3: if(bt()==1) { p->state--; } if(++p->timecount>=TIMECOUNT) { p->state=0; } p->result=1; break; default: p->state=0;//refault state to 0 break; } return p->result; } //Filter(unsigned char (*bt)(void), struct __filter *p int Toggle(int (*f)(unsigned char(*)(void),struct __filter *), unsigned char (*bt)(void), struct __filter *p, int *result) { int output; output=f(bt,p); if(output!=p->lastoutput) { p->lastoutput=output; printf("\r\nToggle: %d",output); *result=output; return 1; } return 0; } //for task call void TestFilter(void *parameter) { int output; if(Toggle(Filter,ButtonPHY_Output,parameter,&output)) { printf("\r\noutput: %d",output); } } #define DATA_MAX 128 struct __infix { unsigned char item[DATA_MAX]; int index; }infix={"",0}; struct __stackop { int item[DATA_MAX]; int sp; }stackop={{0},0}; void StackOpInit(void) { stackop.sp=0; } int StackOpIsEmpty(void) { return stackop.sp==0; } int StackOpIsFull(void) { return stackop.sp >= DATA_MAX; } int StackOpPush(int newdata) { if(StackOpIsFull()) return 0; stackop.item[stackop.sp]=newdata; stackop.sp++; return 1; } int StackOpPop(int *output) { if(StackOpIsEmpty()) return 0; stackop.sp--; *output=stackop.item[stackop.sp]; return 1; } int StackOpTop(void) { if(StackOpIsEmpty()) return 0; return stackop.item[stackop.sp-1]; } int IsOperator(int data) { if(data=='+') return 1; if(data=='-') return 1; if(data=='*') return 1; if(data=='/') return 1; if(data=='^') return 1; //if(data=='log10') // return 1; return 0; } int Priority(int data) { if(data=='+') return 1; if(data=='-') return 1; if(data=='*') return 2; if(data=='/') return 2; if(data=='^') return 3; //if(data=='log10') // return 4; return 0; } struct __postfix { unsigned char item[DATA_MAX]; int index; }postfix={"",0}; void InfixToPostfix(void) { int i; int P; int data; // initial StackOpInit(); postfix.index=0; for(i=0;i<infix.index;i++) { P=infix.item[i]; if(IsOperator(P)) { while(Priority(StackOpTop()) >= Priority(P)) { StackOpPop(&data); postfix.item[postfix.index]=data; postfix.index++; } StackOpPush(P); } else if(P=='(') { StackOpPush(P); } else if(P==')') { while(StackOpPop(&data)) { if(data=='(') break; postfix.item[postfix.index]=data; postfix.index++; } } else { //operand postfix.item[postfix.index]=P; postfix.index++; } } while(StackOpPop(&data)) { postfix.item[postfix.index]=data; postfix.index++; } //end buffer/string postfix.item[postfix.index]='\0'; } int CalculatePostfix(void) { int i; int P; int data; int result; // type: int StackOpInit(); for (i=0;i<postfix.index;i++) { P=postfix.item[i]; if(IsOperator(P)) {//found operator int operand1,operand2; // 1 Operator 2 Operand // 1 Operator 1 Operand -> final project StackOpPop(&operand2); StackOpPop(&operand1); switch(P) { case'+': data=operand1+operand2; break; case'-': data=operand1-operand2; break; case'*': data=operand1*operand2; break; case'/': data=operand1/operand2; break; case'^': data=pow(operand1,operand2); break; default: data=0;break; } StackOpPush(data); } else {//found operand char buffer[10]; buffer[0]=P; buffer[1]='\0'; StackOpPush(atoi(buffer)); } } StackOpPop(&result); return result; } void Calculator(void *parameter) { unsigned char datain; if(getchar(&datain)) { switch(datain) { //enter case 13: if(infix.index>0) { printf("\r\ninfix: %s",infix.item); InfixToPostfix(); printf("\r\npostfix: %s",postfix.item); printf("\r\nAns: %d",CalculatePostfix()); } infix.index=0;//clear index for new recive printf("\r\nz:\\> "); break; //backspace case 8: //echo //step if(infix.index>0) { printf("%c",8); printf(" "); printf("%c",8); infix.index--; } break; default: //echo printf("%c",datain); //save infix.item[infix.index]=datain; infix.index++; //delete item infix.item[infix.index]='\0'; break; } } } void main(void) { //------------------------------------------------------- //- driver initial LEDPhy_Init(); ButtonPHY_Init(); //- end driver initial //------------------------------------------------------- BaseTimeInit(); Sci1Init(); AdcInit(); DacInit(); //- app with task BoardMessage(); TaskInit(); LedInit(); //create task TaskCreate(TestFilter,&filter,10,"Filter"); TaskCreate(Calculator,0,10,"Cal"); //want to repeat must to create T //- task monitor TaskMonitor(); printf("\r\nCalculator"); for(;;) { TaskRun(); } } void BoardMessage(void) { //- wellcom message printf(STR_PARTITION); printf(VERSION); printf(SW_VERSION_STR); printf(MODIFY_BY); printf(COPY_BY); printf("\r\n"); }


3212



Tag : - - - -


Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2019-11-22 12:43:32 By : damnern007 View : 87 Reply : 3
 

 

No. 1



โพสกระทู้ ( 9 )
บทความ ( 0 )



สถานะออฟไลน์


ลองเปลี่ยน int เป็น float ครับ
แล้วก็ เวลา printf(%d)
ก็เปลี่ยนเป็น printf(%.2f)
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-11-30 01:20:35 By : sujinda
 


 

No. 2



โพสกระทู้ ( 8,223 )
บทความ ( 2 )



สถานะออฟไลน์


ศึกษาเรื่องชนิดตัวแปรให้มากๆ นะครับ เพราะมีความจำเป็นมากในการเก็บข้อมูล และการคำนวณ

คือการศึกษาจากโค๊ดคนอื่นมันก็ดี แต่ควรจะอ่าน document ของแต่ละภาษาที่ใช้ด้วยนะครับ จะได้เข้าใจโครงสร้างการทำงาน
อะไรต่างๆ ได้ดีขึ้น
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-01 14:11:15 By : Chaidhanan
 


 

No. 3



โพสกระทู้ ( 3 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

เปลี่ยน int เป็น float ค่ะ

ลองศึกษาตัวแปรดูค่ะ
http://www.ppk.ac.th/programc/type2.htm
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-01 15:12:00 By : 1301025870102882
 


   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : [ภาษา C] ผมอยากให้เครื่องคิดเลขที่ผมทำสามารถคำนวณเลขทศนิยม 2 ตำแหน่งได้ครับ ตอนนี้ได้แค่จำนวนเต็ม
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม , รับทำบัญชี , โรงงานผลิตครีม

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2020 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 08-9968-0655 อัตราราคา คลิกที่นี่