130820.11일차

|

헤더


#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <iostream>

#include <iomanip>



메인


#include "130820.h"


/* 파일 입출력


파일 변수 FILE*변수


파일변수 = fopen("파일명 확장자","모드")

파일이 없으면 파일 변수에 NULL이 저장

모드 "r" 읽기

"w" 쓰기

"a" 추가


feof 파일변수 (end of file)

fclose 파일변수


입력

fscanf (파일변수, "변환문자", &변수, &변수, .....)


변수 = fgetc(파일변수)


fgets(문자열 변수, 개수, 파일 변수)


출력

fprintf (파일변수, "변환문자", 변수, 변수, .....)

fputc (문자변수, 파일변수)

fputs (문자열변수, 파일변수)




파일은 file에서 데이터를 읽어오는게 아니고 버퍼에서 읽어오는것임.

읽기용 버퍼, 쓰기용 버퍼를 만들어야한다.




*/


/*

void main() {

FILE * fin;

fin = fopen("data\\a.txt","r");

if ( fin == NULL ) { // 방어 코드

puts("파일을 못 읽었습니다.");

return;

}



char ch;

// 엔터, 스페이스 전부 다 입력으로 보고 읽는다.


//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');

//ch = fgetc( fin ); putchar( ch ); putchar('\n');



//while ( ! feof(fin) ) { // 끝이 아닐떄 돌아라

// ch = fgetc(fin); putchar( ch ); putchar('\n');

//}


}


*/




/*

void main() {


FILE * fin, * fout;

fin = fopen("data\\score.txt","r"); // fopen은 열거나 쓰거나 버퍼를 open

fout= fopen("data\\result.txt","w"); // 쓰기 버퍼는 파일이 없어도 실행가능

if ( fin == NULL || fout == NULL ) {

puts("파일을 생성할 수 없습니다.");

return;

}


char name[10];

int kor,eng,mat,tot=0;

double avg=0;

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

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

while ( fscanf( fin, "%s%d%d%d", name, &kor, &eng, & mat ) == 4 ) {

// 엔터 쳐준거 제거해줌


tot=kor+eng+mat;

avg=tot/3.;

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

name, kor, eng, mat, tot, avg);

fprintf(fout,"%s\t%d\t%d\t%d\t%d\t%.2lf\n",

name, kor, eng, mat, tot, avg);

// 프로그램이 끝날때 파일로 만들어진다

// 작업중에 파일로 만들고 싶을때는

// fclose해야 버퍼에서 끝냄

}

// fclose(fin);

// fclose(fout);

fcloseall();


}


*/


/*


★★★★★ 구조체 단위 입출력


open 모드 + 겸용모드

b 바이너리 파일 읽기

t 텍스트 파일 읽기. 생략 가능


ftell(파일변수) 파일 포인터의 위치 파악

fseek(파일변수, 이동바이트수, 기준)

SEEK_SET 처음

SEEK_CUR 현재위치

SEEK_END


fread (& 구조체변수, 구조체크기, 개수, 파일변수)

fwrite(& 구조체변수, 구조체크기, 개수, 파일변수)


*/



/*


struct Score

{

int kor;

int eng;

};


void main()

{

FILE * fout = fopen("data\\struct.txt","w+b");

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

Score w[4];

int size = sizeof( Score );

//fwrite( &m[0], size, 1, fout );

//fwrite( &m[1], size, 1, fout );

fwrite( &m[0], size, 1, fout );

printf("위치 : %d\n", ftell( fout ) );

fseek( fout, 0, SEEK_SET);

printf("위치 : %d\n", ftell( fout ) );


fread( &w[0], size, 1, fout);

fread( &w[1], size, 2, fout);


fseek( fout, -size, SEEK_CUR);


int i;

for ( i=0 ; i<4 ; i++)

{

printf("%d 국어 : %d\n", i, m[i].kor);

printf("%d 영어 : %d\n", i, m[i].eng);

}

}


*/




/* 입출력 Stream


#include <iostream.h>


cin >> 변수;

cout<< 변수 << endl;


setw(출력 자릿수);

setfill(채울 문자);

setprecision(출력 자릿수)

setiosflags(ios::옵션)

옵션 left

dec

oct

hex

fixed

resetiosflags(ios::옵션)


*/




/*

using namespace std;


void main()

{

int a;

//printf("정수 : ");

cout << "정수 : "; 

//scanf("%d",&a);

cin >> a;


//printf("a : %d\n",a);

cout << "a : " << a << endl;



cout << setw(10); // 10자리 비워둠

cout << setfill('#'); // 비우는 자리를 채움


cout << "a : " << a << endl;



double b=45.77;

cout << setw(10); // setfill 안주는데도 #####이 채워짐 

// 옵션 안줘도 옵션이 유지됨

cout << "b : " << b << endl;


cout << setw(10);

cout << setfill(' ');

cout << "b : " << b << endl;


cout << setw(10);

cout << setfill(' ');

cout << resetiosflags( ios::left );

cout << "b : " << b << endl;



}

*/




/*


★★★★★ 클래스 ★★★★★


멤버변수와 멤버함수의 모임

접근지정자가 필요(생략시 private로 인식)

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

class를 메모리 할당받은 것이 객채(Object)다.



class명

{

접근지정자;

멤버 변수;

.......

접근지정자;

멤버 함수;

.......

};



접근지정자

private 멤버만 접근 가능

protected 상속받은 클래스에서만 접근 가능

public 아무나 접근가능





★ 캡슐화 (클래스의 유일한 장점) (데이터의 안정성)

★ 상속

★ 다형성


*/






/*


클래스명 class Score


기억장소 설계(멤버 변수) - 속성

char name[10]; 이름 기억용

int kor; 국어점수 기억용


관리방법 설계(멤버 함수) - 행위, 동작

setName() 이름 담기

setKor() 국어 점수 담기

getName() 이름 가져오기

getKor() 국어 점수 가져오기



*/




class Score

{


private : // 구조체는 기본이 public이다 class는 기본이 private

char name[10];

int kor;

public : // 함수는 public

void setName( char * n )

{

if ( strlen(n)+1 > 10) {

puts("네 글자까지만 입력하세요.");

strcpy(name,NULL);

} else { 

strcpy(name,n);

}

}

void setKor( int k )

{

if ( kor < 0 || kor > 100 ) {

puts("0~100 사이만 입력하세요.");

kor = 0;

} else {

kor = k;

}

}

char * getName()

{

return name;

}


int getKor()

{

return kor;

}

};


void main() 

{

Score kim; // 스택에 할당

kim.setName("홍길동");

kim.setKor(50);

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

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

//kim.getName();

//kim.getKor();


printf("\n");


Score lee;

lee.setName("홍길동만세"); // 네글자까지만 입력하세요

lee.setKor(-50); // 0~100 사이만 입력하세요.

printf("이름 : %s\n", lee.getName() );

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

//lee.getName();

//lee.getKor();

}



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

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

130822.13일차  (0) 2013.08.22
130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
130816.9일차  (0) 2013.08.19
130814.8일차  (0) 2013.08.19
Trackback 0 And Comment 0

130819.10일차

|

헤더


#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>



메인 


#include "130819.h"




// 자기 참조 구조체


/*

typedef struct Link

{

int kor;

Link * next;

} Node;



// 사용하고자 하는 배열의 크기를 모를 때 배열을 사용할 수 없기 때문에

// Linked List를 쓴다.



void main()

{

Node m,w,z;

m.kor=10;

w.kor=20;

z.kor=30;


printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");




Node * ap = &m;

ap->kor=40;

ap = &w;

ap->kor=50;

ap = &z;

ap->kor=60;


printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");


ap = &m;


// 동적할당 받으면 이름을 못쓴다.

// 만들때부터 연결을 해서 만들어야 한다.


ap->kor = 70;

ap->next = &w;


ap->next->kor = 80;

ap->next->next = &z;


ap->next->next->kor = 90;

ap->next->next->next = '\0';

printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");



// 반복문을 돌면 이동이 들어가야된다.

// ap = ap->next ;

// ap->next가 NULL일때까지 반복문


int i=90;

while( true ){

ap->kor = i+=10 ;

if ( ap->next == NULL ) break;

ap = ap->next;


}

}


*/






// Linked List

// 단일 연결 리스트 (Single Linked List)

// 단일 환상 연결 리스트

// 이중 연결 리스트 (Double Linked List)

// 이중 환상 연결 리스트




//////////////////////////// 예제 ////////////////////////


//////////////////////////// 헤더 ////////////////////////

static int cnt=0;


typedef struct Link {

char name[10]; // 이름 4자 까지 가능

int score;

Link * next;

} Node;


int menu() ;

void display( Node * ap );

Node * add( Node * ap ) ; 

Node * append( Node * ap );

Node * del( Node * ap);

void search( Node * ap );

Node * clear( Node * ap ) ;


//////////////////////////// 메인 ////////////////////////

void main() 

{

// 사전 작업

Node * head, * tail; // *를 다 넣는다

head = tail = new Node;

tail->next = NULL;


while ( true ) {

switch ( menu() ) { 

case 1 : display( head ); break; // 출력

case 2 : tail = add( tail ); break; // 생성

case 3 : head = append( head ); break; // 삽입 // 포인터가 n-2번 이동해야한다 // 노드 연결은 뒤에서 부터

case 4 : head = del( head ); break; // 삭제

case 5 : search(head); break; // 검색

case 6 : head = clear( head ); break; // 전체 삭제

case 7 : puts(""); return; // 종료 // main에 있는 return은 프로그램을 종료하라는 뜻.

//default : puts("\n\t잘못 입력했습니다.\n\t1~7 사이로 입력하세요.");

getch(); // 중간에 텀 주기 위함

}

}

}




//////////////////////////// 함수 ////////////////////////


//void clear( Node * ap ) {

// // Linked List 전체를 반납

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

// Node * temp = ap->next;

// ap->next = ap; 

// delete temp;

// }

//

// while (true) {

// Node * temp = ap->next;

// if(temp == NULL ) break;

// delete ap;


Node * clear( Node * ap ) {

while (ap->next != NULL) {

Node * temp = ap->next;

delete ap; 

ap = temp;

}

cnt=0;


printf("\n\t전체 삭제가 완료되었습니다.\n");

getch();

return ap;

}



void search( Node * ap ) {

// 1. 이름으로 검색

// 2. 점수로 검색

// 검색 방법 입력 받고

// 중복된 데이터가 있다면 모두 출력

// 1번 홍길동 50점


int type, jumsu, bunho;

char irum[10];

printf("\n\t1. 이름\n\t2. 점수\n\t3. 번호");

printf("\n\t검색할 방법을 선택해 주십시오 : ");

scanf("%d",&type);

while ( type < 4 || type > 0) {

int i=0;


if ( type == 1 ) {

printf("\n\t이름 입력 : ");

scanf("%s", &irum);

while ( ap->next != NULL ){

i++;

if ( strcmp(irum,ap->name) == 0 ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else if ( type == 2 ) {

printf("\n\t점수 입력 : ");

scanf("%d", &jumsu);

while ( ap->next != NULL ){

i++;

if ( ap->score == jumsu ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else if ( type == 3 ) {

printf("\n\t번호 입력 : ");

scanf("%d", &bunho);

while ( ap->next != NULL ){

i++;

if ( i == bunho ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else { 

printf("\n\t다시 입력해 주십시오 : ");

scanf("%d",&type);

}

getch();

}





Node * del( Node * ap) {

Node * start = ap;


if ( cnt == 0 ) {

printf("\n\t데이터가 없습니다.");

puts("\n\t아무키나 누르세요");

return 0;

}


display( ap );

 

int loc;

do {

printf("\n\t삭제할 위치 : ");

scanf("%d", &loc);

if ( loc <= cnt ) break;

printf("\n\t%d개의 노드가 있습니다.", cnt);

} while (true); 


if ( loc == 1) { // 첫노드 삭제

start = ap->next;

cnt--;

delete ap;

return start;

} else { // 중간 노드 삭제

int i;

for ( i=0 ; i<loc-2 ; i++) {

ap=ap->next;

}

//delete ap->next;

Node * temp = ap->next;

ap->next = ap->next->next; // (temp->next)

delete temp;

cnt --;

return start;

}

}





Node * append( Node * ap) {

Node * start = ap;

Node * item = new Node; 

puts("\n\t삽입할 정보를 입력 해주세요.\n\n");

printf("\t이름 : ");

scanf("%s", item->name);

printf("\t점수 : ");

scanf("%d", &item->score);

display( ap );


int loc;

do {

printf("\n\t삽입할 위치 : ");

scanf("%d", &loc);

if ( loc <= cnt ) break;

printf("\n\t%d개의 노드가 있습니다.", cnt);

} while (true); 


if ( loc == 1) { // 첫노드에 추가

item->next = ap;

cnt ++;

return item;

} else { // 중간 노드에 추가

int i;

for ( i=0 ; i<loc-2 ; i++) {

ap=ap->next;

}

item->next = ap->next;

ap->next = item;

cnt ++;

return start;

}

}





Node * add( Node * ap ) {

char irum[10];

int jumsu;

printf("\n\t정보를 입력해주세요\n");

printf("\t이름 : ");

scanf("%s", irum);

printf("\t점수 : ");

scanf("%d", &jumsu);


strcpy( ap->name, irum);

ap->score = jumsu;

ap->next = new Node; // 현재노드 끝에 새 노드 추가

ap = ap->next;

ap->next = NULL;

cnt++;


return ap;

}



void display( Node * ap ) {

int num=0;

if ( cnt == 0 ) {

printf("\n\t데이터가 없습니다.\n");

puts("\n\t아무키나 누르세요");

getch();

} else {

printf("\n\t%d명의 데이터가 있습니다.\n", cnt);

while ( ap->next != NULL ){

printf("\t[%d번째] %s의 점수는 %d점\n",

++num, ap->name, ap->score );

ap = ap->next;

}

puts("\n\t아무키나 누르세요");

getch();

}

}




int menu() 

{

system("cls");

printf("\n\t-----------------------\n");

puts("\t메뉴를 선택하세요\n");

puts("\t1. 출력");

puts("\t2. 생성");

puts("\t3. 삽입");

puts("\t4. 삭제");

puts("\t5. 검색");

puts("\t6. 전체삭제");

puts("\t7. 종료");

printf("\t-----------------------\n");


int select;

printf("\t선택 : ");

scanf("%d", &select);


while (1) {

if ( select<8 && select>0 ) break;

else 

{

//printf("입력한값 : %d",select);

printf("\n\t잘못 입력했습니다.\n\t1~8 사이로 입력하세요.");

printf("\n\t선택 : ");

scanf("%d", &select);

//getch();

}


return select;

}





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

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

130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
130816.9일차  (0) 2013.08.19
130814.8일차  (0) 2013.08.19
130813.7일차  (0) 2013.08.19
Trackback 0 And Comment 0

130816.9일차

|

헤더





#include <stdio.h>

#include <string.h>





메인

#include "130816.h"

#include <stdlib.h>

/* 


문자열 함수


strcmp() // 같으면 0, 앞이 크면 1, 뒤가 크면 -1, 하나하나를 문자로 취급해서 아스키 코드값으로 

strcpy()

strcat()

strlen()

strrev()

strupr()

strlwe()



*/



/*

void main() {

// strcmp

printf("문자열 비교 : %d\n",strcmp("ABC","ABC") );

printf("문자열 비교 : %d\n",strcmp("ABC1","ABC") );

printf("문자열 비교 : %d\n",strcmp("C","BCDEF") );

printf("문자열 비교 : %d\n",strcmp(""," ") );

printf("문자열 비교 : %d\n",strcmp("A","a") );

printf("문자열 비교 : %d\n",strcmp("1","2") );



if ( strcmp("ABC" , "ABC") == 0 ) {

printf("같다\n");

} else {

printf("다르다\n");

}




// strcpy


printf("\n");

char m[10] = "ABC";

char n[4];

// n="ABC"; // 주소를 n에 넣는 문법(에러남)

strcpy(n,"ABC");

printf("문자열 복사 : %s\n",n);




// strcat


printf("\n");

printf("문자열 추가 : %s\n", strcat(m,"DEF"));

// printf("문자열 추가 : %s\n", strcat("ABC","DEF")); // 에러남. 선언된 문자배열이 있어야함



// strlen()

printf("\n");

printf("문자열 추가 : %d\n", strlen("Hello World!")); // null 빼고 계산




// strrev() strupr() strlwr

printf("\n");

// char * ap = "korea"; // 포인터로 잡으면 함수에서 다시 바꿔 넣을때 넣을 방이 없다. 

char ap[] = "korea";

printf("문자열 역순 : %s\n", strrev(ap));

printf("문자열 역순 : %s\n", strupr(ap));

printf("문자열 역순 : %s\n", strlwr(ap));

}


*/




/*


---------------------------------

|  코드 | 프로그램 명령 |

|--------|----------------------|

| static | static 변수 | 메모리 반납 X

|--------|----------------------|

|  heap | 자유로이 생성/소멸 | 메모리 수동 반납

|--------|----------------------|

| stack | 자동변수/함수인수 |   메모리 자동 반납

---------------------------------




auto 자동변수

stack 영역

생략가능

쓰레기 값을 가지고 있다.


static static영역

쓰레기 값이 없다

초기화를 한번만 수행한다.(자동.초기화 된다.)


extern 파일 공유 변수. 파일 전역 변수.

다른 파일 내의 변수를 같이 공유.


register cpu내에 메모리를 잡는다.

속도가 빨라진다.

쓰레기 값을 가지고 있다.


*/




/*

int a=100; // static 전역변수  ( 전역변수 이기 때문, 지역변수에서는 auto로 잡힘 )

void sub();


void main()

{

auto int a; // auto 변수 / 지역 변수

static int b; // static 변수 / 지역변수


printf("auto a : %d\n",::a); // 최우선 연산자 :: 을 사용해서 전역변수 a의 값을 출력

// 소속::변수명    소속을 밝히지만 안쓰면 전역변수로 인식

printf("static b : %d\n",b);



printf("\n");


sub();

sub();

sub();

}


void sub() {

int a=0; // auto 변수, 지역 변수

static int b=0; // static 변수, 지역 변수

printf("전역변수 : %d\n",::a); // 전역 변수 a 찍어라


printf("auto a : %d\n",++a);

printf("static b : %d\n",++b); // b는 static이라 값을 이어서 쓴다

}


*/





/* ★★★★★ 동적할당 ★★★★★


자유로이 할당/반환

메모리의 heap 영역에 해당

이름이 없다. 주소로만 접근

포인터 변수가 만환 되는 것은 아니다


C 할당 malloc()

반환 free()


C++ 할당 new

반환 delete



*/



// 힙영역에는 이름을 못붙인다.

// 이름으로 접근이 안됨. 포인터로만 가능.

// 항상 포인터변수가 따라다녀야 한다.

// 변수명 없이 주소만 있음


/*

void main()

{

int * ap = (int*) malloc( sizeof(int) ); // int의 크기인 4 byte의 메모리를 할당 했다는 뜻


*ap=10;


printf("ap data : %d\n", *ap);

printf("ap address : %p\n", ap);


free(ap);  // ap의 heap영역을 반납하고 그 영역을 bp에 준다.


int * bp = (int*) malloc( sizeof(int) ); // int의 크기인 4 byte의 메모리를 할당 했다는 뜻


*bp=20;


printf("bp data : %d\n", *bp);

printf("bp address : %p\n", bp);

printf("ap data : %d\n", *ap); // bp의 주소 값이 ap의 주소 값이랑 같아서 heap영역에 있는 20이 ap 출력에 나옴.

printf("ap address : %p\n", ap);


// heap 영역에 주소를 주고 그 주소를 바꾸면 heap영역에 있는 자료는 지우지도 못하고 사용도 못한다.

// 메모리 관리의 최악.

// 안쓰면 반납하고 주소를 바꾸자.

}


*/



/*

void main()

{

// 동적할당


int * ap = new int;

*ap = 10;

printf("ap data : %d\n", *ap);

printf("ap address : %p\n", ap);


delete ap; // heap 영역 반납



int * bp = new int;

*bp = 10;

printf("bp data : %d\n", *bp);

printf("bp address : %p\n", bp);



// 배열 동적할당


printf("\n");

int * mp = new int[3];

int i;


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

mp[i]=10*(i+1) ;

}

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

printf("m[%d] : %d\n", i, mp[i]);

}


delete [] mp;

}


*/



/*


// 구조체 동적할당


struct Score

{

char * name;

int kor, eng, mat, tot;

double avg;

};

//void disp( Score kim );

void disp( Score * sp );




void main()

{

//Score kim;

//kim.name = new char[ strlen("김유신")+1 ];

//strcpy(kim.name,"김유신");

//kim.kor = 79;

//kim.eng = 82;

//kim.mat = 88; 

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

//kim.avg = kim.tot/3.;

//disp(kim);


printf("\n");


Score * sp = new Score;

sp->name = new char[ strlen("홍길동")+1];

strcpy(sp->name,"홍길동");

sp->kor = 80;

sp->eng = 75; 

sp->mat = 90;

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

sp->avg = sp->tot/3.0;


disp( sp );


// delete ( kim.name );

delete ( sp->name );

delete ( sp );

}



//void disp( Score kim ) {

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

// printf("국어 : %d\t 영어 : %d\t 수학 : %d\n", 

// kim.kor, kim.eng, kim.mat);

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

//}



void disp( Score * sp ) {

printf("이름 : %s\n", sp->name);

printf("국어 : %d\t 영어 : %d\t 수학 : %d\n", 

sp->kor, sp->eng, sp->mat);

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

}


*/





// 포함 구조체


/*

struct Score

{

int kor, eng, mat, tot;

double avg; 

};


struct Person

{

char name[12];

Score mid;

Score fin;

int total;

double average;

};

void disp( Person kim );

//Person calc( Person kim );

void calc( Person * kp );


void main() 

{

Person kim = { "김유신" , { 65 , 70 , 82 } , { 75 , 90 , 85 } };

// name mid   fin


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

calc(&kim); // call by address

disp(kim);

}




// call by address

void calc( Person * kp ) {

kp->mid.tot = kp->mid.kor + kp->mid.eng + kp->mid.mat;

kp->mid.avg = kp->mid.tot/3.;


kp->fin.tot = kp->fin.kor + kp->fin.eng + kp->fin.mat;

kp->fin.avg = kp->fin.tot/3.;


kp->total = kp->mid.tot + kp->fin.tot;

kp->average = kp->total/6.; // 리턴없음


}


// call by value

//Person calc( Person kim ) {

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

// kim.mid.avg = kim.mid.tot/3.;

//

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

// kim.fin.avg = kim.fin.tot/3.;

//

// kim.total = kim.mid.tot + kim.fin.tot;

// kim.average = kim.total/6.;

//

// return kim;

//}



void disp( Person kim ) {

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

printf("-중간고사-\n국어 : %d\n영어 : %d\n수학 : %d\n총점 : %d\n평균 : %.2lf\n\n",

kim.mid.kor, kim.mid.eng, kim.mid.mat, kim.mid.tot, kim.mid.avg);

printf("-기말고사-\n국어 : %d\n영어 : %d\n수학 : %d\n총점 : %d\n평균 : %.2lf\n\n",

kim.fin.kor, kim.fin.eng, kim.fin.mat, kim.fin.tot, kim.fin.avg);

printf("-전체학기-\n총점 : %d\n평균 : %.2lf\n\n",

kim.total, kim.average);

}


*/




// 자기 참조 구조체


struct Score

{

int kor, eng, mat, tot;

double avg;

};


struct Person

{

char * name;

Score * mid;

Score * fin;

int total;

double average;

};


void calc( Person * pp );

void disp( Person * pp );



void main()

{

// 동적 할당으로

Person * pp = new Person;

//Score * mid = new Score;

pp->name = new char[ strlen("홍길동")+1];

pp->mid = new Score; // 방크기 지정( int와 double의 방크기는 알고 있지만 char, Score는 안알랴주면 모름)

pp->fin = new Score;

strcpy(pp->name,"홍길동");

pp->mid->kor=65;

pp->mid->eng=70;

pp->mid->mat=82;

pp->fin->kor=85;

pp->fin->eng=75;

pp->fin->mat=90;


calc( pp );

disp( pp );

// 반납

delete pp->name; 

  delete pp->mid; 

  delete pp->fin; 

  delete pp;


}




// call by value

void calc( Person * pp ) {

pp->mid->tot = pp->mid->kor + pp->mid->eng + pp->mid->mat;

pp->mid->avg = pp->mid->tot/3.;




pp->fin->tot = pp->fin->kor + pp->fin->eng + pp->fin->mat;

pp->fin->avg = pp->fin->tot/3.;


pp->total = pp->mid->tot + pp->fin->tot;

pp->average = pp->total/6.;


}



void disp( Person * pp ) {

printf("이름 : %s\n\n", pp->name);

printf("-중간고사-\n국어 : %d\n영어 : %d\n수학 : %d\n총점 : %d\n평균 : %.2lf\n\n",

pp->mid->kor , pp->mid->eng , pp->mid->mat, pp->mid->tot, pp->mid->avg);

printf("-기말고사-\n국어 : %d\n영어 : %d\n수학 : %d\n총점 : %d\n평균 : %.2lf\n\n",

pp->fin->kor , pp->fin->eng , pp->fin->mat, pp->fin->tot, pp->fin->avg);

printf("-전체학기-\n총점 : %d\n평균 : %.2lf\n\n",

pp->total, pp->average);

}




함수





//// 구조체 동적할당

//

//struct Score

//{

// char * name;

// int kor, eng, mat, tot;

// double avg;

//};

////void disp( Score kim );

//void disp( Score * sp );

//

//

//

//void main()

//{

// printf("\n");

//

// Score * sp = new Score;

//

// sp->name = new char[ strlen("홍길동")+1];

// strcpy(sp->name,"홍길동");

// sp->kor = 80;

// sp->eng = 75; 

// sp->mat = 90;

// sp->tot = sp->kor + sp->eng + sp->mat;

// sp->avg = sp->tot/3.0;

//

// disp( sp );

//

// delete ( sp->name );

// delete ( sp );

//}

//

//

//

//

//void disp( Score * sp ) {

// printf("이름 : %s\n", sp->name);

// printf("국어 : %d\t 영어 : %d\t 수학 : %d\n", 

// sp->kor, sp->eng, sp->mat);

// printf("총점 : %d\t 평균 : %.lf\n", sp->tot, sp->avg);

//}

//

//*/


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

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

130820.11일차  (0) 2013.08.22
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
Trackback 0 And Comment 0
prev | 1 | ··· | 3 | 4 | 5 | 6 | 7 | 8 | 9 | next

티스토리 툴바