UVa 327 計算簡單C運算式

來源:互聯網
上載者:User

標籤:uva

題意:給出一個C運算式,計算其值。其中運算元只有26個字母,從a到z依次初始值為1到26;操作符有二位的 + 和二位的 - ,和正常意思一樣,然後還有一位的自增 ++ 和一位的自減 - - ,都有首碼和尾碼兩種,都和正常理解的一樣。然後計算運算式值,並給出式子中的各變數最後的值。對了,每個變數在運算式中最多隻出現一次。

思路:題目最後也有給出思路,就是將所有一位操作符即自增和自減操作符去掉,再將有首碼操作符的變數自增或自減了,然後計算運算式的值,最後將有尾碼操作符的變數自增或自減。這裡只要在輸入串中尋找自增和自減操作符就行了,遇到的是首碼的就直接修改相應變數值,遇到尾碼的進行標記下。由於題目沒有提到空格的情況,開始用gets輸入,結果WA了,說明自增或自減操作符自己中間可能有空格,然後自增或自減操作符與修飾的那個變數之間可能有空格。(可能是前者,可能後者,也可能兩者都有)所以直接getchar過濾掉空格。但又要原樣輸入運算式,只好另存了一下。

注意:空格的情況。多處都有可能有空格。

吐槽:這題好像也挺簡單的哈,但是在白書的那個專題裡,8道題目中這道UVa通過率好像最低,還以為多難的~~~~唉,資料不可信~~不可嚇自己~~

晚上還是要及時睡覺啊~就算偶爾看個精彩的比賽到一兩點,結束後就睡了吧,別破罐子破摔,搞到四五點再睡的話,休息到十二點也休息不過來了啊~~  睡不好,幹什麼都不行,什麼都不相干,甚至連電影都懶得看,生活就會變糟~

Code:

#include<stdio.h>#include<string.h>#define MAXN 120char exp[MAXN];char ysexp[MAXN];int zm[30];int hz[30];bool flag[30];int main(){ //while(fgets(exp,MAXN-1,stdin)!=NULL) //while(gets(exp)!=NULL) char ch; while((ch=getchar())!=EOF) {  int cnt=0;  int yscnt=0;  do  {   ysexp[yscnt++]=ch;   if(ch!=' ') exp[cnt++]=ch;     }while((ch=getchar())!='\n');  ysexp[yscnt]='\0';  exp[cnt]='\0';  printf("Expression: %s\n",ysexp);  for(int i=0;i<26;++i)  { zm[i]=i+1; hz[i]=0; flag[i]=0;}  char *s=exp;            while((s=strstr(s,"++"))!=NULL)  {   if(*(s+2)=='\0' || *(s+2)=='-' || *(s+2)==' ')   {//尾碼     hz[*(s-1)-'a']++;    *s=' '; *(s+1)=' ';                 }                else   {//首碼     zm[*(s+2)-'a']++;    *s=' '; *(s+1)=' ';      }   //s++;        }      s=exp;  while((s=strstr(s,"--"))!=NULL)  {   if(*(s+2)=='\0' || *(s+2)=='+' || *(s+2)==' ')   {    hz[*(s-1)-'a']--;      *s=' '; *(s+1)=' ';                }                    else   {    zm[*(s+2)-'a']--;    *s=' '; *(s+1)=' ';      }                //s++;  }  //計算  s=exp;  while(*s<'a' || *s>'z') s++;//直到*exp為小寫字母  int val=zm[*s-'a'];  flag[*s-'a']=1;  char c;   while((c=*s)!='\0')            {   if(c=='+')   {    while(*s<'a' || *s>'z') s++;//直到*exp為小寫字母    val+=zm[*s-'a'];      flag[*s-'a']=1;          }                     else if(c=='-')   {    while(*s<'a' || *s>'z') s++;    val-=zm[*s-'a'];    flag[*s-'a']=1;       }            s++;   }  printf("    value = %d\n",val);  for(int i=0;i<26;++i)  if(flag[i])  {   zm[i]+=hz[i];   printf("    %c = %d\n",'a'+i,zm[i]);  } } return 0;   }


UVa 327 計算簡單C運算式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.