Member 14067314 Ответов: 3

Плз, мне нужна помощь, ребята. Проблема с графическим интерфейсом C++ (с MFC)


Привет, ребята.

Мне нужна помощь.

Я не знаю, как пользоваться МФЦ.

Но профессор хочет, чтобы я занялся этой проблемой.

Проблема заключается в создании "минимизатора карт Карно 2*4" с помощью C++

кроме того, я должен сделать графический интерфейс с MFC.

как это сделать с этой проблемой ??

пожалуйста, помогите!

Что я уже пробовал:

// ConsoleApplication9.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int GetWord();
void PutKar();
void SolveKar();
void SolveQuad();
void SolvePair(int single);
int CountQuadPair(int a);
void PrintKar();
void MatchFunc();

char *charArr = 0; //입력값을 저장할때 값의 주소값을 확인
int karnaughVar[8] = { 8,8,8,8,8,8,8,8 }; // 입력받는 변수를 저장
int karnaughVarNum = 0; //입력받는 변수의 개수를 저장
int errCode = 0;
int karMap[2][5][2] = { 0 }; //카르노맵을 표현하기위한 배열변수
int quad[6] = { 0 }; //함수식을 쓰기위해 어느 쿼드가 그룹되었는지 저장 순서는 0145가 처음 2064가 마지막
int pair[12] = { 0 }; //가로 페어 01 > 13 > 32 > 20 > 45 > 57 > 76 > 64 순 (옆으로 갔다 밑으로) 그다음 세로 페어 04가 처음 26이 마지막
int single[8] = { 0 }; //쿼드나 페어가 안됬을때 저장
char func[50] = { 0 }; 


int main(void)
{
 int i = 0;
 char inPutChar[30];
 char temp[5];

 printf("F = ∑(");
 scanf_s("%[^\n]", inPutChar,10);

 charArr = inPutChar;

 while (GetWord());

 if (errCode) return 0;

 PutKar();

 if (karnaughVarNum == 8)
 {
  sprintf_s(temp, "1");
  strcat_s(func, temp); //모든 함수가 1일때, 연산의 결과 temp에 저장
 }

 else if (karnaughVarNum == 0)
 {
  printf("값을 입력하지 않았습니다.\n"); //변수의 개수가 아무것도 없을 때 출력
  return 0;
 }

 else
 {
  SolveKar();

  MatchFunc();
 }

 PrintKar();


 return 0;
}


int GetWord()
{
 if (strchr(")", *charArr))  // strchr = 문자열에서 문자 검색. 8자리면 수동으로 했을 경우 많은 경우의수를 쓰겠지만 strchr 함수를 사용할 경우 한줄이면된다.
  return 0;


 if (strchr("01234567", *charArr))
 {
  karnaughVar[karnaughVarNum] = *charArr - 48;
  karnaughVarNum++;
  charArr++;
  return 1;   
 }

 else if (strchr(", ", *charArr))
 {
  charArr++;
  return 1;
 }

 else
 {
  printf("잘못 입력하였습니다. 입력할수있는 문자는 숫자(0 ~ 7), 반점, 괄호, 공백입니다.\n");
  errCode = 1;
  return 0;
 }

}

void PutKar() // 함수값을 넣는 과정 (PutKar에서의 순서는 0 1 3 2 
              //                    (                    4 5 7 6)
{
 int i, j;

 for (i = 0; i < 3; i++)
  for (j = 0; j < 4; j++)
   karMap[i][j][1] = 2; //입력받지않은 값은 2로 초기화 
         //페어나 쿼드로 묶여 있으면 1
         //안묶여있으면 0


 for (i = 0; i < 8; i++) 
 {                      
  switch (karnaughVar[i])  //0혹은 1이 들어갔을 때 함수가 출력되도록 함. 나머지 숫자가 들어갈경우 2로 초기화.(0,1이아니므로 출력X)
  {                      
  case 0:
   karMap[0][0][0] = 1;       //-> 최종에 printf에서 1로 출력
   karMap[0][0][1] = 0;       //-> 최종에 printf에서 0으로 출력
   break;
  case 1:
   karMap[0][1][0] = 1;
   karMap[0][1][1] = 0;
   break;
  case 2:
   karMap[0][3][0] = 1;
   karMap[0][3][1] = 0;
   break;
  case 3:
   karMap[0][2][0] = 1;
   karMap[0][2][1] = 0;
   break;
  case 4:
   karMap[1][0][0] = 1;
   karMap[1][0][1] = 0;
   break;
  case 5:
   karMap[1][1][0] = 1;
   karMap[1][1][1] = 0;
   break;
  case 6:
   karMap[1][3][0] = 1;
   karMap[1][3][1] = 0;
   break;
  case 7:
   karMap[1][2][0] = 1;
   karMap[1][2][1] = 0;
   break;
  }
 }

 for (i = 0; i < 2; i++)
 {
  karMap[i][4][0] = karMap[i][0][0]; // 맨앞, 맨뒤가 pair가 될 수 있으므로, (i,4) 함수를 (i,0) 함수와 같게 해준다.
  karMap[i][4][1] = karMap[i][0][1];
 }
}

void SolveKar() // 함수를 풀어, temp에 저장하는 과정
{
 int i, j;
 SolveQuad();

 SolvePair(0);

 SolvePair(1);

 for (i = 0; i < 2; i++)
 {
  for (j = 0; j < 4; j++)
  {
   if (karMap[i][j][0] == 1 && karMap[i][j][1] == 0) // &&는 AND를 의미. (i,j,0)이 1임과 동시에 (i,j,1)이 0이면 싱글로 저장된다.
   {                                                 // 이 과정이 i = 0,1 j = 0,1,2,3 반복. AND는 두 명제가 참일때 1이 됨.
    karMap[i][j][1] = 1;
    single[((i * 4) + j)] = 1;
    printf("single[%d]\n", (i*4)+j); 
   }
  }
 }
}

void SolveQuad()
{
 int i;

 for (i = 0; i < 3; i++)
 {   
  if (karMap[0][i][0] == 1 && karMap[0][i + 1][0] == 1 && karMap[1][i][0] == 1 && karMap[1][i + 1][0] == 1
   && (karMap[0][i][1] == 0 || karMap[0][i + 1][1] == 0 || karMap[1][i][1] == 0 || karMap[1][i + 1][1] == 0))
  {                               //(1 1 0 0)
   karMap[0][i][1] = 1;        //(1 1 0 0) 이면 쿼드, 오른쪽으로 한칸씩 증가함. 8개의 조건을 모두 만족해야 참값
   karMap[0][i + 1][1] = 1;   
   karMap[1][i][1] = 1;       
   karMap[1][i + 1][1] = 1;   //각 항이 쿼드나 페어로 묶여있을 때 개수체크.
   quad[i] = 1;              
   printf("quad[%d]\n", i);  //쿼드의 개수를 프린트함.
  }
 }

 if (karMap[0][0][0] == 1 && karMap[1][0][0] == 1 && karMap[0][3][0] == 1 && karMap[1][3][0] == 1         // (1 0 0 1)
  && (karMap[0][0][1] == 0 || karMap[1][0][1] == 0 || karMap[0][3][1] == 0 || karMap[1][3][1] == 0))   // (1 0 0 1)
 {
  karMap[0][0][1] = 1;
  karMap[0][3][1] = 1;
  karMap[1][0][1] = 1;
  karMap[1][3][1] = 1;
  karMap[1][4][1] = 1;
  karMap[1][4][1] = 1;
  quad[3] = 1;
  printf("quad[3]\n");  
 }  //정사각형 쿼드

 for (i = 0; i < 2; i++)
 {
  if (karMap[i][0][0] == 1 && karMap[i][1][0] == 1 && karMap[i][2][0] == 1 && karMap[i][3][0] == 1
   && (karMap[i][0][1] == 0 || karMap[i][1][1] == 0 || karMap[i][2][1] == 0 || karMap[i][3][1] == 0))
  {
   karMap[i][0][1] = 1;
   karMap[i][1][1] = 1;
   karMap[i][2][1] = 1;
   karMap[i][3][1] = 1;
   karMap[i][4][1] = 1;
   quad[i + 4] = 1; 
   printf("quad[%d]\n", i+4);  
  }
 } //가로 4개가 1일때 (1 1 1 1)
}       //                 (0 0 0 0)

void SolvePair(int single)
{
 int i, j;

 for (i = 0; i < 2; i++) //0,1
 {
  for (j = 0; j < 5; j++) //0,1,2,3,4 ( 4 = 0)
  {
   if (karMap[i][j][0] == 1 && karMap[i][j][1] == 0)
   {
    if (karMap[i + 1][j][0] == 1 && karMap[i + 1][j][1] == single) 
    {
     if (i + 1 <= 1 && j != 4)  //항과 아래항, != -> 같지 않음.
     {
      karMap[i][j][1] = 1;
      karMap[i + 1][j][1] = 1;
      pair[(i * 4) + j + 8] = 1;
      printf("pair[%d]\n", (i*4)+j+8);  
     }
    }

    else if (karMap[i - 1][j][0] == 1 && karMap[i - 1][j][1] == single) //항과 윗항
    {
     if (i - 1 >= 0 && j != 4)
     {
      karMap[i][j][1] = 1;
      karMap[i - 1][j][1] = 1;
      pair[i + j + 8 - 1] = 1;
      printf("pair[%d]\n", (i+j+8-1)); 
     }
    }

    else if (karMap[i][j + 1][0] == 1 && karMap[i][j + 1][1] == single) //항과 오른쪽항
    {
     if (j + 1 <= 4)
     {
      karMap[i][j][1] = 1;
      karMap[i][j + 1][1] = 1;
      if (j == 0)
       karMap[i][4][1] = karMap[i][0][1];
      else if (j == 3)
       karMap[i][0][1] = karMap[i][4][1];
      pair[(i * 4) + j] = 1;
      printf("pair[%d]\n", (i*4)+j); 
     }
    }

    else if (karMap[i][j - 1][0] == 1 && karMap[i][j - 1][1] == single) //항과 왼쪽항
    {
     if (j - 1 >= 0)
     {
      karMap[i][j][1] = 1;
      karMap[i][j - 1][1] = 1;
      if (j == 4)
       karMap[i][0][1] = karMap[i][4][1];
      pair[(i * 4) + j - 1] = 1;
      printf("pair[%d]\n", (i*4)+j-1);
     }
    }
   }
  }
 }
}

int CountQuadPair(int a) //페어, 쿼드의 개수를 'temp'에 저장하는 과정
{
 int i = 0, temp = 0;

 if (a == 1)
 {
  for (i = 0; i < 6; i++)  // quad일 때의 함수의 개수 temp에 저장 6가지 경우의 수. (4개짜리 4개, 6개짜리 2개 0145, 3276)
  {
   if (quad[i] == 1)
    temp += 1;
  }
 }

 else if (a == 2)
 {
  for (i = 0; i < 12; i++) //pair일때의 함수의 개수 temp에 저장. 01 > 13 > 32 > 20 > 45 > 57 > 76 > 64, 04 > 15 > 37 > 26 순으로 연산후 저장
  {
   if (pair[i] == 1)
    temp += 1;
  }
 }

 else if (a == 3)
 {
  for (i = 0; i < 8; i++) // single일 때의 함수의 개수 temp에 저장 0,1,2,3,4,5,6,7
  {
   if (single[i] == 1)
    temp += 1;
  }
 }

 return temp;
}


void PrintKar() // 위에서 저장받은 0,1값을 집어넣음. 
{
 printf("\n");
 printf("x|yz 00    01    11    10\n");
 printf("  ------------------------\n");
 printf("0|   %d |   %d |   %d |   %d |   Quad : %d개\n", karMap[0][0][0], karMap[0][1][0], karMap[0][2][0], karMap[0][3][0], CountQuadPair(1)); //
 printf("  ------------------------   Pair : %d개\n", CountQuadPair(2));
 printf("1|   %d |   %d |   %d |   %d |   Single : %d개\n", karMap[1][0][0], karMap[1][1][0], karMap[1][2][0], karMap[1][3][0], CountQuadPair(3));
 printf("  ------------------------   F : %s\n", func);
}

void MatchFunc() // temp에 저장되어있는 메모리에서 데이터를 가져오며, 최종함수 F에 결과값을 나타내는 과정 배열 'func' 가 함수의 최종연산값.
{
 int quadPairCount = CountQuadPair(1) + CountQuadPair(2) + CountQuadPair(3) - 1, i = 0;
 char temp[10] = { 0 };
 printf("%d\n", quadPairCount+1); 
 //sprintf = 문자배열 저장, 출력.
 if (quad[0] == 1) { sprintf_s(temp, "y`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (quad[1] == 1) { sprintf_s(temp, "z"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (quad[2] == 1) { sprintf_s(temp, "y"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (quad[3] == 1) { sprintf_s(temp, "z`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (quad[4] == 1) { sprintf_s(temp, "x`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (quad[5] == 1) { sprintf_s(temp, "x"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[0] == 1) { sprintf_s(temp, "x`y`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[1] == 1) { sprintf_s(temp, "x`z"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[2] == 1) { sprintf_s(temp, "x`y"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[3] == 1) { sprintf_s(temp, "x`z`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[4] == 1) { sprintf_s(temp, "xy`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[5] == 1) { sprintf_s(temp, "xz"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[6] == 1) { sprintf_s(temp, "xy"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[7] == 1) { sprintf_s(temp, "xz`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[8] == 1) { sprintf_s(temp, "y`z`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[9] == 1) { sprintf_s(temp, "y`z"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[10] == 1) { sprintf_s(temp, "yz"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (pair[11] == 1) { sprintf_s(temp, "yz`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[0] == 1) { sprintf_s(temp, "x`y`z`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[1] == 1) { sprintf_s(temp, "x`y`z"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[2] == 1) { sprintf_s(temp, "x`yz"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[3] == 1) { sprintf_s(temp, "x`yz`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[4] == 1) { sprintf_s(temp, "xy`z`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[5] == 1) { sprintf_s(temp, "xy`z"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[6] == 1) { sprintf_s(temp, "xyz"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
 if (single[7] == 1) { sprintf_s(temp, "xyz`"); strcat_s(func, temp); if (quadPairCount > i) { sprintf_s(temp, " + "); strcat_s(func, temp); i++; } }
}

3 Ответов

Рейтинг:
2

KarstenK

Некоторые советы:

а) пишите четкий код, ломг-имена и все на английском языке (также комментарии)
б) используйте классы в лучшем случае некоторой архитектуры MVVM
в) сделайте подзадачи (например, вычисление и графический интерфейс than
d) используйте проект Мастера MFC с CDocument (в OnDrawDocument вы рисуете выходные данные)
e) использовать тестовые данные
е) сделать вывод трассировки на наличие ошибок и крайние случаи
g) используйте VISUAL STUDIO и посетите некоторые учебные пособия

Удачи тебе с домашним заданием


Member 14067314

ОЧЕНЬ, ОЧЕНЬ СПАСИБО!!

Рейтинг:
1

OriginalGriff

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


Member 14067314

спасибо, я был слишком беспечен.

Рейтинг:
1

Richard MacCutchan

Видеть Настольные приложения MFC[^].


Member 14067314

Спасибо.