모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 게시물ID : jisik_74368
    작성자 : 으잉Ω
    추천 : 0
    조회수 : 744
    IP : 59.21.***.58
    댓글 : 2개
    등록시간 : 2010/04/01 21:34:15
    http://todayhumor.com/?jisik_74368 모바일
    이 소스는 뭐가 잘못된 건가요?
    C 로 카르노맵 짠건데 어떻게 고쳐야되죠...?
    고수님들 도와줘요~ 

     

     

     #include <stdio.h>
        int ncterm(register, char *, register);
        int pairing(int, int);
     int count(int, register);
     int primes(int, int);
     int originprime(register, register);
     int fepi();
     int reduction(int);
      
     int nvars;  
     int nterms = 1;  
     int nwords;  
     int minterm[256];
     int noterm[256]; 
     int impchart[256][48]; 
     int impcnt[256]; 
     int impext[256]; 
     int essprm[48]; 
     int imps = 0;  
     int priterm[48]; 
     int pricare[48]; 
     int pptr; 
     char func = 'f';
     char vname[12]; 
     char *fgets();

     struct list {
      int term;
      int oneterm; 
      int twoterm; 
      int nocare;
      int match;
      } 
     plist[9196];

     

     /*********************************main*********************************/

    void main(){

      int i, j;
       
      char in[120];
      char outline[120];
      char tterm[16];
      char vdig;

      register k=0, l=0, m=0;
      int flag = 0;
      char *gptr;

      register n, o;

      fprintf(stdout,"Input a logical expression, in sum of products form,\n");
      fprintf(stdout,"a,b,c,d..., a',b',c',d'\n");
      fprintf(stdout,"ex)ab'd+ac\n");


      gptr = fgets(in,120,stdin);

      nvars = 0;

      if ((gptr==NULL) || (in[0]=='\n')) {
       nvars =0;
       fprintf(stderr,"no input expression\n\n");
       main();
     }

      while (in[k] != '\n') {
       if ( in[k++] == '=' ) flag = k;
      }
      k = flag;

      while ( in[k] != '\n' ) {
       if ( in[k] == '+' ) {
        outline[l++] = in[k];
       } 
       else if ( in[k] == '\'' ) {
        outline[l] = outline[l-1];
        outline[l-1] = in[k];
        j++;
       } 
       else if (((in[k]>='a')&&(in[k]<='z')) || ((in[k]>='A')&&(in[k]<='Z'))) {
        outline[l++] = in[k];
        flag = 0;
        for ( m=0; m<nvars; m++ ) {
         if ( vname[m] == in[k] ) 
          flag = 1;
        }
        if ( flag == 0 ) {
         vname[nvars++] = in[k];
        }
       }
       k++;
      }
      outline[l++] = '+';


      for ( k=0; k<nvars; k++ ) {
       nterms *= 2;
      }
      nwords = ((nterms+(16-1))/16);
      k = 0;
      while ( k < nwords ) {
       for ( m=0; m<48; m++ ) 
        impchart[k][m] = 0;
       noterm[k] = 0;
       minterm[k++] = 0;
      }
      if ( nvars == 0 ) {
       fprintf(stderr," input is wrong\n");
       main();
      }
      m = 0;
      while ( m < l ) {
       tterm[nvars] = '1'; 
       for ( k=0; k<nvars; k++ ) 
        tterm[k] = 'X';
       while ( outline[m] != '+' ) {
        if ( outline[m] == '\'' ) {
         vdig = '0';
         m++;
        } 
        else vdig = '1';

        for ( k=0; k<nvars; k++ ) {
         if ( outline[m] == vname[k] ) {
          tterm[k] = vdig;
         }
        }
        m++;
       }
       ncterm(0,tterm,0);
       m++;
       
      }


      if ( (nvars > 0 ) && (nvars <= 12) ) {
       
       for ( o=0; o<nwords; o++ ) { //quine
        impcnt[o] = 0;
        impext[o] = 0;
       }
       for ( o=0; o<48; o++ ) {
        essprm[o] = 0;
       }
       for ( n=0; n<nterms; n++ ) {
        if ((((minterm[n/16]|noterm[n/16])>>n)&1) == 1 ) {
         plist[pptr].nocare = 0;
         plist[pptr].match = 0;
         plist[pptr].oneterm = 1;
         plist[pptr].twoterm = 0;
         plist[pptr++].term = n;
        
         if ( pptr >= 4096 ) {
          fprintf(stderr,"Too many minterms ( > %d )\n",4096);
          fprintf(stderr,"Process aborted\n");
          n = nterms;
          pptr = 0; 
         }
        }
       }
       pairing(0,pptr);
       i = fepi();
       reduction(i);
       }

      getchar();
    }

     

     


     /*********************************ncterm*********************************/

    int ncterm(register i,char *entry, register trm)


     {
      int num;
      char iterm;
      register j;

     if ( i >= nvars ) {
      sscanf(entry,"%d",&num);
      minterm[trm/16] |= num<<(trm);
      noterm[trm/16] &= ~(1<<(trm));
     } 
     else {
      sscanf(entry,"%1s",&iterm);
      if ( (iterm == '1') || (iterm == '0') ) 
      {
       trm = (trm<<1)|(iterm-'0');
       ncterm(i+1,entry+1,trm);
      } 
      else {
       trm = trm<<1;
       ncterm(i+1,entry+1,trm);
       trm |= 1;
       ncterm(i+1,entry+1,trm);
      }
     }
     return 0;
     }

     


     /*********************************pairing*********************************/

    int pairing(int first, int last)

     int first, last
     {
      int match = 0; 
      int submatch = 0;
      int diff, diffx = 0;
      int fterm, dterm; 
      register next;  
      int jstart, second; 
      int i, j2;
      register j, k;

      jstart = first;
      second = first;
      next = last; 
      j = jstart;
      j2 = jstart;
      while ( jstart< last-1 ) {
       while ( j2 < (last-1) ) {
        for ( k=second+1; k<last; k++ ) {
         if ((plist[j].nocare == plist[k].nocare ) && 
          (count(nvars,plist[j].term) == 
          (count(nvars,plist[k].term)-1))  && 
          (count(nvars,diff=(plist[k].term^plist[j].term))==1) ) {
          
          if ((diffx==0)||((((plist[j].term-fterm)%dterm) == 0) && (diff==diffx))){
           match = 1;
           submatch = 1;
           if ( diffx == 0 ) {
            dterm = plist[k].term-plist[j].term;
            fterm = plist[j].term;
           }
           plist[j].match = 1;
           plist[k].match = 1;
           plist[next].match = 0;
           plist[next].nocare = plist[j].nocare|diff;
           plist[next].term = plist[j].term;
           plist[next].oneterm = j;
           plist[next++].twoterm = k;      
           second = k;
           diffx = diff;
           j = ++k;
          }
         }
        }
        if ( submatch == 1 ) {
         second += 2;
         j = second;     
         submatch = 0;
        } 
        else {
         j = ++j;
         j2 = j;
         second = j;
        }
       }    
       if ( match == 1 ) {
        pairing(last,next);
        j2 = plist[last].oneterm;
        j = j2;
        second = plist[last].twoterm;
        next = last;
        match = 0;
        diffx = 0;
       } 
       else {
        jstart++;
        second = jstart;
        j = jstart;
       }
      }
      primes(first,last);
      return 0;
     }

     

     /*********************************primes*********************************/

    int primes(int first,int last)

     int first, last;
     {
      register i, j;
      int flag;
      int rep;
      int match;
      for ( j=first; j<last; j++ ) {
       if ( plist[j].match == 0 ) {
        flag = 0;
        for ( i=0; i<imps; i++ ) {
         if (count(nvars,plist[j].nocare) <= count(nvars,pricare[i]) ){
          if (((plist[j].nocare|pricare[i]) == (pricare[i])) &&
           (((~pricare[i])&priterm[i])==((~pricare[i])&plist[j].term))&&
           ((plist[j].term|priterm[i]|pricare[i]) ==
           (priterm[i]|pricare[i]))) {
           
           flag = 1;
          }
         } 
         else if (count(nvars,plist[j].nocare)>count(nvars,pricare[i])) {
          if (((pricare[i]|plist[j].nocare)==(plist[j].nocare)) &&
           (((~plist[j].nocare)&plist[j].term) ==
           ((~plist[j].nocare)&priterm[i])) &&
           ((priterm[i]|plist[j].term|plist[j].nocare) ==
           (plist[j].term|plist[j].nocare))) {
           
           flag = 2;
           rep = i;
          }
         }
        }

        if (flag == 0) {
         originprime(j,imps);
         priterm[imps] = plist[j].term;
         pricare[imps] = plist[j].nocare;
         imps++;
         if ( imps >= 48 ) {
          fprintf(stderr,"Warning, overflow of prime implicant chart\n");
          imps--; 
         }
        } 
        else if (flag == 2) {
         originprime(j,rep);
         priterm[rep] = plist[j].term;
         pricare[rep] = plist[j].nocare;
        }
       }
      }
      return 0;
     }

     

     /*********************************count*********************************/

    int count(len,term)

     int len;
     register term;  
     {
      register i;
      register count = 0;
      for ( i=0; i< len; i++ ) count+=(term>>i)&1;
      return(count);
    }


     /*********************************originprime*********************************/

    int originprime(j,imp)

     register j; 
     register imp; 
     {
      if ( j < pptr ) {
       impchart[plist[j].term/16][imp] |= (1<<(plist[j].term));
      } 
      else {
       originprime(plist[j].oneterm,imp);
       originprime(plist[j].twoterm,imp);
      }
      return 0;
     }


     /*********************************fepi*********************************/

    int fepi()

     {
      register i, j, k;
      int uncov;
      int temp;
      char echar;
      
      for ( i=0; i<nwords; i++ ) {
       for ( j=0; j<imps; j++ ) {
        impcnt[i] |= impchart[i][j];
       }
      }
      for ( i=0; i<nterms; i++ ) {
       temp = 0;
       for ( j=0; j<imps; j++ ) {
        temp += (((impchart[i/16][j]>>i))&1);
       }
       if ( temp >= 2 ) impext[i/16] |= (1<<(i));
      }
      for ( i=0; i<nwords; i++ ) {
       impcnt[i] &= ~noterm[i];
       impext[i] &= ~noterm[i];
       for ( j=0; j<16; j++ ) {
        if ( (((impcnt[i]>>j)&1) == 1) && (((impext[i]>>j)&1)==0) ) {
         k = 0;
         while ( ((impchart[i][k]>>j)&1) == 0 ) 
          k++;
         essprm[k] = 1;
        }
       }
      }
      fprintf(stdout,"\nPrime implicants & essential prime implicant ");
      for ( i=0; i<imps; i++ ) {
       if ( essprm[i] == 1 ) {
        echar = ' ';
        for ( j=0; j<nwords; j++ ) {
         impcnt[j] &= ~impchart[j][i];
        }
       } 
       else echar = ' ';
       fprintf(stdout,"\n%c ",echar);
       for ( j=0; j<nvars; j++ ) {
        if (((pricare[i]>>(nvars-1-j))&1) == 0) {    
         fprintf(stdout,"%c",vname[j]);
         if (((priterm[i]>>(nvars-1-j))&1) == 0) {
          fprintf(stdout,"'");
         }
        }
       }
       fprintf(stdout,"\t)) ");
       for ( j=0; j<nterms; j++ ) {
        if ( ((impchart[j/16][i]>>j)&1) == 1 ) 
         fprintf(stdout,"%d,",j);
       }
      }
      uncov = 0;
      for ( i=0; i<nwords; i++ ) {  
       uncov += count(16,impcnt[i]);
      }
      return(uncov);
     }

     

     /*********************************reduction*********************************/

    int reduction(uncov)

     int uncov;
     {
      register i,j;
      int nonemps;  
      int terms, lits;
      int nons[48];
      int termlist[256];
      int fail; 
      long limit, li;  
      char oper;  

      struct current {
       int terms;
       int lits;
       int list[48];
      } 
      curbest;
      
      if ( uncov == 0 ) {
       fprintf(stdout,"\n    ->minimal expression is unique\n\n");
      } 
      else {
       fprintf(stdout,"\n    ->no unique minimal expression\n\n");
       j = 0;
       for ( i=0; i<imps; i++ )
        if (essprm[i] == 0) nons[j++] = i;
        nonemps = j;
        if ( nonemps > 32 ) {
         fprintf(stderr,"Warning! Only 32 prime implicants");
         fprintf(stderr,"considered for coverage\n of all terms ");
         fprintf(stderr,"Make %d implicants!!\n", nonemps-(32));
         nonemps = 32;
        }
        if ( nonemps > 16 ) {
         fprintf(stdout,"Warning! Large number of cyclical prime implicants\n");
         fprintf(stdout,"Computation will take awhile\n");
        }
        limit = 1;
        for ( i=0; i<nonemps; i++ ) limit *= 2; 
        curbest.terms = 32000;
        curbest.lits = 32000;
        curbest.list[0] = -1;
        for ( li=1L; li<limit; li++ ) {
         terms = count(2*16,li);
         if ( terms <= curbest.terms ) {
          lits = 0;
          for ( i=0; i<nwords; i++ )
           termlist[i] = impcnt[i];
          for ( i=0; i<nonemps; i++ ) {
           if (((li>>i)&1L) == 1L) {
            for ( j=0; j<nterms; j++ ) {
             if (((impchart[j/16][nons[i]]>>j)&1)==1) {
              termlist[j/16] &= ~(1<<(j));
             }
            }
           }
           lits += (nvars - count(nvars,pricare[nons[i]]));
          }
          fail = 0;
          for ( i=0; i<nwords; i++ ) {
           if ( termlist[i]!=0 ) fail = 1;     
          }     
          if ((fail==0) && ((terms<curbest.terms) || (lits<curbest.lits))) {
           curbest.terms = terms;
           curbest.lits = lits;
           j = 0;
           for ( i=0; i<nonemps; i++ ) {
            if (((li>>i)&1L)==1L) { 
             curbest.list[j++] = nons[i];
            }
           }
           curbest.list[j] = -1;
          }
         }
        }
        j = 0;
        while ( curbest.list[j] >= 0 ) {
         essprm[curbest.list[j]] = 1;
         j++;
        }
      }
      fprintf(stdout,"\nminimal expression:\n\n     %c(",func);
      for ( i=0; i<nvars; i++ ) {
       fprintf(stdout,"%c",vname[i]);
       if ( i < nvars - 1 ) fprintf(stdout,",");
      }
      fprintf(stdout,")");
      oper = '=';
      for ( i=0; i<imps; i++ ) {
       if ( essprm[i] == 1 ) {
        fprintf(stdout," %c ",oper);
        for ( j=0; j<nvars; j++ ) {
         if (((pricare[i]>>(nvars-1-j))&1) == 0) {
          fprintf(stdout,"%c",vname[j]);
          if (((priterm[i]>>(nvars-1-j))&1) == 0) {
           fprintf(stdout,"'");
          }
         }
        }
        oper = '+';
       }
      }
      fprintf(stdout,"\n\n");
      return 0;
     }

    이 게시물을 추천한 분들의 목록입니다.
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.

    번호 제 목 이름 날짜 조회 추천
    209778
    섬유유연제 분무기 넣어서 쓰면 안되나요? [2] 별일없이산다 25/02/18 22:32 518 4
    209777
    BNB 체인이랑 솔라나 유행인가보네요 [3] ciwnlzk78 25/02/17 09:41 365 1
    209776
    이거 수도계량기 뭔가 잘못된거 같은데요... [1] 한달동안 25/02/15 04:02 630 1
    209775
    혹시 겨울철 한파때 물 틀어놓는거 언제까지 틀어야 하나요? [6] 한달동안 25/02/14 23:04 526 0
    209774
    바낸 알파 SHELL 핫하네요.. ecoejls 25/02/14 09:54 414 0
    209773
    글쓰기에 관해서 [5] 좋은펜 25/02/13 20:27 332 0
    209772
    계속 쓸지 말지의 질문. [5] 좋은펜 25/02/07 13:32 739 1
    209771
    벽 결로로 생긴 곰팡이 제거 영상 펌글 변태궁디Lv9 25/02/06 16:43 851 2
    209770
    유튜브 화면이 자동으로 설정화면이 안없어지네요. 아름다운시선 25/01/27 09:15 937 0
    209769
    이거 어디껀지 아시는분 있을까요? [3] 세기소녀30 25/01/12 18:19 1353 0
    209767
    수도요금 계산. 부탁 드립니다. [4] 아름다운시선 25/01/06 12:38 1550 0
    209766
    진짜 간만에 들어오는데 또또7 24/12/31 20:35 1351 0
    209765
    남자 옆머리 뜨는거 다운펌 말고 없나요?? [4] 짜라냥 24/12/28 23:29 1723 0
    209764
    평발 수술 재활 어느쪽? 짜라냥 24/12/26 23:00 1689 0
    209763
    구글보다 잘하는 문서번역기 써보세요 [2] rWhale 24/12/26 14:22 1528 1
    209762
    혹시 저처럼 겨울에 겨울잠 비슷하게 자는사람 있어요? [1] 변태궁디Lv8 24/12/22 16:31 1683 2
    209760
    전월세 전환율,,, 계산 ,,, 도와주세요ㅠ 찌끄릿 24/12/18 23:52 1565 0
    209759
    LH 임대주택 질문 드려요.. [2] 잠이가온다 24/12/10 21:16 1780 0
    209757
    여러분, 폐지 떨어진거 보이면 어떻게 하시나요? ㅗㅠㅑ 24/11/20 16:48 2213 3
    209755
    일상에서 받을 수 있는 신고 포상금 펌글 어벤져스a 24/11/15 16:33 2220 1
    209754
    그 여자분들 생리주기가 있잖아요? 섹스 주기적으로 하는게 어떤 영향이 ? [10] 변태궁디Lv7 24/11/15 13:54 2632 3
    209753
    4대보험 질문좀요 [2] 루드라 24/11/11 21:21 2111 1
    209752
    소설 초고쓰기 좋은펜 24/11/08 07:17 2098 1
    209751
    소설쓰기에 재능이 없는걸까요? [2] 창작글 좋은펜 24/11/05 20:54 2127 2
    209750
    18650 배터리팩 분리 [4] 창작글 뜨엽이 24/11/04 16:28 2462 0
    209749
    특비삼 이라는 뜻이 궁금합니다. [6] 미안2 24/11/03 17:51 2297 1
    209748
    오유 생활 라이프 질문 창작글펌글 민트날개 24/11/02 20:45 2071 0
    209746
    미디어 위키를 만들려는데, 창작글 민트날개 24/10/25 12:06 2276 0
    209744
    원룸 단체 인터넷 비용에 대한 조언 구합니다 [2] 대고참 24/10/21 19:45 2374 0
    209743
    PPT 꾸미기 창작글 애왕이 24/10/13 08:47 2553 2
    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈