모바일 오유 바로가기
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
    조회수 : 739
    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 초과시 해당없음)

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

    번호 제 목 이름 날짜 조회 추천
    209755
    일상에서 받을 수 있는 신고 포상금 펌글 어벤져스a 24/11/15 16:33 186 1
    209754
    그 여자분들 생리주기가 있잖아요? 섹스 주기적으로 하는게 어떤 영향이 ? [9] 변태궁디Lv7 24/11/15 13:54 327 3
    209753
    4대보험 질문좀요 [1] 루드라 24/11/11 21:21 252 1
    209752
    소설 초고쓰기 좋은펜 24/11/08 07:17 360 1
    209751
    소설쓰기에 재능이 없는걸까요? [2] 창작글 좋은펜 24/11/05 20:54 402 2
    209750
    18650 배터리팩 분리 [3] 창작글 뜨엽이 24/11/04 16:28 661 0
    209749
    특비삼 이라는 뜻이 궁금합니다. [6] 미안2 24/11/03 17:51 595 1
    209748
    오유 생활 라이프 질문 창작글펌글 민트날개 24/11/02 20:45 487 0
    209746
    미디어 위키를 만들려는데, 창작글 민트날개 24/10/25 12:06 762 0
    209744
    원룸 단체 인터넷 비용에 대한 조언 구합니다 [2] 대고참 24/10/21 19:45 813 0
    209743
    PPT 꾸미기 창작글 애왕이 24/10/13 08:47 1079 2
    209742
    로또가 정부꺼였어요?? [8] 변태궁디Lv5 24/10/10 17:12 1376 3
    209740
    수학문제 도움 !! [5] 유전자몰빵 24/10/09 17:02 1047 1
    209738
    올해 연말정산 준비에 알면 좋은 정보 치킨런레벨2 24/09/26 17:59 1330 0
    209737
    캐나다에 택배 보낼게 있는데요 [2] 행자는파괴신 24/09/24 15:08 1350 0
    209736
    이거 어떻게 지우나요 [2] 아름다운시선 24/09/22 04:50 1409 0
    209733
    엑셀 고수님들 찾아요. [2] 베스트금지베오베금지 육구시타리아 24/09/05 10:43 1601 0
    209732
    네이버 블로그와 페이스북의 차이는 뭘까요? [2] 쌍파리 24/09/04 09:40 1594 0
    209731
    엑셀 수식 질문~~! [10] 무사신 24/09/03 16:42 1677 1
    209730
    PG-13등급에 대해서 인체물리학 24/09/01 02:27 1593 0
    209728
    혈당 전문가 계신가요? [9] 스노보더 24/08/25 09:20 1979 0
    209727
    회사에서 용접실을 만드는데.. [2] 착착착 24/08/22 10:50 2003 0
    209726
    외장하드 할당되지않음, 그리고 RAW [2] [진진] 24/08/20 10:12 1814 1
    209721
    방탈출 잘 아시는 분께 ! 너무 궁금해서요ㅜㅜ [1] 호생원 24/08/16 21:56 1740 1
    209720
    와이파이 회로차단기 탁탁거리는 현상 원인이 뭘까요? [9] 우가가 24/08/07 22:43 2033 0
    209719
    매제의 매제를 뭐라고 불러야 할까요? [4] xNellyx 24/08/04 19:26 2136 0
    209718
    헉헉 전등 잔광발생 원인 알아보는 영상 [2] 변태궁디Lv3 24/08/04 18:48 2015 1
    209717
    문뜩 남자 정력 따로 충전보관 가능했으면 좋겠음돠 [2] 변태궁디Lv3 24/08/04 11:48 2153 1
    209716
    아들래미 짤 편집좀 도와주세요 [2] 된장마왕 24/08/02 01:52 2137 1
    209715
    거래소 코인 메타가 다시 돌아오고 있는데? dsafadsf 24/07/28 12:00 2218 0
    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈