분류 | 게시판 |
베스트 |
|
유머 |
|
이야기 |
|
이슈 |
|
생활 |
|
취미 |
|
학술 |
|
방송연예 |
|
방송프로그램 |
|
디지털 |
|
스포츠 |
|
야구팀 |
|
게임1 |
|
게임2 |
|
기타 |
|
운영 |
|
임시게시판 |
|
#ifndef _TEST_H_
#define _TEST_H_
#include <stdio.h>
#include <windows.h> //Sleep과system("cls")를사용하기위해추가
int MENU(const char fn[], int d[][6]); //메뉴
int FileDataInput(const char FN[]); //파일쓰기
int FileDataRead(const char FN[],int d[][6]); //파일읽기
int Total(const char FN[],int d[][6]); //총점구하기
int Rank(const char FN[],int d[][6]); //등수구하기
int Output(const char FN[],int d[][6]); //자료출력
#else
#endif
/////////////////////////////////////////
#include "test.h"
void main()
{
char fn[30]; //파일이름될것
int d[30][6]; //자료저장용
int *LineNum;
FILE*fp; //파일포인터
puts("*******************************");
printf("파일이름입력: ") ;
scanf("%s",fn); //파일의이름지정
fp=fopen(fn,"r"); //파일을읽기모드로열기
if (fp==NULL)
puts("파일생성에성공하였습니다.");//파일에아무것도없을경우
else //새파일이아닐경우
{
puts("이미작성된파일입니다.");
fclose(fp);
}
fp=fopen(fn,"a"); //이어적기형식으로열기
while (Menu(fn,&LineNum,d)) //메뉴를실행한다.
fclose(fp);
}
///////////////////////////////////
#include"test.h"
int Menu(const char fn[],int *LineNum, int d[][6]) //메뉴
{
int MenuNum; //메뉴의1~6번을담당할정수형변수
int a,i,t; //정수형변수a,i
//fn= 파일불러오기용, d[][0]=a / d[][1]=b / d[][2]=c / d[][3]=total / d[][4]=Ave
// d[][5]=Rank
puts ("*************************");
puts (" 1. 자료입력 ");
puts (" 2. 자료읽기 ");
puts (" 3. 총점과평균 ");
puts (" 4. 등수계산 ");
puts (" 5. 자료출력 ");
puts (" 6. 종 료 ");
puts ("*************************");
printf ("메뉴번호입력: ");
scanf ("%d", &MenuNum);
switch(MenuNum) //스위치
{
case 1:
FileDataInput(fn); //사용자지정함수FileDataInput
break
case 2:
*LineNum=FileDataRead(fn,d); //FileDataRead에서갖고온자료의개수를LineNum 에저장
printf("현재%d 개의자료가있습니다.\n",*LineNum);
printf("자료를보고싶으시면1번아니면그외의버튼을눌러주세요. : ");
scanf("%d",&a);
fflush(stdin);
if(a==1) // 입력받은값이1일경우이하를실행
{
for(i=0;i<*LineNum;i++)
printf("%3d %3d %3d\n",d[i][0],d[i][1],d[i][2]); //자료출력
puts("잠시후초기화면으로돌아갑니다.");
Sleep(i*500); //자료를볼수있도록자료수*0.5초만금쉼
system("cls"); //메뉴로돌아감
}
system("cls"); //화면지우고메뉴로돌아감
break
case 3:
t= 여기가 질문포인트!!! (밑에다적어둘게요^^)
if(t)
{
Total(fn,d); //사용자지정함수Total
puts("total정보가저장되었습니다.");
puts("잠시후초기화면으로돌아갑니다.");
Sleep(1000);
system("cls");
break
}
else
{
printf("자료읽기를먼저해주세요'5cn");
break
}
case 4:
Rank(fn,d); //사용자지정함수Rank
puts("Rank정보가저장되었습니다.");
puts("잠시후초기화면으로돌아갑니다.");
Sleep(1000);
system("cls");
break
case 5:
system("cls"); //단지깔끔함을위해추가
printf("자료를출력합니다.\n");
Output(fn,d); //사용자지정함수/전체출력
printf("\n\n");
break
case 6:
puts ("프로그램을종료합니다!!!"); //종료
return 0;
default :
puts ("메뉴번호를잘못입력했습니다. 다시입력하세요");
}
return 1;
}
int FileDataInput(const char FN[]) //사용자지정함수
{
int a,b,c;
char ch='y'
FILE*fp;
fp=fopen(FN,"a");
puts("***************************************");
while(ch=='y'||ch=='Y')
{
printf("세과목의점수입력: ");
scanf("%d%d%d",&a,&b,&c);
fprintf(fp,"%d %d %d\n",a,b,c);
printf("Coutinue(y/n)?");
fflush(stdin);
scanf("%c",&ch);
}
fclose(fp);
printf("파일에자료를출력했습니다.\n");
puts("***************************************"); //파일이어적기로열어서
//a b c를입력받아파일에저장
return 1;
}
int FileDataRead(const char FN[],int d[][6])
{
FILE*fp;
int i;
fp=fopen(FN,"r"); //파일을읽기모드로불러온다
if(fp==NULL) //파일이비어있으면끝
return 0;
i=0;
while((fscanf(fp,"%d%d%d",&d[i][0],&d[i][1],&d[i][2]))!=EOF)
i++; //비어있지않으면1줄당i가1씩올라간다
fclose(fp);
return i; // i를반환한다(이게LineNum)
}
int Total(const char FN[],int d[][6])
{
FILE*fp;
int j=0;
fp=fopen(FN,"r"); //파일을읽어왔는데이게비어있으면종료
if(fp==NULL)
while((fscanf(fp,"%d%d%d",&d[j][0],&d[j][1],&d[j][2]))!=EOF)
{
d[j][3]=d[j][0]+d[j][1]+d[j][2]; //비어있지않으면d[][3]에다가total을지정한다
d[j][4]=d[j][3]/3;
j++;
}
fclose(fp);
return 1;
}
int Rank(const char FN[],int d[][6])
{
FILE*fp;
int i=0,j=0,count=FileDataRead(FN,d);
fp=fopen(FN,"r");
if(fp==NULL) //파일을읽어왔는데이게비어있으면종료
while ((fscanf(fp,"%d%d%d", &d[i][0],&d[i][1],&d[i][2]))!=EOF)
{
d[i][5]=1; //Rank가될d[][4]를1로초기화
i++;
}
for(i=0; i<count-1; i++)
{
for(j=i+1; j<count; j++)
{
if(d[i][4]<d[j][4])
d[i][5]++; //d[i][3] 과d[j][3]을순차적으로비교해서
else if (d[i][4]>d[j][4])
d[j][5]++; // 작은숫자의d[][4](rank)를하나씩올린다(낮춘다)
else
}
}
fclose(fp);
return 1;
}
int Output(const char FN[],int d[][6])
{
FILE*fp;
int i,j,count;
fp=fopen(FN,"r");
if(fp==NULL)
count=FileDataRead(FN,d);
printf("과목과목과목 총점 평균 등수\n");
i=0;
while(i<count)
{
j=0;
while(j<6)
{
printf("%4d ",d[i][j]); //2~4번과정을통해얻은d[][1~5]를
j++; //순차적으로출력한다
}
printf("\n");
i++;
}
fclose(fp);
return 1;
}
음.. 우선은 이런 구조인데요..
실행은 잘되요 1~6번까지 원하는대로 구현도되구! 그런데
오늘 수업도중에 (수업에선 1~2까지만 만들고 나머지는 해오라고..하셨습니다 ㅋ..)
포인터로 LineNum 이놈을 잡더라구요.. 왜 이걸 포인터로 잡았는지 아직도 영 감이안옵니다 이걸사용하면 어떻게
2번을 안눌렀을때 3,4,5에서 2번안눌러서안되요~ 라고 뜨게할수있는거지요?
저는 처음에 리턴값이 1이니까 어떤 변수 하나주어주고
if(어떤변수=Total) 이런식으로하면 만약에 Total을 사용했다면 리턴 1(참)이되서 실행시키고 Total을 사용한적이없으면 진리값이 0으로 거짓이되서 실행이 안되게 하려했는데 이것도 안되더라구요..
대체 왜 LineNum을 포인터로 잡으신거이실까요?+ 저걸 어떻게 이용해야지 교수님이 원하시는걸 만들수있을까요 ㅠ
죄송합니다. 댓글 작성은 회원만 가능합니다.