130814.8일차

|

헤더

#include <stdio.h>

#define SIZE 5

#define ROWS 3

#define COLS 7


#define ROW 3

#define COL 4


void disp( char * [] );

int disp( char *  );

void disp( char  (*ap)[COLS] );

void disp( char * name[] , int (*score)[COL] , double * avg );

void total( int (*score)[COL] ) ;

void average( int (*score)[COL] , double * avg  );


메인

#include "130814.h"



/*

void main()

{

// 숙제 1

// 문자열 세개를 함수로 출력한다

// 단 %c 만 사용해서 출력한다.

// 포인터 배열 둘 다 표현


char * ap[SIZE] = { "apple" , "banana" , "pear" };

disp(ap);


// 숙제 2

// 문자열을 한번 출력하고 그 개수도 출력한다.

// 포인터 배열 둘 다 표현


printf("개수 : %d\n\n", disp("Hello World!") );


}


*/




// 2차원 배열과 포인터 -2차 포인터


/*

void main()

{

char ap[ROWS][COLS] = { "apple" , "banana" , "pear" };



// a p p l e ㅁ

// b a n a n a

// p e a r ㅁㅁ

//

// 3행 7열 방

//

// 직사각형 모양이 아니고 실제로는 막대기에 차례차례 입력되어있다

// a p p l e \o ㅁ b a n a n a \o p e a r \o ㅁ ㅁ 

// banana의 b 는 ap[0][8] 으로도 인식됨

// ap[0]은 21개의 1차원 배열의 시작점으로 인식 

// ap[1]은 14개의 1차원 배열의 시작점으로 인식 

// ap[2]은  7개의 1차원 배열의 시작점으로 인식

//

// ap 만 유일하게 자기가 2차원 배열이라고 생각함

// ( 2중 포인터 ) 몇칸씩 띄는지 알려줘야함.


  


for ( int i=0 ; i<ROWS ; i++ ) {

for ( int j=0 ; j<COLS ; j++ ) {

printf("%c",ap[i][j]);

}

printf("\n");

}


for ( int i=0 ; i<ROWS*COLS ; i++ ) {

printf("%c", *(*ap+i) );

}

printf("\n");




//char **bp = ap; //안됨

char ( * bp )[COLS] = ap; // 2차 포인터



disp(ap);


}


*/




/* 


//예제


void main() 

{

char * name[ROW] = { "이순신" , "김유신" , "홍길동" };

int score[ROW][COL] = { {68,60,78} , {85,56,89} , {65,63,44} };

double avg[ROW] = {0};


// name score avg

// 0 0 1 2 3 0

// 0 "이순신" 68 60 79 0

// 1 "김유신" 85 56 87 0

// 2 "홍길동" 65 63 44 0



total(score);

average(score, avg);

disp(name, score, avg);

}


*/




/*


구조체 STRUCT


서로 다른 자료형의 모임 (새로운 자료형 설계 )

레코드라고도 한다 

( char int char double 이러한 순으로 되어있는 자료형 입력 가능)

( 문자 숫자 포인터 다 입력 가능 )

( 구조체도 자료형 취급됨 )

선언시 멤버에 초기값을 줄 수 없다



구조체를 만들때는 첫글자를 대문자로 만들자.


struct 구조체명

{

자료형 변수 : // 멤버변수

자료형 변수 : // 멤버변수

      // 멤버변수

}




*/


/*

typedef struct Score {

int kor;

int eng;


} Jumsu; // 항상 main위에 쓰고 마지막에는 ; 쓴다


void main()

{

// int나 char 대신 새로운 자료형 Score를 쓰고 변수 선언

Score kim = { 10 , 20 }; // kim 이라는 배열의 값

// 방크기가 같다는 가정이 성립안됨

// typedef struct Score Gu;


printf("국어 : %d\n", kim.kor);

printf("영어 : %d\n", kim.eng);

kim.kor += 20;

kim.eng += 20;

printf("국어 : %d\n", kim.kor);

printf("영어 : %d\n", kim.eng);


// 구조체 교환

// 한번에 작업 할 수 있다는 구조체의 장점 이용


Jumsu lee = { 60 , 70 };

Jumsu temp;


temp = kim;

kim = lee;

lee = temp;


printf("kim 국어 : %d\n", kim.kor);

printf("kim 영어 : %d\n", kim.eng);

printf("lee 국어 : %d\n", lee.kor);

printf("lee 영어 : %d\n", lee.eng);




// 구조체 배열

Score m[2] = { {10,20} , {30,40} };

// 배열출력

printf("%d\n",m[0].kor);

printf("%d\n",m[0].eng);

printf("%d\n",m[1].kor);

printf("%d\n",m[1].eng);

// 포인터 출력

printf("m[%d] kor : %d\n",0, (*(m+0)).kor);

printf("m[%d] eng : %d\n",0, (*(m+0)).eng);

printf("m[%d] kor : %d\n",1, (*(m+1)).kor);

printf("m[%d] eng : %d\n",1, (*(m+1)).eng);


// 화살표 (점까지 화살표로 쓴다)

// 제일 편함

printf("m[%d] kor → %d\n",0, (m+0)->kor);

printf("m[%d] eng → %d\n",0, (m+0)->eng);

printf("m[%d] kor → %d\n",1, (m+1)->kor);

printf("m[%d] eng → %d\n",1, (m+1)->eng);

// 주소값 사용

Score * mp = m;

printf("m[1].KOR : %d\n",mp[1].kor );

printf("m[1].KOR : %d\n",(*(mp+1)).kor );

printf("m[1].KOR : %d\n",(mp+1)->kor );

}


*/








// 구조체와 함수 ★★★★★



/*


// 헤더

struct Score

{

char name[12];

int kor, eng, mat, tot;

double avg;

}; 


void disp( Score kim ) ;

//Score calc( Score kim ) ; // call by value

void calc( Score * ap ) ; // call by address

void calc( Score & ar ) ; // call by reference


// 메인

void main()

{

Score kim = { "홍길동" , 67 , 75 , 81 };

// kim = calc(kim);// call by value

// calc( &kim ); // call by address (return 안해도됨)

calc(kim); // call by reference

disp(kim); 


}




// 함수


//   call by reference

void calc( Score & ar ) {

ar.tot=ar.kor+ar.eng+ar.mat;

ar.avg=ar.tot/3.;

}


//   call by address

void calc( Score * ap ) {

ap->tot = ap->kor + ap->eng + ap->mat;

ap->avg = ap->tot/3.;

}


//     call by value - Score calc( Score kim ) ;

Score calc( Score kim ) {

kim.tot=kim.kor+kim.eng+kim.mat;

kim.avg=kim.tot/3.;

return kim;



}


void disp( Score kim ) {

printf("이름 : %s\n", kim.name);

printf("국어 : %d\t영어 : %d\t수학 : %d\t", kim.kor, kim.eng, kim.mat);

printf("총점 : %d\t평균 : %.2lf\n", kim.tot, kim.avg);

}


*/




// 예제


//헤더


struct Score

{

char name[20];

int kor, eng, mat, tot;

double avg;

char grade; // 학점

int rank; // 석차

};

void disp( Score * ap );

void calc( Score * ap );

void rate( Score * ap );

void ranking( Score * ap );

void sort( Score * ap );




// 메인

void main()

{

Score m[SIZE] = {

{"Kim" , 90, 83, 75} , {"Lee" , 100, 95, 100} , 

{"Choi", 82, 75, 70} , {"Park", 45, 32, 63} , 

{"Shin", 43, 65, 85} };


calc(m); // 총점, 평균 계산

rate(m); // 학점 계산(평균 90이상 A, 80이상 B .....)

ranking(m); // 등수 계산

sort(m); // 등수로 오름차순 정렬

disp(m); // 출력


printf("\n");


}


// 함수


//   call by address


void calc( Score * ap ) {

for ( int i=0; i<SIZE ; i++){ 

(ap+i)->tot = (ap+i)->kor + (ap+i)->eng + (ap+i)->mat;

(ap+i)->avg = (ap+i)->tot/3.;

}

}



void rate( Score * ap ) {

for ( int i=0; i<SIZE ; i++){ 

if ( (ap+i)->avg <= 100 && (ap+i)->avg >= 0 ) {

switch( int((ap+i)->avg)/10 ) {

case 10 :(ap+i)->grade='A'; break;

case 9 : (ap+i)->grade='A'; break;

case 8 : (ap+i)->grade='B'; break;

case 7 : (ap+i)->grade='C'; break;

case 6 : (ap+i)->grade='D'; break;

default : (ap+i)->grade='F';

} // switch

} // if

} // for

} // void


void ranking( Score * ap ) { //Score (&ap)[SIZE]

for ( int i=0; i<SIZE ; i++){ 

(ap+i)->rank=1; // (ap+i).rank=1

for ( int j=0; j<SIZE ; j++){  

if ( (ap+i)->avg < (ap+j)->avg ) (ap+i)->rank++;

}

}

}



void sort( Score * ap ) {

Score a;


for ( int i=0 ; i<SIZE-1 ; i++ ) {

for ( int j=i+1 ; j<SIZE ; j++ ) {

if ( (ap+i)->rank > (ap+j)->rank ) {

//a=ap[i];

//ap[i]=ap[j];

//ap[j]=a;

a=*(ap+i);

*(ap+i)=*(ap+j);

*(ap+j)=a;

}

}

}


void disp( Score * ap ) {

printf("이름\t국어\t영어\t수학\t총점\t평균\t학점\t석차\n");

int i;

for ( i=0 ; i<SIZE ; i++ ){

printf("%s\t%d\t%d\t%d\t%d\t%.2lf\t%c\t%d\n",

(ap+i)->name,(ap+i)->kor,(ap+i)->eng,

(ap+i)->mat,(ap+i)->tot,(ap+i)->avg,

  (ap+i)->grade,(ap+i)->rank );

}

}


함수

#include "130814.h"




void disp( char * ap[] ) {

printf("배열이용\n");

for ( int i=0 ; i<SIZE ; i++ ) {

int j=0;

do {

printf("%c", ap[i][j] );

j++;

} while ( ap[i][j] != NULL) ;

printf("\n");

}

printf("\n");


printf("포인터이용\n");


for ( int i=0 ; i<SIZE ; i++ ) {

int j=0;

do {

printf("%c", *(*(ap+i)+j) );

j++;

} while (*(*(ap+i)+j) != NULL) ;

printf("\n");

}


printf("\n");


}



int disp( char * ap ) {


printf("%s\n",ap);

int j=0;

do {

j++;

//} while ( ap[j] != NULL) ; // 배열 이용

} while ( *(ap+j) != NULL) ; // 포인터 이용

return j;

}


void disp( char (*ap)[COLS] ) {

for ( int i=0 ; i<ROWS ; i++ ) {

for ( int j=0 ; j<COLS ; j++ ) {

printf("%c",ap[i][j]);

}

printf("\n");

}


printf("\n");

}



// ( char * ap[] ) = ( char (*ap)[COLS] )   배열 얻기



void total( int (*score)[COL] ) {


for ( int i=0 ; i<ROW ; i++ ) {

for ( int j=0 ; j<COL-1 ; j++ ) {

score[i][COL-1]+=score[i][j];

// *(*(score+i)+COL-1) += *(*(score+i)+j)

}

}

}


void average( int (*score)[COL] , double * avg  ) {

for ( int i=0 ; i<ROW ; i++ ) {

avg[i]=score[i][COL-1]/double(COL-1);

}

}




void disp( char * name[] , int (*score)[COL] , double * avg ){


printf("이름\t국어\t영어\t수학\t총점\t평균\n");

for ( int i=0 ; i<ROW ; i++ ) {

printf("%s\t",*(name+i));

for ( int j=0 ; j<COL ; j++ ) {

printf("%d\t", *(*(score+i)+j) );

}

//printf("%.2lf", *(avg+i) );

printf("%.2lf", avg[i] );

printf("\n");

}


printf("\n");


}



저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130819.10일차  (0) 2013.08.22
130816.9일차  (0) 2013.08.19
130814.8일차  (0) 2013.08.19
130813.7일차  (0) 2013.08.19
130812.6일차  (0) 2013.08.19
130809.5일차  (0) 2013.08.19
Trackback 0 And Comment 0

티스토리 툴바