|
아래 변경된 코드를 참조하시기 바랍니다.
행복하세요.
//---------------------------------------------------------------------------
#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);
: }
:
: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|