8.08.2017

08.08 C++

#include <iostream>
#include <string>
#include <cstdlib>
#include
<ctime>

using namespace std;

class Seller {
        string name;
        int applePrice, numApple, money;
public:
        Seller(string aint y, int z) {
                name = a;
                applePrice = (rand() % 1500 + 500) / 100 * 100;

                numApple = y;
                money = z;
        }
        void show() {
                cout << "----가게 정보----\n가게명 : " << name << ", 사과 가격 : "
                        << applePrice << ", 사과 개수 : " << numApple << ", 돈 : " << money << endl;
        }
        int get_Price() {
                //멤버변수가 private이기 때문에
                //반환을 통해서 사과 가격 얻기

                return applePrice;
        }
        void Sell(int n) {
                numApple -= n;
                money += n*applePrice;
                cout << "남은 사과 수 : " << numApple << ", 돈 : " << money << endl;
        }
};

class Buyer {
        string name;
        int list, money;
public:
        Buyer(string aint y, int z) {
                name = a;
                list = b;
                money = z;
        }
        void show() {
                cout <<  "이름 : " << name << "장바구니 :  " << list << ", 돈 : " << money << endl;
        }
        void buy(Seller* p) {
                int num; //구매할 사과 개수
                cout << "구매하실 사과 개수 입력 : ";
                cin >> num;
                //만약, 구매할 사과 개수가 Seller의 사과 개수보다 적거나,
                //구매자의 돈이 구매할 사과의 가격보다 많을 경우 "구매가능" 문구 출력
                if (num <= (*p).get_Number() && money >= num*p->get_Price()) {
                      
                        cout << "구매 가능" << endl;
                        p->Sell(num);
                        list += num;
                        money += num*p->get_Price();
                        show();
  
                        //돈 감소, 장바구니 증가
                        //seller sell함수 만들어서 구매한 만큼 사과 개수 감소, 돈 증가
               
}
                else cout << "구매 불가능" << endl;
        }
}
void main() {
        srand(time(NULL));

        Seller s1("a",  12, 8000);
        Seller s2("b", 19, 10000);
        Seller s3("c", 26, 24500);
        s1.show();
        s2.show();
        s3.show();

        Buyer b1("", 13, 20000);

        b1.show();
        int m1 = s1.get_Price();
        int m2 = s2.get_Price();
        int m3 = s3.get_Price();
        int lowest = 0;

        if (m1 < m2) lowest = m1;
        else lowest = m2;

        if (m3 < lowest) lowest = m3;

        if (lowest == m1) s1.show();
        else if (lowest == m2) s2.show();
        else if (lowest == m3) s3.show();
        // if (m1 < m2 && m1 < m3) s1.show();
        //else if (m2<m1 && m2<m3) s2.show();
        //else if (m3 <m1 && m3<m2) s3.show();
}

8.05.2017

08.05 creating character

#include <stdio.h>
#include <stdlib.h>

typedef struct Character {
        char nickname[12];
        int strength, level, exp; //체력, 레벨, 경험치
}character;
character* c;

void create(int index) {
        c = (character*)realloc(c, sizeof(character) * (index+ 1));

        printf("Enter character's nickname.\n");
        scanf("%s", c[index].nickname);
        printf("Enter character's strength.\n");
        scanf("%d", &c[index].strength);
        printf("Enter character's level.\n");
        scanf("%d", &c[index].level);
        printf("Enter character's experience point.\n");
        scanf("%d", &c[index].exp);
}
void show(int index) {
        for (int i = 0; i < index; i++) {
                printf("About your character...\n");
                printf("nickname : %s \n", c[i].nickname);
                printf("strength : %d \n", c[i].strength);
                printf("level : %d \n", c[i].level);
                printf("experience point : %d \n", c[i].exp);
        }
}
void deleteCharacter(int index) {
        char name[20];
        printf("Which nickname do you want to erase?");
        scanf("%s", name);
        for (int i = 0; i < index; i++) {
                if (!strcmp(c[i].nickname, name));
                //strcmp (compare values) : if same -> 0
                // if different -> 1, -1
                for (int k = i; k < index- 1; k++) {
                        //앞으로 당겨주는 작업을 할 반복문
                        c[i] = c[i + 1];
                        c = (character*)realloc(c, sizeof(character)*(index- 1));
                }//end for(k)
                break; //더 이상 입력할 닉네임을 찾을 필요가 없기 때문
        }//end if

}
void main() {
        int input = 0, index = 0;

        c = (character*)malloc(sizeof(character));
        while (input != 4) {
                printf("[menu]\n1.Create your own Character 2.Show your character 3.Delete your character 4.End this program\n");
                scanf("%d", &input);
                if (input == 1) {
                        create(index);
                        index++;
                }
                else if (input == 2) show(index);
                else if (input == 3) {
                        deleteCharacter(index);
                        index--;
                }
        }
}

08.05. 문자입력, 출력, 종료

#include <stdio.h>
#include <stdlib.h>

char* arr;
void input(int i) {
        arr = (char*)realloc(arr, sizeof(char) * i);

        while (getchar() != '\n');
        scanf("%c", &arr[i-1]);

}
void show(int n) {
        for (int i = 0; i < n-1; i++) {
                printf("%c", arr[i]);
        }
}
void main() {

        arr = (char*)malloc(sizeof(char) * 1);
        int a = 6, b = 1;
                while (a != 3) {
                        printf("[menu]\n1. 문자입력 2. 모든 문자 출력 3. 종료\n");
                        scanf("%d", &a);
                        if (a == 1) {
                                input(b);
                                b++;
                        }
                        else if (a == 2)show(b);
        }
}

0805 자료구조 복습

#include <stdio.h>
#include <stdlib.h>

void main() {
        /*
        정적할당 : 고정되어있는 값만 사용
                     ex) int num, int arr[5];
        동적할당 : 계속해서 변하는 값
                           컴파일을 실행할 때 저장할 변수를 늘리거나 줄일 때 사용
                           #include <stdlib.h>
        할당 : malloc(), calloc()  //재할당 : realloc()
        */

        //(void*)malloc(바이트크기)
        int* p = (int*)malloc(sizeof(int) * 4);
        // malloc를 이용하여 4개짜리 배열
        // 생성 후, 포인터 변수 p 에 배열의 첫번쨰 인덱스의 주소(배열의 시작주소)를 대입해줬다.

        /*
        0번째 인덱스 = 10, 1 = 20, 2 = 30
        */


        /*int arr[5];
        int* p;
        */

        *p = 10;
        p[1] = 20;
        p[2] = 30;

        printf("%d %d %d \n", *(p + 0), p[1], p[2]);

        //calloc(개수, 사이즈);
        // c : clean
        // 값이 없을 경우엔 0으로 초기화
        int* c = (int*)calloc(4, sizeof(int));
        *&c[0] = 50;
        c[1] = 60;
        c[2] = 70;
        printf("%d %d %d \n", c[0], c[1], c[2]);
        printf("c : %d, m : %d \n", c[3], p[3]);

        //_msize() : 동적할당된 배열의 사이즈
        // sizeof : 정적할당된 변수

        printf("&dbyte \n", _msize(p)); //16byte
        printf("&dbyte \n", _msize(c)); //16byte

        //realloc(누구, 사이즈?);
        p = (int*)realloc(p, sizeof(int)* 5);
        //4개짜리 공간 -> 5개짜리 공간
        printf("%dbyte \n", _msize(p)); //20byte
        printf("%d %d %d \n", p[0], p[1], p[2]); //20byte


        /*
        *& : 서로 상쇄
        &* 상쇄(X)
        arr[0] == *p == *(p+0) == *&p[0] == p[0]
        arr[1] == *(p+1) == *&p[1] == p[1]
        */
        /*int num;
        int *p2 = &num;
        *p2 = 20;
        */

        // *p2 == num
        // p2가 가지고 있는 주소로 접근(num으로 이동)하여 20을 대입하겠다.
}

8.03.2017

08.03 TV

#include <iostream>

using namespace std;

struct TV {
private:
   bool power;
   int volume, channel;

public:
   TV(bool a, int b, int c) {
      power = a;
      volume = b;
      channel = c;
   }
   void power_change() {
      power = !power;
   }
   void Volume_Up() {
      if (volume < 100)
            volume++;
   }
   void Volume_Down() {
      if (volume > 0)
            volume--;
   }
   void Channel_Up() {
      channel++;
   }
   void Channel_Down() {
      if (channel > 0)
            channel--;
   }
   bool getPower() {
      return power; //현재 파워 상태 반환
   }
   void show() {
      cout << "----현재 상태----\n전원 : " << power << ", 채널 : " << channel << ", 볼륨 : " << volume;
   }
};

   void main() {
      int input, answer;
      TV t = TV(false, 0, 0);

      /*
      TV 구조체 생성
      멤버변수 : 전원(bool), 볼륨, 채널
      구조체 함수 :
      power_change() : 전원 On, Off 가능
      Volume_Up : 볼륨 1씩 증가
      Volume_Down : 볼륨 1씩 감소
      Channel_Up : 채널 1씩 증가
      Channel_Down : 채널 1씩 감소
      전원을 켜시겠습니까? (1.y 2.n)
      1일 경우,
      */
      cout << "전원을 켜시겠습니까? yes-> 1, no -> 2" << endl;
      cin >> answer;
      if (answer == 1)
         t.power_change();
      while (t.getPower() == true) {
         t.show();
         cout << "\n[menu]\n1.전원OFF 2.채널UP 3.채널Down 4.볼륨Up 5.볼륨Down" << endl;
         cin >> input;
         if (input == 1) t.power_change();
         else if (input == 2)t.Channel_Up();
         else if (input == 3)t.Channel_Down();
         else if (input == 4)t.Volume_Up();
         else if (input == 5)t.Volume_Down();
         }
}

0803 공부

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include
<string.h>

typedef struct Account {
        char name[12], id[20], password[20];
        int accountNumber, surplus;
}account;
void Create(account* a) {
        printf("이름을 입력하시오.\n");
        scanf("%s", (*a).name);
        printf("아이디를 입력하시오.\n");
        scanf("%s", a->id);
        printf("비밀번호를 입력하시오.\n");
        scanf("%s", a->password);
        printf("계좌번호를 입력하시오.\n");
        scanf("%d", &a->accountNumber);
        printf("잔금을 입력하시오.\n");
        scanf("%d", &a->surplus);
}

void main() {
        int b = 0;
        //배열 아니면 scanf에서 주소연산자가 필요
        // ' ' : 문자

        account a;

        while(b!=3){
                printf("메뉴 // 1. 회원가입 2.로그인 3.종료");
                scanf("%d", &b);
                if (b == 1)
                        Create(&a);
                else if (b == 2) {
                        char id2[20], password2[20];
                        printf("아이디 입력");
                        scanf("%s", id2);
                        printf("비밀번호 입력");
                        scanf("%s", password2);

                         // -> : * .
                        if (!strcmp(id2, a.id) && !strcmp(password2, a.password)) { //(id2 == a->id) &&         (password2 == a->password)
                                printf("이름은 %s", a.name);
                                printf("계좌번호는 %d", a.accountNumber);
                                printf("잔금은 %d", a.surplus);
                        }
                }
                else if (b == 3) {
                                printf("프로그램 종료");
                }
        }

        /*
        함수의 차이점
        C언어 : 인자값이 2개면, 매개변수는 2개여야만 한다.
                  함수의 매개변수에 초기값 대입은 불가능하다.
        C++ : 인자값이 2개일 때, 매개변수가 여러 개 여도 상관없다.
                  단, 매개 변수에 초기값이 되어야만 한다.
                  인자값 보다는 매개변수가 많아야 한다.


        만약, 보내주는 값이 있을 경우 그 값으로 대체한다.
        */

}

8.01.2017

0801 C++공부

#include <iostream>

using namespace std;

void Func(int num) {
        if (num > 2) return;
        Func(num + 1);
        cout << num << endl;

}

/*void Function(int num) {
        if (num > 10) return;
        Function(num + 1);
        if (num <= 1) {
                cout << num;
        }
        else {
                cout << num << ", " ;
        }
}*/

void Function2(int a) {
        int sum = 0;
        sum += a;
        if (a <= 1) {
                cout << sum;
        }
        else cout << sum << " + ";

        Function2(a - 1);

}

int Function3(int i, int end, int total){
        if (i >= end) {
                cout << i << " + ";
                total += i;

                return total;
        }
        else {
                total += i;

                total = Function3(i + 1, end, total);
                if (i == 1) cout << i;
                else cout << i << " + ";
        }
return total;
}

void main() {
/*
재귀함수 : 자기자신을 다시 호출
: 또 다른 반복문
: 코드를 반복문보다 간결화한다

        void func(){
        if문 return; //함수를 종료시킬 수 있게 함
        func();
        )
        */
        int num = 1, integer, total = 0;
        cin >> integer;
        //Function(num);
        cout << " = " << Function2(integer);
        cout << " = " << Function3(num, integer, total);
}

============================================================================
#include <stdio.h>

typedef struct Test{
        int num;
        char ch;
        double db;
}test;


typedef int a; //int형을 a라는 이름으로 재정의
                  //a == int

        //함수 사용 이유
        //: 공통적 재사용성

void main() {

        /*
        구조체 : 하나 이상의 자료형을 모아놓은 사용자 지정 자료형
C언어 : 변수만 생성가능
변수에는 포기값 대입(x)
C++ : 함수, 변수 둘 다 사용 가능
변수에 초기값 대입(o)
        구조체 생성
        struct 구조체네임{
                (정수형, 문자, 문자열, 포인터, 배열)변수1;
                변수2;
                변수3;
        };

        //--C언어--
        //구조체 변수
        //struct 구조체네임 변수네임;
        */

        /*
        struct Test t1; // t1이라는 struct Test 자료형
                 //struct Test == test
        test t2; // struct Test t2;
        test t3 = { 10, 'A', 10.1234 };

        //구조체 변수 초기화
        //구조체 변수네임 = {};
        //- 구조체 변수를 만들었을 때 바로 초기화
        //- 순차적으로 변수에 값이 들어가게 됨


        // . : 연결자(도트 연산자)
        t1.num = 10; // t1변수 안에 있는 num 변수 구조체 변수 생성
        t1.ch = 'A';
        t1.db = 10.1234;

        t2.num = 20;
        t2.ch = 'B';
        t2.db = 20.1234;


        printf("%d %c %lf \n", t1.num, t1.ch, t1.db);
        printf("%d %c %lf \n", t2.num, t2.ch, t2.db);

        test t;
        test* p;
        p = &t;

        //포인터 변수 p를 이용하여 t구조체 변수의 num에 10 대입
        (*p).num = 10; //p->num = 10;

        printf("%d\n", t.num);
        //도트연산자가 접근연사자보다 우선순위가 높아서 괄호로 묶음
        //포인터 : int -> int*
        */

}

===============================================================================

#include <stdio.h>

typedef struct Student {
        char name[12];
        int kor, math, eng, total;
        double average;
}student;

void input(student* s) {

        //접근 : student* s = &s1;
        //값 변경 시 포인터 이용 : student* s = &s2;
        printf("학생의 이름을 입력하시오.\n");
        scanf("%s", s->name);
        printf("학생의 국어, 수학, 영어 점수를 입력하시오.\n");
        scanf("%d", &s->kor); //&s->kor == &(*s).kor
        scanf("%d", &s->math);
        scanf("%d", &s->eng);
        s->total = s->kor + s->math + s->eng;
        s->average = (double)s->total / 3;

}
void disp(student s) {
        //복사(대입) student s = s1;
        printf("학생들의 정보");
        printf("학생 이름 : &s \n", s.name);
        printf("국어점수 : &d \n", s.kor);
        printf("수학점수 : &d \n", s.math);
        printf("영어점수 : &d \n", s.eng);
        printf("총합점수 : &d \n", s.total);
        printf("평균점수 : %.2lf \n", s.average);

}
void main() {
        /* Student 구조체 생성
        구조체 내의 변수(멤버변수) :
        이름, 국어, 수학, 영어, 총점, 평균

        s1,s2,s3 구조체 변수 생성 후

        input 함수 : 모든 학생의 이름, 국어, 수학, 영어 입력

        disp함수 : 모든 학생의 정보 출력
        */
        student s1;
        student s2;
        student s3;

        input(&s1);
        input(&s2);
        input(&s3);
        disp(s1);
        disp(s2);
        disp(s3);

        /*
        c언어 구조체 : 구조체 멤버변수에 초기화 불가능
         무조건 변수만 들어가야함
                                접근 지정자 typedef을 이용하여 이름의 재정의를 해줌
                ex) typedef struct Test{}test; == test

        공통점 :
        구조체 생성 시 struct 예약어를 사용한다.
        구조체 변수 구조체명 구조체 변수;

        포인터(*) : 주소를 저장할 변수를 만들 때 사용
                      주소를 저장하여 접근하기 위해 사용
        */

        /*char name[12];
        scanf("%s", name);
        printf("%c%c", name[0], name[1]);
        printf("%c%c", name[2], name[3]);
        */
}