[C++]算术计算器 简单计算+科学计算

用c++编写简易计算器 这个代码我认为已经比较清晰了,不需要写注释,因为能从输出直接看出功能。这个计算器支持方程运算,三角函数,能保存历史记录到log日志文件,但是在程序中查看这个功能还未完善。这里吐槽一下freopen的con功能,总是报错,受不了……废话不多说直接上代码。 阅读详情

help.txt

1.Simple Calculator可以解决加减乘除问题;输入形式如:1+2;(回车)
2.Scientific Calculator可以计算阶乘、开方、次方、粗略计算三角函数及反三角函数;具体格式见计算器提醒
3.Scientific Calculator可以存储计算结果。可以用()配合Ans1使用:1-(Ans1);也可以直接是1-ans1;


按任意键: 返回上一界面

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

主界面.cpp

#include <iostream>
#include "simple.h"
#include "calculate.h"
#include "info.h"

using namespace std;

int main()
{
    char choice='1';
    cout<<" ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂"<<endl;
    cout<<" ▏                       Simple Calculator                        ▏"<<endl;
    cout<<" ▏                                       By:XiXi                  ▏"<<endl;
    cout<<" ▏----------------------------------------------------------------▏"<<endl;
    cout<<" ▏Please choose the kind of calculator:                           ▏"<<endl;
    cout<<" ▏                       1.Simple Calculator                      ▏"<<endl;
    cout<<" ▏                       2.Scientific Calculator                  ▏"<<endl;
    cout<<" ▏                       3.help                                   ▏"<<endl;
    cout<<" ▏                       4.add constant(添加你的常量)             ▏"<<endl;
    cout<<" ▏                       5.show your constant                     ▏"<<endl;
    cout<<" ▏                       0.exit                                   ▏"<<endl;
    cout<<" ▏----------------------------------------------------------------▏"<<endl;
    cout<<" ▏----------------------------------------------------------------▏"<<endl;
    cout<<" ▏You can find more infomation in 'help.txt' in the folder~~      ▏"<<endl;
    cout<<" ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂"<<endl;
    while(cin>>choice && choice!='0')
    {
        switch (choice)
        {
               case '1':
                    system("CLS");
                    scalculator();
                    break;
               case '2':
                    system("CLS");
                    calculator();
                    break;
               case '3':{
                    system("CLS");
                    read_info();
                    string s;
                    cin>>s;
                    system("CLS");}
                    break;
               case '4':
                    system("CLS");
                    add_con();
                    break; 
               case '5':
                    system("CLS");
                    for(int i=0; i<sel.size();i++)
                    cout<<sel[i].name<<'='<<sel[i].vv<<endl;
                    break;
               default:
                       system("CLS");
                       cout<<"invalid input!"<<endl;
                       break;
        }
        cout<<" ------------------------------------------------------------------"<<endl;
        cout<<" ▏Please choose the kind of calculator:                           ▏"<<endl;
        cout<<" ▏                       1.Simple Calculator                      ▏"<<endl;
        cout<<" ▏                       2.Scientific Calculator                  ▏"<<endl;
        cout<<" ▏                       3.help                                   ▏"<<endl;
        cout<<" ▏                       4.add constant(添加你的常量)             ▏"<<endl;
        cout<<" ▏                       5.show your constant                     ▏"<<endl;
        cout<<" ▏                       0.exit                                   ▏"<<endl;
        cout<<" ------------------------------------------------------------------"<<endl;
    }
    
    system("CLS");//clean the screen
    cout<<"Thank you for your using!"<<endl;
    
    char ch;
    cin>>ch;
    
    return 0;
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

cal_class.h

#include <iostream>

using namespace std;

const double preci=0.000001;//精度 
const int emax=1000;//表达式作为字符存入数组的最大长度 
const double PI=3.1415926535;


//--------------------------------------------------------------------
double change(int n)
{
       double x=1 ;
       while(n>0){x *=10;n--;}
       while(n<0){x /=10;n++;}
       return x;
}
 
//---------------------------------------------------------------------
double to_dou(char *f,char *e=0)//将字符串转化为double型 
{
        long int z=0,x=0,i=0,c=0,m=0,fs=0;
        char *hh=f;
        double result=0.0;
        //------------------------------------------------------------------
        if(*f=='+')f++;
        if(*f=='-'){fs=1;f++;}
        //------------------------------------------------------------------
        if(e==0)
        {
                int a=0;
                while(*(f+a)!='\0')a++;
                e=f+a-1;
        }
        while(f+m<=e){
                      if(*(f+m)=='/' || *(f+m)=='|')c=1;m++;
                      }
        m=0;
        //------------------------------------------------------------------
        if(c==0)
        { 
            while(f+m<=e){
               if(i==0 && 47<*(f+m) && *(f+m)<58){z++;}
               if(*(f+m)=='.'){i=1;}
               if(i==1 && 47<*(f+m) && *(f+m)<58){x++;}
               m++;
               }
               
            while(z>0)
            {
                      result=result+ ((*f-48) * change(z-1));
                      z--;
                      f++;
            }
            f++,m=1;                                      
            while(x>=m){
                        result+=((*f-48)*change(-m));
                        f++,m++;
                        }
        }
        //------------------------------------------------------------------
        else
        {
             double fz=0,fm=0;
             m=0,x=0;
             while(f+m<=e)
             {                                 
               if(i==0 && 47<*(f+m) && *(f+m)<58){z++;}
               if(*(f+m)=='/' || *(f+m)=='|'){i=1;}
               if(i==1 && 47<*(f+m) && *(f+m)<58){x++;}
               m++;
             }
            while(z>0)
            {
                      fz += ((*f-48)*change(z-1));
                      z--,f++;
            }                       
            f++;
            m=0;                   
            while(x>0)
            {
                      fm+=((*f-48)*change(x-1));
                      f++;
                      x--;
            }
            result = fz/fm;
        }
        //------------------------------------------------------------------
        if(fs==1)result*=-1;
        
        return result; 
}
//-----------------------------------------------------------------
//-自定义变量的结构体
struct val
{
       string name;//变量名 
       double vv;//变量值 
}; 
//---------------------------------------------------------------------
vector <val> sel;//自定义变量的存储向量
//-------------------------------------------------------------------
void add_con()//添加自定义常量 
{
     cout<<"define as: PI=3.14;\nATTENTION:pi is different from PI"<<endl;
     char input[emax],*readF,*readE;
     
label6:      cout<<"define(don't forget ';'):";
             cin>>input;
             readE=readF=input;
             val v;
             
               while(*readE != '='){v.name+=*readE;readE++;}
               readE++;
               
               readF=readE;
               while(*readE != ';')
               {
                          if(*readE>='0' && *readE<='9')readE++;
                          else {cout<<"WRONG DEFINE"<<endl;goto label7;}
               }
               v.vv=to_dou(readF,readE-1);
               sel.push_back(v);
               cout<<"add "<<v.name<<'='<<v.vv<<" success!"<<endl;      
             
label7:      cout<<"\n______________________________________________________________"<<endl;
             cout<<"press any key to continue...press Esc to exit:";cout.flush();
             if ( getch() == 27)
              {
                 system("CLS");
                 return;
              }
             else{
                 for(int i=0;i<49;i++)
                 cout<<"\b \b";
                 goto label6;
                 }
} 
//--------------------------------------------------------------------
bool is_right(char * readF)//判断是否是规定的操作符或数 
{
     if((*readF >='0'&& *readF <='9') || (*readF >='a'&& *readF <='z')
         ||(*readF >='A'&& *readF <='Z')|| *readF=='^' || *readF=='!'|| *readF==')'|| *readF=='('
         || *readF=='+' ||*readF=='-' ||*readF=='*' || *readF=='/'
         || *readF=='%' ||*readF=='|')
      return true;
      
      for(int i=0;i<sel.size();i++)
      if(*readF==sel[i].name[0])return true;
      
      return false; 
}

//------------------------------------------------------------------
struct elem//elements to save expression
{
        double num;
        char op;//operator
        char *func;//function
        char kind;//'N':num 'O':operator 'F':function
        elem *last;//last one
        elem *next;//next one
};

//--------------------------------------------------------------------
struct result_save//save as Ans1,Ans2,... 
{
       int no;
       double result;
       result_save *next;
};

//---------------------------------------------------------------------
int find_mdivisor(int n)//找出小于等于sqrt(n) 的最大约数 
{
    if(n==0)return 0;
    int q, mn;
    for(int i=1; i<=sqrt(n); i++)
    {
             q=i*i;
             q=n%q;
             if(q==0)mn=i;
    }
    return mn;
}



//--------------------------------------------------------

double fraction(double x,int m=1,bool js=1,bool FFM=0)//show in the form of fraction
{
       double a=1.1, b=1, k=0;
       if(m==0 && x==0){if(FFM==1)return 1;else return 0;}
       while((int)a != a)
       {
                    if(js>0 && a>=0 && (int)(a+preci)-a<preci && (int)(a+preci)-a>-preci)break;
                    if(js>0&&a<0 && (int)(a-preci)-a<preci && (int)(a-preci)-a>-preci)break;
                    
                    a=x*b;
                    b++;
                    if(b>10000){k=1;break;}
       }
       b--;
       
       if(FFM==1){return b;}
       if(k==1){if(m!=2)cout<<x;return 2;}
       else {
            if(b!=1) {if(m!=2)cout<<a<<"|"<<b;return 1;}
            else if(m!=2)cout<<a;
            return 0;
            }
}

//----------------------------------------------------------------------------
int root_mark(double x,int m=1,bool js=1)//show in the form of root_mark(根号)
{
    double a=1.1,b=1,k=0;
    int temp;
    if(m==0&&x==0)return 1;
    if(x==0) {if(m!=2)cout<<"0";return 1;}
    if(x-1<preci && x-1>-preci)
                      {if(m!=2)cout<<"1";return 1;}
    if(x<0) return 0;
    while((int)a !=a)
    {
                 if(js>0 && a>=0 && (int)(a+preci)-a<preci &&(int)(a+preci)-a>-preci)
                         {a=(double)(int)(a+preci);break;}
                 if(js&&a<0 && (int)(a-preci)-a<preci && (int)(a-preci)-a>-preci)
                            {a=(double)(int)(a+preci);break;}
                 a=x*b;
                 b++;
                 if(b>10000){k=1;break;}
    }
    b--;
    if(k==1){if(m!=2)cout<<"√"<<x;return 3;}
    
    temp=find_mdivisor((int)(a*b));
    a=a*b/(temp*temp);
    if(temp/b != 1){
              if(m!=2)
              {
                      if(a!=1)cout<<"(";
                      fraction(temp/b);
                      if(a!=1)cout<<")";}
              }
              if(a!=1)
              {
                      if(m!=2)
                              cout<<"√"<<a;
                              return 2;
              }
    return 1;
}
---------------------------------------------------------------------------------------------------------------------------------------------
calculate.h

#include <conio.h>
#include <cmath>
#include "cal_class.h"
#include <vector>

int cal_simp(elem *parpF,elem *parpE,elem *parF=0,elem *parp=0) 
{
    elem *partemp,*partemp2,*partemp3,*partemp4;
    double temp1=0,temp2=0,temp3=0;
    bool i=0,i2=0;
    
    partemp=parpF->next;
    while(partemp->kind!=')')
    {
        if(partemp->op=='!')//处理阶乘
        {   partemp2=partemp->last;
            if(partemp2->kind!='N'){cout<<"\tINPUT ERROR:left number should be a number!"<<endl;return 0;}//!前一定要为'数'
            
            temp1=temp2=1;//阶乘运算 
            while(temp1<=partemp2->num)
            {temp2*=temp1;temp1++;}
            
            partemp2->num=temp2;//将结果存入被阶乘元素栏 
            partemp2->next=partemp->next;
            partemp4=partemp->next;
            partemp4->last=partemp2;
            free(partemp);//删除阶乘符号元素
            partemp=partemp2;//连接乘符号元素前后两元素为相邻元素
        }   
        partemp=partemp->next;
   }      

label5: partemp=parpE;
    while(partemp->kind!='(')
    {    
         if(partemp->op=='-')//处理负号 
         { 
           partemp2=partemp->last;
           partemp3=partemp->next;
           if(partemp3->kind=='F')//处理-sin30情况
           {
                   partemp=partemp3;
                   i2=1;           
                   goto label4;
           }
           
           if(partemp3->kind!='N'){cout<<"\t\tINPUT ERROR"<<endl;return 0;}
           if(partemp2->kind=='N')
           {   partemp3->num*=-1;
               partemp->op='+';
           }                                                                
           if(partemp2->kind=='('||partemp2->kind=='F'||partemp2->kind=='O')
           {   
               partemp3->num*=-1;
               partemp2->next=partemp3;
               partemp3->last=partemp2;
               free(partemp);
               partemp=partemp3;
           }
        } 
        partemp=partemp->last;
   }      
       
label3: partemp=parpF;
        while(partemp->kind!=')')
        {    
             if(partemp->op=='^')//次方
             {   
             partemp2=partemp->last;
             partemp3=partemp->next;
             if(partemp3 ->kind =='F')
             {
                         partemp=partemp3;
                         i=1;
                         goto label4;        
             }
             if(partemp2->kind!='N' || partemp3->kind!='N'){cout<<"\t\tINPUT ERROR:\n^ left and right should be a number"<<endl;return 0;}//^前后都要为'数'
             temp1=partemp2->num;
             temp2=partemp3->num;
             if(-1<temp2 && temp2<1 && temp2!=0 && temp1<0){cout<<"\t\tMATH ERROR"<<endl;return 0;}
             temp3=pow(temp1,temp2);
             partemp2->num=temp3;//保存入x
           
             partemp4=partemp3->next;
             partemp2->next=partemp4;
             partemp4->last=partemp2;
             free(partemp);free(partemp3);
             partemp=partemp2;
        } 
        partemp=partemp->next;
        }

        partemp=parpF;
        while(partemp->kind!=')')
        {    
             if(partemp->kind=='F')//处理函数运算
             {                   
label4:         partemp2=partemp->next;
                if(partemp2->kind!='N'){cout<<"\t\tINPUT ERROR"<<endl;return 0;}//'函数'后要为数 
                temp1=partemp2->num;
                switch (*partemp->func)
                {
                       case 'a':
                            switch (*(partemp->func+1))
                            {      
                                   case 's':
                                        if(temp1<-1||temp1>1){cout<<"\t\tMATH ERROR"<<endl;return 0;}
                                        temp2=asin(temp1)*180/PI;break;
                                   case 'c':
                                        temp2=acos(temp1)*180/PI;break;
                                   case 't':
                                        temp2=atan(temp1)*180/PI;break;
                            }
                            break;
                       case 'c':          
                            temp2=cos(temp1*PI/180);
                            break;
                       case 'l':
                            switch (*(partemp->func+1))
                            {
                                   case 'o':
                                        if(temp1<0){cout<<"\t\tMATH ERROR"<<endl;return 0;}
                                        temp2=log(temp1);
                                        break;
                                   case 'n':
                                        if(temp1<0){cout<<"\t\tMATH ERROR"<<endl;return 0;}
                                        temp2=log10(temp1);
                                        break;
                            }
                            break;
                       case 's':
                            switch (*(partemp->func+1))
                            {
                                   case 'i':
                                        temp2=sin(temp1*PI/180);break;
                                   case 'q':
                                        if(temp1<0){cout<<"\t\tMATH ERROR"<<endl;return 0;}
                                        temp2=sqrt(temp1);
                                        break;
                            }
                            break;
                            case 't':
                                 temp2=tan(temp1*PI/180);
                                 break;//tan
                       default:
                               cout<<"\t\tINPUT ERROR"<<endl;return 0;
                       }
                       
                partemp2->num=temp2;//将结果放在函数的参数项中
                partemp4=partemp->last;
                partemp4->next=partemp2;
                partemp2->last=partemp4;
                free(partemp);//删'函数'元素项
                partemp=partemp4;
                if(i==1){i=0;goto label3;}//对应上"处理5 ^ sin 30这种情况"让其变为5 ^ 0.5
                if(i2==1){i2=0;goto label5;}//对应上 处理- sin 30这种情况 让其变为- 0.5
                } 
                partemp=partemp->next;
      }


      partemp=parpF;
      while(partemp->kind!=')')
      {                        
        if(partemp->op=='*')//处理乘法运算
        {   
        partemp2=partemp->last;
        partemp3=partemp->next;
        if(partemp2->kind!='N'||partemp3->kind!='N'){cout<<"\t\tINPUT ERROR"<<endl;return 0;}//*前后都要为'数'
        
        temp1=partemp2->num*partemp3->num;
        partemp2->num=temp1;
        partemp4=partemp3->next;
        partemp2->next=partemp4;
        partemp4->last=partemp2;
        free(partemp);free(partemp3);
        partemp=partemp2;
        } 
        
        if(partemp->op=='/')//处理除法运算
        {   
        partemp2=partemp->last;
        partemp3=partemp->next;
        if(partemp2->kind!='N'||partemp3->kind!='N'){cout<<"\t\tINPUT ERROR"<<endl;return 0;}//*前后都要为'数'
        if(partemp3->num==0){cout<<"\t\tMATH ERROR"<<endl;return 0;}//除数不为0
        temp1=partemp2->num/partemp3->num;
        partemp2->num=temp1;
        partemp4=partemp3->next;
        partemp2->next=partemp4;
        partemp4->last=partemp2;
        free(partemp);free(partemp3);
        partemp=partemp2;
        } 
        partemp=partemp->next;
   }
   
   partemp=parpF;
   while(partemp->kind!=')')
   {    if(partemp->op=='+')//处理加法运算
        {   partemp2=partemp->last;
        partemp3=partemp->next;
        if(partemp2->kind!='N'||partemp3->kind!='N'){cout<<"\t\tINPUT ERROR"<<endl;return 0;}//*前后都要为'数'
        temp1=partemp2->num+partemp3->num;
        partemp2->num=temp1;
        partemp4=partemp3->next;
        partemp2->next=partemp4;
        partemp4->last=partemp2;
        free(partemp);free(partemp3);
        partemp=partemp2;
        } 
   partemp=partemp->next;
   }


    partemp=parpF->next;
    partemp2=partemp->next;
    if(parpF->num==125&&parpE->num==-125){return 2;}//最外括号
    else{
             if(parpE->num ==-125)//反括号为最外括号 但正括号不为
             {
                           partemp2=parpF->last;
                           partemp2->next=partemp;
                           partemp->last=partemp2;
                           free(parpF);
                           return 1;
             }
             partemp2=parpE->next;
             partemp2->last=partemp;
             partemp->next=partemp2;
             free(parpE);
             partemp3=parpF->last;
             partemp3->next=partemp;
             partemp->last=partemp3;
             free(parpF);
             return 1;
        } 
}


double cal(int k,result_save *p)
{
        char input[emax],*readF,*readE;//save expression ,and the first and the end
        int i=0;
        elem *parF,*parE,*parp;//表达式首尾部分 
        result_save *MP;
        cout<<"Expression:";cout.flush();
        cin>>input;
        
       parF=parE=parp=new elem;//建立一个简单的双向链表以存储表达式 
       parF->kind='(';//let first elem to be '('
       parE->num=125;//125~first,-125~end
       parE->op='\0';
       parE->func="\0\0\0\0\0";
       parE->next=new elem;
       parp=parE;
       parE=parE->next;
       parE->last=parp;
       parE->num=0;
       parE->op='\0';
       parE->func="\0\0\0\0\0";
       
       {
       int lp=0;//记录未配对的左括号 '('数 
       readF=input;
       while(*readF!='\0')
       {    
            
               //----自定义常量----------------------------------------------
label1:    for(int i=0; i<sel.size(); i++)
          {
                  int j;
                  if(*readF == sel[i].name[0])
                  {
                            readE=readF;
                            for(j=0;j<sel[i].name.length();j++,readE++)
                            if(*readE != sel[i].name[j])break;
                  
                          if(j<sel[i].name.length())readE=readF;//如果不是就退回
                          else  
                          {
                                parE->num=sel[i].vv;//提取
                                parE->kind='N';
                                parE->next=new elem;
                                parp=parE;
                                parE=parE->next;
                                parE->last=parp;
                                parE->num=0;
                                parE->op='\0';
                                parE->func="\0\0\0\0\0";
                                readF=readE;
                          }
                  }
          }      
             
             //-是调用已有结果 ------------------------------------------------------------ 
             if(tolower(*readF)=='a' && tolower(*(readF+1))=='n' && tolower(*(readF+2))=='s')
            {
               int reorder,i=1;
               readF+=3;readE=readF;
               while('0'<=*readE && *readE<='9')readE++;
               readE--;
               parE->kind='N';
               reorder=(int)to_dou(readF,readE);
               if(reorder>=(k-1)){cout<<"\t\tCANNOT FOUND THE MEMORIED NUMBER"<<endl;return 0;}
               MP=p;
               while(i<reorder){MP=MP->next;i++;}
               parE->num=MP->result;//提取记忆数
                    parE->next=new elem;
                 parp=parE;
                 parE=parE->next;
                 parE->last=parp;
                 parE->num=0;
                 parE->op='\0';
                 parE->func="\0\0\0\0\0";
                 readF=readE;readF++;
            }
            
           
            //----------------------------------------------------------------------------
          else if(is_right(readF)==0){cout<<"\t\tUNKNOW CHAR"<<endl;return 0;}//判断不是可识别的字符
           
           //--数字-------------------------------------------------------------- 
           else if(('0' <=*readF && *readF<='9'))
           { 
                   bool i=0;//是否有此数标识
                   readE=readF;
                   while (true)//确定此数尾数
                   {
                         if(('0'>*readE || *readE>'9') &&*readE!='|' &&*readE!='.')break;//非数的时候结束
                         if(readE=='\0'){readE--;break;}//超出了算式字符串时结束
                         readE++;
                         }
                         readE--;//退回到数字的最后一位 
                         parE->num=to_dou(readF,readE);
                         parE->kind='N';
                         parE->next=new elem;
                         parp=parE;
                         parE=parE->next;
                         parE->last=parp;
                         parE->num=0;
                         parE->op='\0';
                         parE->func="\0\0\0\0\0";
                         
                         while(('0'<=*readF && *readF<='9') || *readF=='|' ||*readF=='.')readF++;
      
                         if((64<*readF && *readF<91) || (96<*readF&&*readF<123) || *readF=='(')//补充省略的*
                         {
                                       parE->op='*';
                                       parE->kind='O';
             
                                       parE->next=new elem;
                                       parp=parE;
                                       parE=parE->next;
                                       parE->last=parp;
                                       parE->num=0;
                                       parE->op='\0';
                                       parE->func="\0\0\0\0\0";
                         }
             }
          
        
        //----运算符------------------------------------------------------------------- 
          else if(*readF=='+' || *readF=='-' || *readF=='*' || *readF=='/' || *readF=='^' ||*readF=='!')
          {
                         parE->op=*readF;
                         parE->kind='O';
                         parE->next=new elem;
                         parp=parE;
                         parE=parE->next;
                         parE->last=parp;
                         parE->num=0;
                         parE->op='\0';
                         parE->func="\0\0\0\0\0";
                         readF++;
          }
           
            //---函数sin...---------------------------------------------
          else if((64<*readF && *readF<91)||(96<*readF&&*readF<123))
          {   
                        if(tolower(*readF)=='a' && tolower(*(readF+1))=='n' && tolower(*(readF+2))=='s')
                        goto label1;
                        switch (*readF)
                        {
                               case 'a':
                                    switch (*(readF+1))
                                    {
                                           case 's':
                                                parE->func="asin";
                                                break;
                                           case 'c':
                                                parE->func="acos";
                                                break;
                                           case 't':
                                                parE->func="atan";
                                                break;
                                           default:
                                                   cout<<"\t\tINPUT ERROR"<<endl;return 0;
                                    }break;
                               case 'c':
                                    parE->func="cos";break;
                               case 'l':
                                    switch (*(readF+1))
                                    {
                                           case 'o':
                                                parE->func="log";
                                                break;
                                           case 'n':
                                                parE->func="ln";
                                                break;
                                           default:
                                                   cout<<"\t\tINPUT ERROR"<<endl;
                                                   return 0;
                                    }break;
                               case 's':
                                    switch (*(readF+1))
                                    {
                                           case 'i':
                                                parE->func="sin";
                                                break;//sin
                                           case 'q':
                                                parE->func="sqrt";
                                                break;//sqrt
                                           default:
                                                   cout<<"\t\tINPUT ERROR"<<endl;
                                                   return 0;
                                    }break;
                               case 't':
                                    parE->func="tan";
                                    break;//tan
                               default:
                                       cout<<"\t\tINPUT ERROR"<<endl;
                                       return 0;
                }
             parE->kind='F';
             parE->next=new elem;
             parp=parE;
             parE=parE->next;
             parE->last=parp;
             parE->num=0;
             parE->op='\0';
             parE->func="\0\0\0\0\0";
             
             while((64<*readF&&*readF<91)||(96<*readF&&*readF<123))readF++;
          }
           //---括号----------------------------------------------------
          else if(*readF == '(')
          {
                    parE->kind='(';
                    lp++;
                    parE->next=new elem;
                    parp=parE;
                    parE=parE->next;
                    parE->last=parp;
                    parE->num=0;
                    parE->op='\0';
                    parE->func="\0\0\0\0\0";
                    readF++;
          }
          else if(*readF ==')')
          {
                    if(lp==0){cout<<"\t\tMISS  '('"<<endl;return 0;}
                    parE->kind=')';
                    lp--;
                    parE->next=new elem;
                    parp=parE;
                    parE=parE->next;
                    parE->last=parp;
                    parE->num=0;
                    parE->op='\0';
                    parE->func="\0\0\0\0\0";
                    readF++;
          }
        
        if(lp<0){cout<<"\t\tMISS  '('"<<endl;return 0;}//反括号数量多与正括号
        parE->kind=')';
        parE->num=-125;
        parE->next=NULL;
        } 
  

    //计算  
        elem *parp2,*parp3;
        int par_re;
label2: parp=parF;
        parp3=parE;//用parp2,parp3括出最中间的两个对应正反括号
        for( ; parp->next!=NULL; parp=parp->next)
        {
           if(parp->kind=='(')parp2=parp;
           if(parp->kind==')'){parp3=parp;break;}
        }
        
        par_re=cal_simp(parp2,parp3,parF);//先计算括号内结果 
        if(par_re==0){return 0;}//输入有错误
               //输出
        parp=parF->next;
       
        cout<<"Ans"<<k-1<<"=";
        while( parp->kind !=')' || parp->num!=-125)
        {
              if(parp->kind=='(')cout<<'(';
              if(parp->kind==')')cout<<')';
              if(parp->kind =='N')
               {
                   if(parp->num <= 0)
                    {
                                fraction(parp->num);
                                parp=parp->next;
                                continue;
                    }
                    if(root_mark(parp->num*parp->num,2) ==3)
                    {
                               cout.flush();
                               cout<<parp->num;
                               cout.flush();
                    }
                    else root_mark(parp->num*parp->num);
               }
              if(parp->kind=='O')cout<<parp->op;
              if(parp->kind=='F')cout<<parp->func;
              parp=parp->next;
       }
       cout<<endl;
       if(par_re==1)goto label2;//还有括号
       parp=parF->next;
    }
    
    return parp->num;
}

void delete_all(result_save * head)
{
     result_save * p=head;
     for( ;head != NULL; )
     {
               head=head->next;
               delete p;
               p=head;
     }
}
     
int calculator()
{
     cout<<" ▏------------------------------------------------------------------------▏"<<endl;
     cout<<" ▏①input your expression,then press 'Enter';                             ▏"<<endl;
     cout<<" ▏②we can do with:sin asin cos acos tan atan ln log sqrt (asin:arcsin)   ▏"<<endl;
     cout<<" ▏                 !   ()    ^:y^x为y的x次方                              ▏"<<endl;
     cout<<" ▏③we can do with fraction:1/2:1|2                                       ▏"<<endl;
     cout<<" ▏④we can record the results,you can input Ans1,Ans2...to find           ▏"<<endl;
     cout<<" ▏   and you can use it with '('')':1-(Ans1)                              ▏"<<endl;
     cout<<" ▏------------------------------------------------------------------------▏"<<endl;
     
     int k=1;//用来标识Ans的下标 
     result_save *p1,*p2;
     p1=p2=new result_save;//开一个新结果记录,并让p1,p2指向同一空间 
     p1->no=k;k++;//Ans(k) 
     
     while(true)
     {
            p1->result=cal(k,p2);//start a calculation
            
            cout<<"\n______________________________________________________________"<<endl;
            cout<<"press any key to continue...press Esc to exit:";cout.flush();
            if ( getch() == 27)
            {
                 system("CLS");
                 return 0;
            }
            else{
                 for(int i=0;i<49;i++)
                 cout<<"\b \b";
                 }
                     
     p1->next=new result_save;
     p1=p1->next;
     p1->no=k;k++;
     p1->next=NULL;
	}
	
	delete_all(p2);
	 return 0;
}

--------------------------------------------------------------------------------------------------------------------------

info.h

//读取帮助文件 
#include <fstream>
#include <iostream>

using namespace std;

const int l=100;//每一行的长度
 
void read_info()
{
    ifstream ios("help.txt");
    char s[l];//用于读取文件中的一行 
   
    for(int j=0;j<l;j++)
        s[j]='\t';
    while( ios.getline(s,l))
    {
           for(int i=0;i<l;i++)
           {
            if(s[i]!='\t')
               cout<<s[i];
           }
           cout<<endl;
           for(int j=0;j<l;j++)
           s[j]='\t';
    }
}

------------------------------------------------------------------------------------------------------------------------------------

simple.h

#include <iostream>
#include <string>
#include <vector>

using namespace std;

const char number='8';//we use const '8' to represent a number
const char quit='q';  //t.kind==quit means that t is a quit token
const char print=';'; //t.kind==print means that t is a print token
const string prompt="Expression:";
const string result="=";//used to indicate that what follows is a result

class Bad_area{};

void error(string s)
{
     cout<<s<<endl;
     throw Bad_area();
}

//定义项向量 
class Token{
      public:
             char kind;
             double value;
             
      Token(char ch)
            :kind(ch),value(0){}
      Token(char ch,double val)
            :kind(ch),value(val){}
};

//定义单词流      
class Token_stream
{
      public:
             Token_stream();
             Token get();
             void putback(Token t);
             void ignore(char c);
      private:
              bool full;
              Token buffer;
};

Token_stream::Token_stream()
:full(false), buffer(0)
{
}

void Token_stream::putback(Token t)
{
    if (full)
        error("putback() into a full buffer");
    buffer = t;
    full = true;
}

Token Token_stream::get()
{
    if (full){
              full=false;
              return buffer;
              }
    char ch;
    cin >> ch;

    switch (ch) {
    case print:
    case quit:
    case '(': case ')': case '+': case '-': case '*': case '/':case'%': 
        return Token(ch);
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);
            double val;
            cin >> val;
            return Token(number,val);
        }
    default:
        error("Bad token");
    }
}

void Token_stream::ignore(char c)//c represents the kind of Token
{
     //first look in buffer
     if(full&&c==buffer.kind){
                              full=false;
                              return;
                              }
     full=false;
     //now search input
     char ch='0';
     while(cin>>ch)
          if(ch==c)return;
}


double expression(Token_stream & ts2);

double primary(Token_stream & ts4)
{
       Token t=ts4.get();
       switch(t.kind){
                      case'(':                          //handle '('expression')'
                      {
                              double d=expression(ts4);
                              t=ts4.get();
                              if(t.kind!=')')
                                 error("')'expected");
                              return d;
                      }
                      case number:
                              return t.value;
                      case'-':                        //handle'-'primary e.g.(-1)+2
                              return 0-primary(ts4);
                      case'+':
                              return 0+primary(ts4);
                      default:
                              error("primary expected! Please enter ';' to go on:");
                      }
}

double term(Token_stream & ts3)
{
       double left=primary(ts3);
       Token t=ts3.get();
       
       while(true){
                   switch(t.kind){
                                  case'*':
                                          left*=primary(ts3);
                                          t=ts3.get();
                                          break;
                                  case'/':
                                          if(primary(ts3)==0)error("/ divide by zero.");
                                          else{
                                          left/=primary(ts3);
                                          t=ts3.get();}
                                          break;
                                  case'%':{
                                          double d=primary(ts3);
                                          int i1=int(left);
                                          if(i1!=left) error("left-hand operand of % not int");
                                          int i2=int(d);
                                          if(i2!=d) error("right-hand operand of % not int");
                                          if(i2==0) error("%divide by zero");
                                          left=i1%i2;
                                          t=ts3.get();
                                          break;
                                          }
                                  default:
                                          ts3.putback(t);
                                          return left;
                                  }
                   }
}

double expression(Token_stream & ts2)
{
       double left=term(ts2);
       Token t=ts2.get();
       
       while(true){
                   switch(t.kind){
                                  case'+':
                                          left+=term(ts2);
                                          t=ts2.get();
                                          break;
                                  case'-':
                                          left-=term(ts2);
                                          t=ts2.get();
                                          break;
                                  default:
                                          ts2.putback(t);
                                          return left;
                                  }
                   }
}
      
/*int keep_window_open(char ch)
{
    if(ch=='~'){
                cout<<"Calculator closed!\nPlease enter the character ~ to close the window"<<endl;
                char ch;
                while(cin>>ch){
                               if(ch=='~')
                               return 1;
                               }
                }
    else{
         cout<<"Calculator closed!\nPlease enter the character'q' to close the window"<<endl;
         char ok;
         while(cin>>ok){
                        if(ok=='q')
                         return 2;
                        }
         }
}*/

void clean_up_mess(Token_stream & ts5)
{
     ts5.ignore(print);
}

void calculate(Token_stream ts1)
{
     while (cin)
     try {
                cout<<prompt;
                
                Token t = ts1.get();
                
                while(t.kind==print)
                      t=ts1.get();
                if (t.kind == quit) return;
                ts1.putback(t);
                cout <<result<<expression(ts1)<<endl;
                }
     
     catch(Bad_area){
                      clean_up_mess(ts1);
                    }
}

int scalculator()
{
    cout<<"************************"<<endl;
    cout<<"|  Simple Calculator    |"<<endl; 
    cout<<"************************"<<endl;
    
    cout<<"Please enter expression(we can handle +、-、*、/、%):"<<endl;
    cout<<"add "<<print<<" to end expression(e.g. (1+2)*3;):"<<endl;
    cout<<"add "<<quit<<" to end calculating"<<endl;
    
    Token_stream ts;
    
    try{
    calculate(ts);
    system("CLS");//clean the screen
    return 0;
    }
        
    
    catch(...){
               cout<<"exception"<<endl;
               system("CLS");
               return 2;
               }
}




基于MFC和C++的科学计算器开发实战 本文还有配套的精品资源,点击获取 简介:这款科学计算器应用通过使用MFC框架和C++语言,实现了包括对数、指数和三角函数在内的高级数学计算功能。尽管目前存在未完成的调试,项目开发者应通过单元测试和集成测试来识别并修复潜在错误,同时优化用户体验和性能。本项目使用了MFC关键组件,如CWinApp、CDialog、CButton、CEdit等,并提供了源代码备份,为开发者进一步... 阅读详情

相关推荐

C#开发简单及科学计算器项目实战

C#作为微软推出的现代化、面向对象的编程语言,在Windows桌面应用程序开发中具有得天独厚的优势。它结合了强大的.NET框架与高效的开发工具(如Visual Studio),使得开发者能够快速构建稳定、安全、可维护的应用程序。本章将聚焦于一个典型项目实践:C#计算器开发,通过该项目,读者将掌握从界面设计、事件处理到核心逻辑实现的完整开发流程。本项目旨在实现一个功能齐全的桌面计算器,涵盖基础算术运算(加、减、乘、除)与科学计算功能(如幂运算、三角函数、对数运算等),并通过。

weixin_32921023的博客 923

java三角函数计算器_c++实现简单计算器

1 #include2 #include3 #include4 #include56 using namespacestd;78 //四则运算9 template classElementaryArithmetic{10 private:11 T result;12 T operand1, operand2;13 charoperators;14 public:15 //四则运算...

weixin_39811101的博客 519

简单Windows计算器功能解析与初学者实战指南

指数函数 $ f(x) = a^x $(其中 $ a > 0, a \neq 1 $)是最基本的非线性增长模型之一,在自然科学、经济学和信号处理中广泛应用。当底数 $ a = e \approx 2.71828 $ 时,得到自然指数函数 $ \exp(x) = e^x $,它具有独特的微分不变性:$ \frac{d}{dx}e^x = e^x $,这使其成为微分方程求解的核心工具。

weixin_32925455的博客 613

C++实现科学计算器(附源码)

文章目录C++实现计算器功能概述分析思路四则运算阶乘三角函数源码 C++实现计算器 前一段时间想巩固一下C++的知识点,就自己动手写了一个科学计算器,主要参考文章:C++实现计算器,又自己加了一些其他的功能。 功能概述 该计算器可以实现的功能为: 四则运算(能识别括号),并且支持小数 阶乘 三角函数和反三角函数 分析思路 下面我会依次分析各个功能中代码的思路 四则运算 四则运算应该是这个计算器...

melanchoe的博客 2万+

基于Qt C++的科学计算器项目实践:设计、实现与答辩

在现代软件开发中,Qt框架因其所提供的跨平台能力和丰富的库支持,成为了开发桌面应用和科学计算器的理想选择。本章将介绍Qt框架的核心概念及其在科学计算器应用中的具体实现方式。Qt是一个跨平台的应用程序和用户界面(UI)框架,由C++编写。Qt的主要特点包括:跨平台性:一套代码可以在不同的操作系统上编译和运行。丰富的控件库:提供各种UI控件,如按钮、文本框、滑动条等。信号与槽机制:用于对象间通信的机制,便于实现复杂的交互逻辑。

weixin_28931449的博客 1231

科学计算器项目实战:MFC与Visual C++应用开发

本文还有配套的精品资源,点击获取 简介:科学计算器是一个专门用于执行复杂数学运算的计算工具,适用于对数、指数、三角函数和复数运算等。本项目基于Microsoft Foundation Classes (MFC) 和 Visual C++ (VC)开发,利用MFC简化Windows API的使用,并构建用户界面和应用逻辑。项目中涉及创建窗口界面、处理用户输入、显示结果和执行计...

weixin_42465332的博客 1094

C++表达式求值

MFC表达式求值 表达式求值问题: 完成类似如下界面所示的表达式求值软件,输入包含加﹑减﹑乘﹑除﹑括号等运算符和0-9数字的表达式,输出表达式计算结果。 扩展要求(选作): (1)表达式包含多位整数甚至是小数,如(2.5+3.15)/0.69; (2)表达式包含特定函数,如: 1+sin(5+2/3)*3; 提交: 程序源代码(含注释)﹑程序报告文档,打包成压缩文件在课程网站上按规定时间提交。 补充说明: 编程语言:C/C++ 框架:MFC 支持的特定函数:sin、cos、tan等 实现含括号优先级、四则

程序设计 3975

c++计算器代码 包含三角函数运算

c++写的计算器运算代码,包含基本运算、三角函数运算、对数运算。

C++实现三角函数

c++中关于三角函数的使用

m0_64182150的博客 1万+

如何在C ++中实现科学计算器

使用编程语言进行数学实现的简要概述

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 388

QT实现计算器(包含科学计算与进制转换)

QT实现计算器(包含科学计算与进制转换) 【下载地址】QT实现计算器包含科学计算与进制转换 本项目是一个基于QT框架实现的计算器应用程序,不仅支持基本的算术运算,还包含了科学计算和进制转换功能。用户可以通过该计算器进行复杂的数学运算,并方便地进行不同进制之间的转换 ...

gitblog_09781的博客 593

使用petalinux做嵌入式设计开发(1)

1.创建vivado工程,建立硬件环境,最终导出hdf文件 既可以在windows系统下的vivado上编写硬件工程并导出hdf文件,也可以在linux系统下的vivado中编写硬件工程并导出hdf文件。(对于windows系统下导出的hdf文件还需要传递到linux系统下的文件夹中。) 2.以hdf硬件文件为基础创建,配置,编译,打包petalinux工程,导出linux系统所需镜像文件。 具体步骤: (0)设置环境变量 设置环境变量使得我们可以直接使用petalin...

plotup的博客 2076

【亲测免费】 开源计算器神器:基于QT的全能型计算工具

开源计算器神器:基于QT的全能型计算工具 【下载地址】QT实现计算器包含科学计算与进制转换 本项目是一个基于QT框架实现的计算器应用程序,不仅支持基本的算术运算,还包含了科学计算和进制转换功能。用户可以通过该计算器进行复杂的数学运算,并方便地进行不同进制之间的转换 ...

gitblog_09773的博客 752

Cisco三层交换机的详细配置

** 本文适用于新手小白以及微微基础的同学来用于参考,实验是在Cisco Packet Tracer Student 进行,实验最终效果如图所示,所有命令配置与图中的一致。 使用到的机器型号为:五台电脑,一台服务器,三个普通交换机(2960型号),一个三层交换机(3560-24PS),两台普通服务器(2811) 文章目录一、什么是三层交换机二、配置交换机步骤1.配置二层交换机2.配置三层交换机3.配置两台路由器以及最后一台电脑 一、什么是三层交换机 1.三层交换机 = 三层路由+二层交换机 2.工作在

真正的大师,永远都怀着一颗学徒的心。 4万+

十一种室内定位传感器方案汇总介绍与对比(机器人、物联网领域)

室内定位传感器方案汇总 目录 室内定位传感器方案汇总 1、定位方案概述 1.1、内定位系统有最基本的5种算法: 1.2、常用的室内定位技术主要包括以下几种: 1.3、定位理论 1.4、不同的定位方案对比 2、各种定位方案详细介绍 2.1、单线激光定位 2.2、多线激光定位: 2.3、视觉定位: 2.4、基于射频识别(RFID)技术室内定位 2.4.1、RFID标签(不涉及...

JK-Cool的博客 3万+

探索数学的无限可能:QT实现计算器

探索数学的无限可能:QT实现计算器 【下载地址】QT实现计算器包含科学计算与进制转换 本项目是一个基于QT框架实现的计算器应用程序,不仅支持基本的算术运算,还包含了科学计算和进制转换功能。用户可以通过该计算器进行复杂的数学运算,并方便地进行不同进制之间的转换 ...

gitblog_09789的博客 446

Android 13.0 Launcher3中去掉Hotseat功能实现

在13.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 1327

从Visual C++到快马AI:用智能编程平台快速构建C++计算器应用

对这类基础项目的开发效率提升明显。传统方式从安装Visual C++到完成第一个调试至少需要半小时,而用AI生成+在线调试全程只用了10分钟。对于需要快速验证想法的场景特别友好,推荐初学者尝试这种"先看结果再理解代码"的学习路径。最近在复习C++的基础知识,想用最经典的计算器小项目练手。传统方式需要用Visual C++配置环境、创建项目,但这次尝试了用。的AI辅助功能,发现效率提升了不少。

BlackStone33的博客 673

9.13华为OD机试真题 新系统 - 手机桌面整理 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【手机桌面整理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【 手机桌面整理】多语言题解。

qq_45776114的博客 638

《ATF(TF-A)专题精讲》目录——146篇,完整覆盖整个ATF的官方文档

本文摘要介绍了Trusted Firmware-A (TF-A)项目的技术文档体系。主要内容包括:项目概述、组件解析(如ARM RAS/RME/CCA等安全技术)、系统设计(启动流程、中断管理、信任链等)、开发指南(构建环境、移植策略)、性能分析、平台支持(涵盖NXP、Marvell、Xilinx等主流芯片厂商)、开发流程规范以及安全通告(CVE漏洞分析)。文档体系全面覆盖了ARM安全固件的技术实现、硬件适配和开发实践,为开发者提供了从理论到实践的完整参考。

Linux内核架构师 1113

Windows计算器:现代C++实现的多功能计算工具

Windows计算器是一个现代化的Windows应用程序,使用C++和C#编写,预装在Windows操作系统中。该应用提供标准计算器、科学计算器和程序员计算器功能,还包含各种单位换算和货币转换工具。项目采用任意精度算术运算,确保基本算术运算不会丢失精度。更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)

分享技术点滴 561

【大模型应用开发-大模型知识】(二)大模型分类和常见大模型

目前包含 Claude 和 Claude-Instant 两种模型可供选择,其中 Claude Instant 的延迟更低,性能略差,价格比完全体的 Claude-v1 要便宜,两个模型的上下文窗口都是 9000 个token(约 5000 个单词,或 15 页)它的目标是“更安全”、“危害更小”的人工智能。Google 还开发了多种 PaLM 的改进版本。更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。

1万+

【亲测免费】 MFC计算器:一个简洁高效的计算工具

MFC计算器:一个简洁高效的计算工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 MFC计算器是一个基于MFC(Microsoft Foundation Classes)框架开发的计算器应用程序,使用C++语言编写。该项目不仅实现了基本的算术运算功能,还提供了一个简洁直观的图形用户界面(GUI),使用户能够轻松进行各种计算操作。项目中包含了完整的源代码和详细的设计说...

gitblog_09750的博客 545

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC++写的计算器程序源代码

// jisuanqiDlg.cpp : implementation file // #include "stdafx.h" #include "jisuanqi.h" #include "jisuanqiDlg.h" #include "math.h" #ifde

1472

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于Qt-Creator开发的多功能Windows计算器

本文详细介绍了一款基于Qt框架开发的多功能Windows计算器应用程序。该计算器不仅实现了基础的数值运算功能,还创新性地集成了复数运算和几何图形计算等高级特性。项目采用C++语言开发,充分利用了Qt框架提供的丰富组件和信号槽机制,构建了一个界面友好、功能完备的现代计算器软件。通过合理的架构设计和模块划分,实现了高效的数据处理和运算功能,为用户提供了优质的计算体验。本文将从系统设计、功能实现、界面开发等多个维度,全面阐述该计算器的开发过程和技术特点。

weixin_63000012的博客 1054

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: [C++]图书管理 简版
下一篇: Red Hat Linux下安装使用双语对照工具champollion
sipprince
博客等级 码龄14年 19粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值