C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[28871] Re:이 소스에서..
김용수 [heredity] 882 읽음    2004-02-22 01:10
아래 변경된 코드를 참조하시기 바랍니다.
행복하세요.


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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int cu=0, cut=0;   // 전역 변수로 선언해야 그 값이 지워지지 않고 유지 됩니다.
int nQuestion = 0; // 문제 번호(for문에 사용한 i 대용)입니다.

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  AnsiString asFile;   // 이 코드 추가 했습니다.
  // int cu=0, cut=0;  // 여기에 두면 매번 Stack에 변수가 만들어 지며, 또한 매번 0으로 초기화 됩니다.
  // RadioButton1->Checked = false; // 이 코드는 사용자가 선택한 TRadioButton을 Unchecked 상태로 만드므로
  // RadioButton2->Checked = false; // 사용자 선택을 무효화합니다. 이함수의 끝부분에 있어야 OK!!!

  // for(int i=0;i<=3;i++)  // Flow을 보면 한 문제를 읽어 보여준 후 사용자 입력을 기다리는 형태인데,
  // {                      // for loop를 돌리면 사용아 선택을 기다릴 수 없겠죠. i를 전역 변수로 처리해야 좋을 듯 합니다.
    switch (++nQuestion)    // i를 사용해도 문제가 안되지만 전역 변수로 쓰기엔 이름이 단순해서 바꿨습니다.
    {
      case 1:
        asFile = "c:\\ans1.txt"; // 이름이 "c:\ans번호.txt"의 형태라면 switch문을 쓸 필요가 없습니다.
        // Memo1->Lines->LoadFromFile("c:\\ans1.txt"); // File이 있는지 확인하는 Routine을 넣기 위해 & 중복을 피하기 위해 위치 이동합니다.
        // if(RadioButton1->Checked == true) // 동일 코드가 여러번 들어가 있군요. 위치를 조정하면 한번에 처리할 수 있겠군요.
        // {
        //     cu++;
        // }
        // else if(RadioButton2->Checked == true)
        // {
        //     cut++;
        // }
      break;
      case 2:
        asFile = "c:\\ans2.txt"; // 문제 file의 이름 규칙이 일정하지 않다고 가정했으므로 별도록 지정하는 코드를 유지도록 하였습니다. -.-;;
        // Memo1->Lines->LoadFromFile("c:\\ans2.txt");
        // if(RadioButton1->Checked == true)
        // {
        //     cu++;
        // }
        // else if(RadioButton2->Checked == true)
        // {
        //     cut++;
        // }
      break;

      default :
        asFile = "";
    }

    if( asFile == "" ) {
      ShowMessage( "수고하셨습니다." ); // 음~ 문제 풀기가 끝났다는 군요. 변수를 초기화 하도록 했습니다.
      nQuestion = 0;
    }
    else if( FileExists( asFile ) ) { // File이 존재하면 처리합니다.
      Memo1->Lines->LoadFromFile( asFile );

      cu  += (int) RadioButton1->Checked; // 이 부분은 if문을 써도 좋지만 지금과 같이 바꾸는 것도 보기에 좋을 것 같습니다.
      cut += (int) RadioButton2->Checked; // 즉, cu와 cut는 각 TRadioButton이 Checked상태일 때만 증가하도록 했습니다.
    }
    else {
      ShowMessage( asFile + " File이 존재하지 않습니다. 확인하십시오." );
    }
  // } // for block이 없어졌으니 이 코드도 당근 없어져야 겠군요. ^_^

  Edit1->Text = (cu*10) + (cut*10);  // TRadioButton이 눌린 정보(점수 ?)를 이곳에 출력했군요.
  RadioButton1->Checked = false;     // 위에 있던 코드를 이곳으로 옯겼습니다.
  RadioButton2->Checked = false;

  // 음~ 가만히 보니 보기 프로그램상에 문제가 조금 앴군요. 문제점은
  //   1. 예문(TRadioButton::Caption)이 언제나 설계시 값을 유지(변화 없음)하고 있음.
  //   2. TRadioButton을 누르지 않아도 다음 누제로 넘어감.
  //   3. 최초 실행시 문제가 나오지 않고 Button2를 눌러야 문제가 나옴.
  //   4. n번 문제가 화면에 출력됨과 동시에 사용자 선택을 바로 처리함. 앞뒤가 안 맞음.
  //   5. 문항수 만큼 문항 File("ans번호.txt")이 말들어 짐(관리가 어렵게 되죠~)
  // 등 입니다.
  // 여유를 가지고  차근차근 공부해 가면서 해결해 보시기 바랍니다.
  // -_-;;
}
----------------------------------------

아카시아 님이 쓰신 글 :
: 아래 소스는 제가 만든건데요,
: 도대체 왜 실행할때는 문제2번이 안나오는지 모르겠어요,ㅠ
: 디버깅할때는 잘만 되는데...
: 버튼2를 클릭했을때,
: 메모장에는 문제가 뿌려지구요,
: 예와 아니오의 항목이 라디오버튼으로 되어있는데,
: 예를 클릭하면cu가 ++되구요,
: 아니오 클릭하면 cut가 ++되요.
: 그리고 다음 문제로 넘어갈때마다 - 버튼2를 클릭할때마다 -
: 라디오버튼은 체크가 해제됩니다.
: 마지막으로 에디터박스에는 카운터한값들이 뿌려지는데..
:
: 도대체 어디서 문제가 생겨 제대로 실행이 안되는지 모르겠습니다.
: 제가 c++초보거든요;
: 고수님들께 조언 부탁드려요,ㅠㅠㅠㅠ
: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
:     int cu=0, cut=0;
:     RadioButton1->Checked = false;
:     RadioButton2->Checked = false;
:     for(int i=0;i<=3;i++)
:     {
:     switch (i)
:     {
:       case 1:
:         Memo1->Lines->LoadFromFile("c:\\ans1.txt");
:         if(RadioButton1->Checked == true)
:         {
:             cu++;
:         }
:         else if(RadioButton2->Checked == true)
:         {
:             cut++;
:         }
:       break;
:       case 2:
:         Memo1->Lines->LoadFromFile("c:\\ans2.txt");
:         if(RadioButton1->Checked == true)
:         {
:             cu++;
:         }
:         else if(RadioButton2->Checked == true)
:         {
:             cut++;
:         }
:       break;
:     }
:     }
:     Edit1->Text = (cu*10) + (cut*10);
: }
:
: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+ -

관련 글 리스트
28867 이 소스에서.. 아카시아 719 2004/02/21
28872     [답변] for문과 그 안에 있는 switch문을 잘 따라 가 보세요... 정성훈.해미 990 2004/02/22
34502         Re:[답변] for문과 그 안에 있는 switch문을 잘 따라 가 보세요... 정성훈.해미 936 2004/02/22
34501         Re:[답변] for문과 그 안에 있는 switch문을 잘 따라 가 보세요... 아카시아 834 2004/02/22
28871     Re:이 소스에서.. 김용수 882 2004/02/22
34500         Re:Re:이 소스에서.. 아카시아 807 2004/02/22
28868     Re:이 소스에서.. 18억 775 2004/02/21
34499         Re:Re:이 소스에서.. 아카시아 775 2004/02/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.