게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c언어 포인터 사용하는 방법좀 도와주세요 ^^//
게시물ID : computer_129402짧은주소 복사하기
작성자 : 내일의과거
추천 : 0
조회수 : 812회
댓글수 : 11개
등록시간 : 2013/11/21 23:16:14
몇일전에도 오류가 생겨서 도움을 요청한적이 있던 유저입니다. (그떄 도와주신 모든분들 감사드려요!)

덕분에 완성은 했는데..


1. 자료 입력
2. 자료 읽기
3. 총점과 평균
4. 등수 계산 
5. 자료 출력
 6. 종     료 

이런걸 만드는거거든요! 완성은 어찌저찌 했습니다! 그런데.. 교수님이 포인터를 이용해서 

2번을 하지않았으면 3,4,5번을 눌렀을떄 자료를 읽어오지 않아서 3,4,5번을 할 수 없습니다.
또 3번을 안했으면 4,5,번을 눌렀을떄 3번이없어서 못해요~
4번을안하면 5번을 눌렀을떄 4번이없어서 안되요~ 라는게 나오도록 해보라고하시는데 

포인터를 이용하라는점이 잘 와닫지가 않습니다.  우선 소스부터 적고 제나름대로 생각한거 적어볼게요~



#ifndef _TEST_H_

#define _TEST_H_

 

#include <stdio.h>

#include <windows.h> //Sleepsystem("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줄당i1씩올라간다

 

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을 포인터로 잡으신거이실까요?+ 저걸 어떻게 이용해야지 교수님이 원하시는걸 만들수있을까요 ㅠ



전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호