오늘의 코드는 이것이다. 바로 재귀함수다. 재귀함수는 한 함수 안에서 그 함수가 호출되는 것이다. 알고리즘 문제를 풀 때는 매우 필요한데 실무에서는 메모리를 너무 잡아 먹어서 잘 쓰이지 않는다고 한다.
아무튼 이 코드는 아무 수를 입력하면 그 수의 자리수를 다 더해서 출력하는 코드다. 솔직히 이 코드는 내가 생각해낸게 아니고 민준이가 생각해낸 코드다. rec(x % 10)을 통해서 1의 자리수부터 계속 더한다. 그리고 rec(x / 10)으로 자리수를 한자리씩 줄여간다. 그러면 계속해서 자리수가 누적되고 각 자리수들의 합을 구할 수 있다.
재귀함수가 문제를 푸는 데 도움이 된다는건 알겠지만 처음에 좀 감을 잡기 힘들다. 그렇다고 포기하는 것도 좋은 선택은 아닌 것 같다. 앞으로 재귀함수로 푸는 알고리즘 문제를 많이 연습해서 익숙해질 수 있도록 해야 겠다. 그리고 어렵긴 해도 나름 재미도 있는 것 같다.
2019년 6월 11일 화요일
2019년 5월 29일 수요일
메모리 구조
오늘은 메모리 구조에 대해서 배웠다. 메모리 구조는 크게 4개로 나뉘어져 있다고 한다. 그 4개는 코드, 데이터, 힙, 스택이라고 한다.
코드 영역은 실행할 프로그램의 코드가 저장되는 곳이다.
다음으로 데이터 영역은 정적 변수와 전역 변수가 있는 곳이다. 이 곳에 들어가는 데이터는 컴파일 과정에서 생긴다고 한다.이 데이터 영역은 BSS랑 Data영역으로 나뉘는데 BSS는 초기화 된 정적, 전역 변수가 들어가고 Data영역에는 초기화되지 않은 정적, 전역 변수가 들어간다.
그 다음에 힙 영역은 동적할당으로 생긴 메모리가 저장된다.
마지막으로 스택 영역은 지역변수와 매개변수가 저장되는 영역이다.
이 메모리 구조를 알 때와 모를 때의 코드가 달라진다고 하는데 아직은 진짜 그런지 모르겠다. 앞으로 메모리 구조도 열심히 해봐야 겠다.
2019년 5월 27일 월요일
C언어 최대 최소 구하기
이 코드는 오늘 수업시간에 작성한 코드다. 이 코드를 실행하면 저 위에 num이라는 배열에 담긴 숫자들 중에서 최댓값과 최솟값을 구할 수 있다. 그리고 조건 중에 포인터 변수에 배열의 주소를 넣으라는 조건이 있었기 때문에 포인터 변수 p에 배열의 주소를 담았다. 그리고 처음에는 최댓값 최솟값 모두 배열의 첫 번째 요소의 값으로 넣어줬다. 반복문은 i(1)에서 배열 요소의 갯수만큼까지 반복하도록 했다. 만약에 그 배열의 요소가 max보다 크면 max를 그 요소로 바꾸고 min보다 작으면 min을 그 요소로 바꾸는 식으로 했다. 그리고 마지막에 최대, 최솟값을 모두 출력해준다.
오늘 수업시간에 느낀 게 진짜로 사람마다 생각이 다르고 생각이 다른만큼 코드도 매우 다양하게 나타난다는 것을 느꼈다.
오늘 수업시간에 느낀 게 진짜로 사람마다 생각이 다르고 생각이 다른만큼 코드도 매우 다양하게 나타난다는 것을 느꼈다.
2019년 5월 24일 금요일
C언어 배우기 (2차원 배열)
오늘 수업시간에 2차원 배열에 대해서 배웠다. 2차원 배열은 Type 변수명[i][j]; 으로 선언한다. 2차원 배열은 1차원 배열과 다르게 평면으로 되어 있다. 하지만 진짜 메모리 상에서 2차원으로 바뀌는 것은 아니다. 그리고 변수명은 1차원 배열과 같이 배열의 시작 주소를 의미한다. 그런데 조금 다른 것은 변수명[2]라고 하면 주소를 나타낸다. 변수명[2]라는 것은 세번째 행의 시작 주소를 뜻한다. 변수명[1]하면 두번재 행의 시작 주소를 뜻한다. 그리고 1차원 배열과 똑같이 변수명[i]는 *(변수명+i)와 같다. 물론 2차원 배열에서는 주소를 의미한다.
2차원 배열은 1차원 배열과 닮은 점도 많지만 다른 점도 꽤 있다. 1차원 배열과 따로 2차원 배열도 잘 알아두어야 할 것 같다.
2차원 배열은 1차원 배열과 닮은 점도 많지만 다른 점도 꽤 있다. 1차원 배열과 따로 2차원 배열도 잘 알아두어야 할 것 같다.
2019년 5월 21일 화요일
C언어 배우기 (표준 입출력)
오늘은 표준 입출력에 대해서 배웠다. 표준 입출력 함수는 scanf, printf같은 내가 평소에 많이 쓰던 것도 있고 putchar, gets, puts처럼 평소에 내가 잘 쓰지 않는 것들도 있다. 그리고 이 표준 입출력 함수도 버퍼를 이용하는 입출력 함수가 있고 버퍼를 이용하지 않는 입출력 함수가 있다. 버퍼를 이용하지 않는 입출력 함수에는 _getch나 _getche같은게 있다.
이 코드는 버퍼를 이용하는 입출력 함수인 getchar를 이용한 코드다. 이 코드는 EOF를 입력할 때까지 문자열을 입력받고 EOF를 입력하면 while문을 종료해서 입력받은 문자열 중에서 가장 길었던 문자열의 길이를 출력하는 코드다. 먼저 while(1)해서 계속 반복하게 한다. 처음에 getchar로 \n이 입력될 때까지 문자들을 입력받는다. 그리고 이 과정에서 가장 긴 문자열의 길이를 구하기 위해서 i값을 증가시킨다. 만약에 개행이 이루어지면 기존에 가장 긴 문자열의 길이였던 temp와 i를 비교하고 만약에 i가 temp보다 크면 temp = i를 해준다. 그리고 i를 다시 0으로 초기화 해준다. 그리고 i가 또 증가되면 안되기 때문에 continue로 바로 처음부터 다시 반복한다. 그러다가 EOF가 입력되면 break로 while문을 탈출한다. 그리고 temp를 출력한다.
이 코드는 버퍼를 이용하는 입출력 함수인 getchar를 이용한 코드다. 이 코드는 EOF를 입력할 때까지 문자열을 입력받고 EOF를 입력하면 while문을 종료해서 입력받은 문자열 중에서 가장 길었던 문자열의 길이를 출력하는 코드다. 먼저 while(1)해서 계속 반복하게 한다. 처음에 getchar로 \n이 입력될 때까지 문자들을 입력받는다. 그리고 이 과정에서 가장 긴 문자열의 길이를 구하기 위해서 i값을 증가시킨다. 만약에 개행이 이루어지면 기존에 가장 긴 문자열의 길이였던 temp와 i를 비교하고 만약에 i가 temp보다 크면 temp = i를 해준다. 그리고 i를 다시 0으로 초기화 해준다. 그리고 i가 또 증가되면 안되기 때문에 continue로 바로 처음부터 다시 반복한다. 그러다가 EOF가 입력되면 break로 while문을 탈출한다. 그리고 temp를 출력한다.
2019년 5월 17일 금요일
C언어 배우기 (수업시간)
오늘은 포인터 변수에 배열의 주소를 넣어서 포인터 변수를 배열처럼 사용하는 것을 배웠다. 길이가 10인 int형 배열 arr를 선언해서 1~10으로 초기화했다. 그리고 int형 포인터 변수 p를 선언한 다음에 배열 arr의 첫 번째 요소의 주소를 의미하는 배열의 이름인 arr을 포인터 변수 p에 넣어줬다. 문제의 조건이 이 배열의 요소들을 2 더해서 출력하는 것이었기 때문에 for문을 열어서 인덱스 0~9까지 각 요소들을 2로 더해서 출력해주었다.
포인터 변수 p에 arr의 주소를 넣어서 접근하지 않아도 문제를 풀 수 있지만 이 문제를 통해서 포인터를 통해서 배열에 접근할 수 있다는 것을 알게 되었다.
포인터 변수 p에 arr의 주소를 넣어서 접근하지 않아도 문제를 풀 수 있지만 이 문제를 통해서 포인터를 통해서 배열에 접근할 수 있다는 것을 알게 되었다.
2019년 5월 14일 화요일
로또
오늘은 로또했다. 전에도 로또했는데 오늘은 함수로 바꿔서 했다. 먼저 랜덤함수를 이용해서 로또 번호를 받는다. 로또 번호를 받으면 IsFind를 통해서 중복검사를 한다. 중복검사를 하는 방법은 먼저 로또 번호를 받은 배열의 인덱스를 넘겨주고 그 인덱스까지 j가 그 인덱스의 바로 전 인덱스까지 같은지 검사해서 같으면 인덱스의 값을 1빼줘서 그 인덱스의 랜덤값을 다시 받는다. 이걸 하다가 알게 된게 있는데 *i--; 를 하면 i를 참조한 값이 --되는게 아니고 i라는 데이터의 주소값이 --가 되고 참조를 한다는 것을 알게 됐다. 그래서 *i -= 1;로 고쳐서 썼다. 마지막으로 Show를 통해서 배열 data에 있는 수들을 출력한다.
2019년 4월 30일 화요일
C 언어 배우기 (함수)
함수를 배웠다. 선언, 정의, 호출을 배웠다. 선언할 때는 반환 자료형, 함수이름, 매개변수, 세미콜론으로 선언을 한다. 정의를 할 때는 반환 자료형, 함수이름, 매개변수, 그리고 함수로 할 동작들을 작성한다.
GetData라는 함수로 수를 입력 받고 GetMax라는 함수로 입력받은 수 중에서 가장 큰 값을 얻는다. 이번엔 특별히 전역 변수를 선언해서 MAX값을 구해보았다. 원래 프린트에는 그냥 매개변수 세 개를 받아서 그 중에 가장 큰 값을 구하게 되어 있는데 매개변수 하나만 받아서 가장 큰 값을 구했다. 전역변수는 코드의 어디서든 사용할 수 있고 갑자기 생각나서 한 번 사용해 봤다.
GetMax를 통해서 가장 큰 값을 구해서 nMax에 넣고 PrintData함수에 입력 받은 수와 그 수중에 가장 큰 수를 출력하도록 했다.
GetData라는 함수로 수를 입력 받고 GetMax라는 함수로 입력받은 수 중에서 가장 큰 값을 얻는다. 이번엔 특별히 전역 변수를 선언해서 MAX값을 구해보았다. 원래 프린트에는 그냥 매개변수 세 개를 받아서 그 중에 가장 큰 값을 구하게 되어 있는데 매개변수 하나만 받아서 가장 큰 값을 구했다. 전역변수는 코드의 어디서든 사용할 수 있고 갑자기 생각나서 한 번 사용해 봤다.
GetMax를 통해서 가장 큰 값을 구해서 nMax에 넣고 PrintData함수에 입력 받은 수와 그 수중에 가장 큰 수를 출력하도록 했다.
2019년 4월 25일 목요일
C언어 배우기 (성실한 개미)
오늘은 코드업에 있는 성실한 개미 문제를 풀어보았다. 10*10 크기로 맵을 입력 받는다. 먼저 겉에는 1로 되어 있고 속에 0과 1과 2로 이루어져 있는데 0은 개미가 돌아다닐 수 있는 공간이고 1은 벽이라서 움직일 뚫고 갈 수가 없고 2는 먹이다. 개미는 무조건 기본적으로 오른쪽으로 가는데 만약에 1을 만나면 아래로 내려간다. 그리고 개미가 지나간 곳은 9로 채워지고 개미가 멈추는 곳은 맵의 가장 오른쪽 밑이거나 먹이를 만나거나 더이상 움직일 수 없는 곳에서 멈춘다.
먼저 10*10의 맵을 만들고 개미가 움직이기 시작할 곳인 startx와 starty를 선언해서 둘다 1로 정의 했다. 그리고 맵을 입력받는다. 그 다음에 while문을 열어서 개미가 오른쪽 가장 밑에 갈 때까지 반복한다. 그리고 만약에 개미의 오른쪽이 장애물이고 아래에 먹이가 있으면 멈추도록 if문을 만들었고 만약에 그런게 아니고 개미 오른쪽에 장애물만 있다면 그냥 밑으로 가도록 했다. 그리고 오른쪽이 비어있으면 그냥 startx를 증가시키고 원래 있던 곳을 9로 만든다. 개미의 움직임이 끝나면 그 결과를 출력한다. 이 문제의 예는 밑에 있다.
입력
출력
먼저 10*10의 맵을 만들고 개미가 움직이기 시작할 곳인 startx와 starty를 선언해서 둘다 1로 정의 했다. 그리고 맵을 입력받는다. 그 다음에 while문을 열어서 개미가 오른쪽 가장 밑에 갈 때까지 반복한다. 그리고 만약에 개미의 오른쪽이 장애물이고 아래에 먹이가 있으면 멈추도록 if문을 만들었고 만약에 그런게 아니고 개미 오른쪽에 장애물만 있다면 그냥 밑으로 가도록 했다. 그리고 오른쪽이 비어있으면 그냥 startx를 증가시키고 원래 있던 곳을 9로 만든다. 개미의 움직임이 끝나면 그 결과를 출력한다. 이 문제의 예는 밑에 있다.
입력
출력
2019년 4월 23일 화요일
배열의 선언 방법
형식 : 자료형/배열이름[배열크기];
배열의 이름 == 주소
int a;
scanf("%d", &a); //십진수 정수를 입력받아 a라는 변수의 주소를 &로 찾아서 메모리에 접근하여 값을 삽입하는 함수.
printf("%d\n", &a);
//a라는 변수가 메모리에 할당되어 받는 주소를 출력하는 과정
& 주소 연산자 => 앰퍼샌드
변수의 주소값을 찾아주는 특수 문자
* : 에스터리스크 : 주소를 참조하여 변수의 값을 가져온다.
& : 앰퍼샌드 : 변수의 주소를 가져온다.
상호 보완 관계 => 상쇄
int b;
scanf("%d", *b);
printf("%d", *&b);
int b[3];
배열의 이름 == 주소
scanf("%d", b);
scanf("%d", &b[0]);
scanf("%d", b+1);
scanf("%d", &b[1]);
scanf("%d", b+2);
scanf("%d", &b[2]);
#include <stdio.h>
int main()
{
int arr[3];
scanf("%d", arr);
//scanf("%d", &arr[0]);
printf("%d", arr[0]);
printf("%d", *arr);
printf("%d", *&arr[0]);
&arr[0] == arr
&arr[1] == arr + 1
&arr[i] == arr+i
}
배열의 이름 == 주소
int a;
scanf("%d", &a); //십진수 정수를 입력받아 a라는 변수의 주소를 &로 찾아서 메모리에 접근하여 값을 삽입하는 함수.
printf("%d\n", &a);
//a라는 변수가 메모리에 할당되어 받는 주소를 출력하는 과정
& 주소 연산자 => 앰퍼샌드
변수의 주소값을 찾아주는 특수 문자
* : 에스터리스크 : 주소를 참조하여 변수의 값을 가져온다.
& : 앰퍼샌드 : 변수의 주소를 가져온다.
상호 보완 관계 => 상쇄
int b;
scanf("%d", *b);
printf("%d", *&b);
int b[3];
배열의 이름 == 주소
scanf("%d", b);
scanf("%d", &b[0]);
scanf("%d", b+1);
scanf("%d", &b[1]);
scanf("%d", b+2);
scanf("%d", &b[2]);
#include <stdio.h>
int main()
{
int arr[3];
scanf("%d", arr);
//scanf("%d", &arr[0]);
printf("%d", arr[0]);
printf("%d", *arr);
printf("%d", *&arr[0]);
&arr[0] == arr
&arr[1] == arr + 1
&arr[i] == arr+i
}
2019년 4월 22일 월요일
C언어 배우기 (랜덤 함수)
오늘은 랜덤함수에 대해 배워보았다. 랜덤함수를 쓰기 위해서는 우선 stdlib.h, time.h라는 헤더 파일이 추가로 필요하다. 이 소스코드는 로또 번호를 추첨하는 소스코드다. 그리고 만약에 같은 번호가 나오면 다시 추첨하는 코드다.
srand는 난수 기준값을 초기화하는 함수다. rand를 그냥 사용하면 랜덤은 랜덤인데 맨날 같은 값만 나온다. 그래서 srand에 time(NULL)을 넣어 줌으로써 난수를 계속 초기화시키는 것이다. time을 넣어주는 이유는 time은 계속해서 변하는 수이기 때문에 난수를 계속 다르게 초기화할 수 있다. rand() % n + 1을 해주면
1 ~ n까지의 랜덤값을 받을 수 있다.
마지막으로 같은 번호가 나왔을 때 다시 추첨하는 방법은 먼저 처음 번호가 나왔을 때는 비교할 대상이 없으니까 그냥 출력을 하고 그 다음부터는 나온 수와 같은지 비교를 해서 만약에 같으면 check2라는 변수를 1씩 높이고 만약에 check2가 0이 아니면 i값을 낮추고 다시 추첨을 하는 형식이다.
srand는 난수 기준값을 초기화하는 함수다. rand를 그냥 사용하면 랜덤은 랜덤인데 맨날 같은 값만 나온다. 그래서 srand에 time(NULL)을 넣어 줌으로써 난수를 계속 초기화시키는 것이다. time을 넣어주는 이유는 time은 계속해서 변하는 수이기 때문에 난수를 계속 다르게 초기화할 수 있다. rand() % n + 1을 해주면
1 ~ n까지의 랜덤값을 받을 수 있다.
마지막으로 같은 번호가 나왔을 때 다시 추첨하는 방법은 먼저 처음 번호가 나왔을 때는 비교할 대상이 없으니까 그냥 출력을 하고 그 다음부터는 나온 수와 같은지 비교를 해서 만약에 같으면 check2라는 변수를 1씩 높이고 만약에 check2가 0이 아니면 i값을 낮추고 다시 추첨을 하는 형식이다.
2019년 4월 18일 목요일
재밌는 Node.js (가위바위보 구현)
var scanf = require('scanf'); let check = 1; while(check) { console.log('도전자1 :'); let challenger1 = scanf('%s'); console.log('도전자2 :'); let challenger2 = scanf('%s'); if(challenger1 === challenger2) { console.log('무승부'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } else if(challenger1 === '가위') { if(challenger2 === '바위') { console.log('도전자2 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } else if(challenger2 === '보자기') { console.log('도전자1 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } } else if(challenger1 === '바위') { if(challenger2 === '가위') { console.log('도전자1 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } else if(challenger2 === '보자기') { console.log('도전자2 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } } else if(challenger1 === '보자기') { if(challenger2 === '가위') { console.log('도전자2 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } else if(challenger2 === '바위') { console.log('도전자1 승'); console.log('다시 할거면 1, 안할거면 0'); check = scanf('%d'); continue; } } }
오늘은 자바스크립트를 웹이 아닌 환경에서 사용할 수 있게 해주는 Node.js에 대해서 올릴 것이다. 코드를 대충 보면
원래 하던 C언어랑 비슷해 보이는데 다른 점은 먼저 변수의 자료형을 개발자가 지정해주는 것이 아니라는 점이고 자바
스크립트는 printf대신에 console.log를 사용해서 콘솔에 출력을 한다. 그리고 코드를 보면 scanf라는 익숙한 친구가
보이는데 scanf는 원래 자바스크립트에는 없는 것인데 Node.js에만 있는 npm(Node Package Manager)이라는 프로그램을
통해서 scanf를 불러온 것이다. scanf를 불러온 부분이 제일 처음에 나오는 var scanf = require('scanf');부분이다.
아직 한지 얼마 안되서 잘 모르기는 한데 npm을 많이 사용할 것 같다. 그리고 ===이라는 건 C언어에는 없는 것이다.
===은 ==이랑 비슷한데 양 옆의 두 값이 같으면 참을 보낸다. ==은 두 값의 타입은 안보고 값만 비교하는 것이고
===은 두 값의 타입과 값을 둘 다 보는 것이다. 자세히 말하자면 ==은 두 값을 강제 형변환을 통해서 서로 같은 형으로
변환을 한 다음에 값을 비교한다.
위에 설명한 것들을 제외하고 나머지 코드들은 C언어와 비슷하다. 가위바위보를 하려면 두 사람이 있어야 하니까
도전자1과 도전자2를 선언하는 동시에 scanf를 통해서 가위, 바위, 보자기 중에서 무엇을 낼 것인지 입력을 받는다.
입력을 받으면 가위바위보의 모든 경우의 수를 if else문들을 써서 도전자1과 도전자2의 가위바위보 결과를 내놓는다.
그리고 처음에 선언해둔 check변수에 1 또는 0을 입력 받아서 반복문을 계속 반복할 것인지 멈출 것인지를 결정한다.
오늘 처음 Node.js로 제대로 된 걸 만들어 봤는데 새로운 부분도 많고 C언어와 비슷한 부분도 많아서 재미가 있었다.
2019년 4월 16일 화요일
C언어 배우기 (윤년 달력 문제)
오늘은 윤년 달력 문제를 풀었다. 수업 시간에 풀었다. 먼저 몇 년을 입력하고 그 다음에 몇 달을 입력해서 그 연도, 그 달의 날수를 구하는 것이다. 특별히 배열을 선언해서 풀은 문제다. 먼저 연도를 입력받을 year이라는 변수를 선언하고 달마다 일 수로 배열, month를 초기화 했다. 그리고 while문을 조절할 check라는 변수를 선언했다. 먼저 연도를 입력하고 월을 입력한 다음에 만약에 월이 1보다 작거나 12보다 크면 다시 입력할 수 있도록 continue를 적어줬다. 그리고 if문으로 year가 윤년이면 2월을 29일로 바꾸었다. 근데 지금 보니까 실수한 것 같은게 만약에 while문을 다시 돌리면 2월을 초기화 해줘야 되는데 그걸 깜빡한 것 같다. 아무튼 그 다음에 for문을 다시 열어서 i가 11보다 작거나 같으면 반복하도록 해서 12번 반복하도록 했다. 그리고 입력된 연도와 월의 날 수를 출력하도록 했다. check에 1을 입력하면 참이 되기 때문에 다시 반복하고 0이 입력되면 거짓이기 때문에 반복을 멈추고 프로그램을 종료한다.
2019년 4월 15일 월요일
C언어 배우 (배열)
오늘은 백준 배열 문제를 여러개 풀어봤다. 방학 때 들은 강의에서 배열에 대한 강의도 들었는데 그때도 제대로 이해 안됐었고 지금은 거의 가물가물해서 여러 문제 풀어봤다.
여러개 풀어본 문제 중에 정답률이 제일 낮은 문제를 풀어봤다. 문제는 문자열을 입력받고 그 문자열의 단어의 개수를 구하는 문제다. 조건은 공백이 연속해서 나오는 경우는 없고 문자열의 앞과 뒤에 공백이 있을 수 있다는 조건이다.
문자열의 길이가 1000000이 넘지 않는다는 조건에 따라서 1000001byte길이의 char 변수를 선언했다. 그리고 반복문에 사용할 i와 문자열에서 단어의 개수와 직접적으로 연관된 spacebar라는 변수를 선언했다. 왜냐하면 단어는 띄어쓰기 한 개로 구분된다는 조건이 있었기 때문이다.
먼저 gets로 처음에 선언한 문자열 a에 입력을 받는다. 그리고 변수 i를 a의 인덱스로 이용해서 문자열의 끝인 NULL이 나올때 까지 for문을 반복한다. 그리고 for문 안에는 if문으로 인덱스가 0이 아니고 문자열에서 공백이 나왔을 때 spacebar를 증가시킨다. 문자열의 인덱스가 0이 아닐 때를 포함시킨 이유는 문자열의 처음 공백이 단어 수로 들어가면 안 되기 때문이다. 그리고 문자열의 공백의 수만큼 spacebar를 다 증가시켰으면 만약 문자열의 끝에 공백이 있을 때를 생각해야 한다. 그래서 for문이 끝난 후에 if문을 열어서 만약 문자열의 끝인 NULL에서 한 인덱스 전에 들어있는게 공백이면 spacebar를 감소시키게 만들었다. 이 if문이 따로 바깥으로 빠져있는 이유는 for문이 다 끝날 때까지 a의 끝을 알 수 없기 때문이다. 그래서 for문이 다 끝난 후에 NULL의 인덱스를 구했다. 마지막으로 spacebar + 1을 출력해주면 문자열의 단어의 개수를 알 수 있다.
2019년 4월 12일 금요일
C언어 배우기 (이중 for문)
오늘 코드는 이중 for문을 이용한 코드다. 생긴게 별찍기랑 비슷한데 출력도 계단 모양으로 만드는 별찍기에서 별 대신 숫자를 쓴 형태다.
먼저 총 몇 줄을 출력할 지 나타내는 변수 n을 입력 받는다. 그리고 for문을 열어서 i = 1을 선언하고 for문이 한 루프 돌아갈 때마다 i를 1씩 증가시키고 n이 i와 같거나 i보다 작아질 때까지 반복한다. 그리고 첫번째 for문을 한 번 반복할 때마다 개행을 해준다.
첫 번째 for문 안에 for문이 하나 더 들어있다. j = 1을 선언하고 i가 n과 같거나 n보다 작아질 때까지 반복을 한다. 그 이유는 줄이 1줄 늘어났을 때 한 줄에 들어가는 숫자도 1개씩 늘어나야 하기 때문이다. 그리고 반복하면서 처음에 선언해 둔 k를 출력한다. 그리고 k++을 통해서 숫자를 계속 늘려준다.
아래는 n에 5를 입력했을 때 출력값이다.
먼저 총 몇 줄을 출력할 지 나타내는 변수 n을 입력 받는다. 그리고 for문을 열어서 i = 1을 선언하고 for문이 한 루프 돌아갈 때마다 i를 1씩 증가시키고 n이 i와 같거나 i보다 작아질 때까지 반복한다. 그리고 첫번째 for문을 한 번 반복할 때마다 개행을 해준다.
첫 번째 for문 안에 for문이 하나 더 들어있다. j = 1을 선언하고 i가 n과 같거나 n보다 작아질 때까지 반복을 한다. 그 이유는 줄이 1줄 늘어났을 때 한 줄에 들어가는 숫자도 1개씩 늘어나야 하기 때문이다. 그리고 반복하면서 처음에 선언해 둔 k를 출력한다. 그리고 k++을 통해서 숫자를 계속 늘려준다.
아래는 n에 5를 입력했을 때 출력값이다.
2019년 4월 10일 수요일
오늘은 교과서 풀이
교과서 문제 풀이를 했다. 오늘 처음 들어본 건 Xcode다. Xcode도 IDE인데 맥 운영체제에서 사용할 수 있는 무료 통합 개발 환경이라고 한다. 예제를 하나 보니까 C언어 Hello World예제를 쓰는거랑 똑같이 소스코드가 작성되어 있는데 결과가 좀 길고 신기하게 생겼다. 이 긴 결과들의 의미가 궁금하지만 지금은 아니고 언젠가 알아봐야겠다.
그리고 펌웨어라는 개념도 새로 알게 됐다. 펌웨어는 소프트웨어랑 하드웨어가 결합된 형태라고 한다. 하드웨어 안에 소프트웨어가 탑제?되어 있는 형식인 것 같다. 펌웨어가 어떻게 생겼는지 한 번 보고싶다.
웹 전용 프로그래밍 언어에 대해서도 배웠는데 JSP, CSS, PHP, JavaScript 등이 있다. JSP는 오늘 처음 들어봤다. JSP는 Java Server Pages의 약자다. 보니까 서버를 만드는 언어인 것 같다. 앞으로 내가 1년 동안 보게 될 언어들이다. 친하게 지내야 겠다.
나머지 문제들은 다 알고 있는 문제들이었다. 시험 문제는 여기서 조금 변형해서 나온다고 하니까 교과서를 잘 보면 시험도 잘볼 수 있을 것 같다.
그리고 펌웨어라는 개념도 새로 알게 됐다. 펌웨어는 소프트웨어랑 하드웨어가 결합된 형태라고 한다. 하드웨어 안에 소프트웨어가 탑제?되어 있는 형식인 것 같다. 펌웨어가 어떻게 생겼는지 한 번 보고싶다.
웹 전용 프로그래밍 언어에 대해서도 배웠는데 JSP, CSS, PHP, JavaScript 등이 있다. JSP는 오늘 처음 들어봤다. JSP는 Java Server Pages의 약자다. 보니까 서버를 만드는 언어인 것 같다. 앞으로 내가 1년 동안 보게 될 언어들이다. 친하게 지내야 겠다.
나머지 문제들은 다 알고 있는 문제들이었다. 시험 문제는 여기서 조금 변형해서 나온다고 하니까 교과서를 잘 보면 시험도 잘볼 수 있을 것 같다.
2019년 4월 9일 화요일
C언어 배우기 (do while문)
오늘 올릴 게시물은 do while문에 관한 것이다.
do while문은 방학 때 최호성 강의에서도 이미 배운적이 있는 내용이다. 그런데 오늘 do while문에 대해서 올리게 된 이유는 오늘 do while문의 필요성을 느끼게 되었기 때문이다.
do while문과 while문의 차이점은 먼저 do while문은 조건식이 틀리든 안 틀리든 무조건 한 번은 실행문을 수행한다는 점이다. 그리고 do while문의 형식은
do
{
실행문;
} while(조건식);
이다. 여기서 중요한 건 while문과 다르게 do while문은 while뒤에 ;을 붙여야 된다.
이게 오늘 do while문을 사용해본 코드다. 처음엔 그냥 for문으로 해야겠다고 생각했다가 하다보니까 막히는 부분이 생겨서 생각이 난게 do while문이다. 코드를 보면 아까 말한 do while문의 형식처럼 do를 쓰고 실행문을 여러개 적은 다음에 끝에 while(조건식)을 써주고 ;으로 마무리한다.
솔직히 오늘 내용은 그렇게 대단한 발견 같은건 아닌데 do while문이 쓰일 곳이 있구나 라는 걸 느꼈다. 그리고 오늘은 코드가 머리에서 좀 잘 나온 날이라서 좋았다.
2019년 4월 8일 월요일
C언어 배우기 (백준 소수 구하기 문제)
이 코드는 백준에 올라와 있는 소수 구하기 문제를 풀기 위해서 작성한 코드다. 답은 맞게 나오는데 백준에 제출해 봤더니 시간 초과가 나와서 정답은 안나왔다.
문제 내용은 최소(M)와 최대(N)를 받아서 최소로 받은 수에서 최대로 받은 수까지 소수를 출력하는 것이다.
먼저 i를 최소인 M으로 오버라이트 해주고 최대인 N이 i보다 크거나 같을 때까지 반복한다. 여기서 i는 소수인지 아닐지 검사할 때 쓰는 수다. 그리고 i가 소수이면 i를 출력한다. 내가 소수를 검출해낸 방법은 i를 1부터 i까지 나눠 보면서 i를 j로 나눠서 나머지가 0이면 미리 선언했던 변수 k에 1씩 더한다. 일단 모든 수는 1과 자신으로 나누면 나머지가 0이기 때문에 마지막 if문에 k가 3보다 작을 때 소수인 i를 출력하는 방식이다.
뭔가 내가 생각하면서 쓴 소스코드를 글로 표현하려니까 좀 어려운 것 같다.
다음엔 이 문제를 시간 초과가 안나오게 다듬어서 백준에 제출해야 겠다.
문제 내용은 최소(M)와 최대(N)를 받아서 최소로 받은 수에서 최대로 받은 수까지 소수를 출력하는 것이다.
먼저 i를 최소인 M으로 오버라이트 해주고 최대인 N이 i보다 크거나 같을 때까지 반복한다. 여기서 i는 소수인지 아닐지 검사할 때 쓰는 수다. 그리고 i가 소수이면 i를 출력한다. 내가 소수를 검출해낸 방법은 i를 1부터 i까지 나눠 보면서 i를 j로 나눠서 나머지가 0이면 미리 선언했던 변수 k에 1씩 더한다. 일단 모든 수는 1과 자신으로 나누면 나머지가 0이기 때문에 마지막 if문에 k가 3보다 작을 때 소수인 i를 출력하는 방식이다.
뭔가 내가 생각하면서 쓴 소스코드를 글로 표현하려니까 좀 어려운 것 같다.
다음엔 이 문제를 시간 초과가 안나오게 다듬어서 백준에 제출해야 겠다.
2019년 4월 4일 목요일
정보 처리 기능사 공부1
원래 프로그래밍 관련된 글만 올리고 싶었는데 요즘 그게 안된다. 핑계라고 할 수도 있지만 정보 처리 기능사 공부를 하거나 전공 동아리 숙제를 하느라 코드를 짤 시간이 없다. 그래서 오늘은 정보 처리 기능사 공부를 한 내용을 복습 겸 적어보려고 한다.
오늘 배웠던 건 DOS랑 UNIX에 관한 내용이다. DOS는 Disk Operating System의 약자다. 이름 그대로 디스크 운영 체제라고 한다. 그리고 UNIX도 운영체제다.
DOS에서 정보를 저장하는 공간을 디렉토리(Directory)라고 한다. 그리고 DOS는 여러 명령어를 이용해서 디스크와 디렉토리를 관리한다. DIR이라는 명령어를 통해서 디렉토리 안에 있는 파일과 하위 디렉토리의 목록을 볼 수 있다. 그리고 이런 디렉토리를 만들기 위해서는 MD라는 명령어를 사용하고 디렉토리를 지우기 위해서는 RD라는 명령어를 사용한다. 영어를 몰랐다면 MD를 그냥 외웠을텐데 영어를 배우긴 했으니까 느낌으로 Make Directory, Remove Directory라는게 느껴져서 지금까지의 영어 공부가 헛되지 않았다는 느낌을 줬다. 이외에도 FIND(문자열 검색), SORT(정렬), VER(버전 확인) 같은 명령어도 공부했다.
그리고 UNIX는 C언어 기반으로 만들어진 운영 체제라서 이식성이 좋고 확장성이 좋다. 그리고 내가 알기로는 UNIX를 만들기 위해서 C언어가 만들어진 거라고 들었다. 아마도? UNIX도 DOS처럼 다양한 명령어를 가지고 있다.
사실 아직 UNIX 부분을 다 본게 아니라서 별로 정리를 못했다. 내일은 코드를 짜거나 아니면 정보 처리 기능사 내용을 좀 더 제대로 공부해서 글을 올려야 겠다.
오늘 배웠던 건 DOS랑 UNIX에 관한 내용이다. DOS는 Disk Operating System의 약자다. 이름 그대로 디스크 운영 체제라고 한다. 그리고 UNIX도 운영체제다.
DOS에서 정보를 저장하는 공간을 디렉토리(Directory)라고 한다. 그리고 DOS는 여러 명령어를 이용해서 디스크와 디렉토리를 관리한다. DIR이라는 명령어를 통해서 디렉토리 안에 있는 파일과 하위 디렉토리의 목록을 볼 수 있다. 그리고 이런 디렉토리를 만들기 위해서는 MD라는 명령어를 사용하고 디렉토리를 지우기 위해서는 RD라는 명령어를 사용한다. 영어를 몰랐다면 MD를 그냥 외웠을텐데 영어를 배우긴 했으니까 느낌으로 Make Directory, Remove Directory라는게 느껴져서 지금까지의 영어 공부가 헛되지 않았다는 느낌을 줬다. 이외에도 FIND(문자열 검색), SORT(정렬), VER(버전 확인) 같은 명령어도 공부했다.
그리고 UNIX는 C언어 기반으로 만들어진 운영 체제라서 이식성이 좋고 확장성이 좋다. 그리고 내가 알기로는 UNIX를 만들기 위해서 C언어가 만들어진 거라고 들었다. 아마도? UNIX도 DOS처럼 다양한 명령어를 가지고 있다.
사실 아직 UNIX 부분을 다 본게 아니라서 별로 정리를 못했다. 내일은 코드를 짜거나 아니면 정보 처리 기능사 내용을 좀 더 제대로 공부해서 글을 올려야 겠다.
2019년 4월 2일 화요일
C언어 배우기 (수업시간 내용)
오늘 6, 7교시에 프로그래밍을 했다. 프로그래밍 시간에 여러 예제를 풀었는데 그중에 가장 헤맸던 평균 구하기 문제에 대해서 글을 올리기로 했다.
사실 보통 평균 구하기 문제는 scanf로 입력받고 입력받은 수들을 더해서 입력받은 수들의 갯수 만큼 나눠주면 쉽게 구하는 문제인데 오늘 했던 평균 구하기 문제는 처음에 입력받을 수들의 갯수를 입력받고 평균을 구하는 문제였다. 아래의 소스코드가 최종적으로 구한 답인데 이렇게 되는데 꽤 시간이 걸렸다. 왜냐하면 이걸 굳이 배열을 이용해서 풀려고 했기 때문이다. 처음에 했던 생각은 먼저 입력받을 수들의 갯수를 입력받고 그 입력받은 값으로 int형 배열을 선언하려고 했다.(예 : int a[i]) 그리고 배열을 선언하고 for문을 열어서 배열에 값들을 입력받으려고 했는데 오류가 나서 결국 다시 생각해서 이 소스코드를 작성했다.
이렇게 배열로 삽질을 했으니 배열에 대해서 다시 공부를 해봤다. 그리고 내가 썼던 소스코드가 왜 오류를 냈는지 바로 알 수 있었다. 배열의 길이를 선언할 때는 상수만 사용해야 했기 때문이다. 그런데 내 기억으로는 어디선가 인덱스 넣는 대괄호 안에 변수를 넣는 걸 본적이 있는 것 같아서 헷갈린다. 아니면 처음에 배열을 선언할 때만 배열의 길이를 상수로 적어야 하고 그냥 인덱스 넣어줄 때는 변수가 들어가도 되는 것일지도 모른다. 이거에 대해서는 좀 더 알아봐야 겠다. 그리고 배열을 조사하면서 또 알게된 점은 C 컴파일러가 배열의 길이를 전혀 신경쓰지 않는다는 점이다. 예를 들면 배열의 길이를 3으로 정해서 인덱스는 0, 1, 2까지 밖에 없는데 인덱스를 3으로 해서 초기화하면 그게 그대로 적용이 된다.
오늘 아래 문제를 풀면서 배열로 삽질을 좀 했는데 삽질도 도움이 된다는 걸 몸소 느꼈다.
사실 보통 평균 구하기 문제는 scanf로 입력받고 입력받은 수들을 더해서 입력받은 수들의 갯수 만큼 나눠주면 쉽게 구하는 문제인데 오늘 했던 평균 구하기 문제는 처음에 입력받을 수들의 갯수를 입력받고 평균을 구하는 문제였다. 아래의 소스코드가 최종적으로 구한 답인데 이렇게 되는데 꽤 시간이 걸렸다. 왜냐하면 이걸 굳이 배열을 이용해서 풀려고 했기 때문이다. 처음에 했던 생각은 먼저 입력받을 수들의 갯수를 입력받고 그 입력받은 값으로 int형 배열을 선언하려고 했다.(예 : int a[i]) 그리고 배열을 선언하고 for문을 열어서 배열에 값들을 입력받으려고 했는데 오류가 나서 결국 다시 생각해서 이 소스코드를 작성했다.
이렇게 배열로 삽질을 했으니 배열에 대해서 다시 공부를 해봤다. 그리고 내가 썼던 소스코드가 왜 오류를 냈는지 바로 알 수 있었다. 배열의 길이를 선언할 때는 상수만 사용해야 했기 때문이다. 그런데 내 기억으로는 어디선가 인덱스 넣는 대괄호 안에 변수를 넣는 걸 본적이 있는 것 같아서 헷갈린다. 아니면 처음에 배열을 선언할 때만 배열의 길이를 상수로 적어야 하고 그냥 인덱스 넣어줄 때는 변수가 들어가도 되는 것일지도 모른다. 이거에 대해서는 좀 더 알아봐야 겠다. 그리고 배열을 조사하면서 또 알게된 점은 C 컴파일러가 배열의 길이를 전혀 신경쓰지 않는다는 점이다. 예를 들면 배열의 길이를 3으로 정해서 인덱스는 0, 1, 2까지 밖에 없는데 인덱스를 3으로 해서 초기화하면 그게 그대로 적용이 된다.
오늘 아래 문제를 풀면서 배열로 삽질을 좀 했는데 삽질도 도움이 된다는 걸 몸소 느꼈다.
2019년 4월 1일 월요일
API 조사
오늘 전공 동아리 숙제중에 하나인 API알아보기를 해봤다. API를 이해하기 위해서 유튜브에 생활코딩이라는 채널에서 약 25분짜리 영상을 봤다. 상당히 이해하기 좋게 잘 설명을 해주는 것 같다.
API는 Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스라고 한다. 그리고 영상에 API랑 같이 UI라는 개념도 나와있었다. UI는 User Interface, 사용자인터페이스라고 한다. UI는 사람과 컴퓨터 사이에서 의사소통을 할 수 있도록 해주는 인터페이스다. 예를 들면 키보드의 백스페이스키나 엔터키 같은 거는 하드웨어적 UI이고 브라우저에 뒤로가기 버튼이나 닫기 버튼 같은 것은 소프트웨어적 UI이다.
브라우저에서 검색창에 javascript:alert("Hello world"); 를 입력하면 화면 한 가운데에 Hello world와 함께 경고창이 뜬다. 근데 이런 경고창을 띄우기 위해서는 화면 가운데의 좌표를 알아내서 그곳에 위치하도록 설정을 해줘야 되고 경고창에 나와있는 !표시도 넣어주어야 한다. 하지만 alert라는 명령어 하나 만으로 저 모든 과정을 퉁칠 수 있다. 여기서 alert라는 명령어를 API라고 한다. 이런 API는 크롬, 파이어폭스, 인터넷 익스플로러 같은 브라우저를 만든 개발자들이 만들어 놓은 것이다. API의 정의는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 웹 개발자들은 alert같은 API를 응용하여 브라우저의 기능을 제어한다.
API는 Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스라고 한다. 그리고 영상에 API랑 같이 UI라는 개념도 나와있었다. UI는 User Interface, 사용자인터페이스라고 한다. UI는 사람과 컴퓨터 사이에서 의사소통을 할 수 있도록 해주는 인터페이스다. 예를 들면 키보드의 백스페이스키나 엔터키 같은 거는 하드웨어적 UI이고 브라우저에 뒤로가기 버튼이나 닫기 버튼 같은 것은 소프트웨어적 UI이다.
브라우저에서 검색창에 javascript:alert("Hello world"); 를 입력하면 화면 한 가운데에 Hello world와 함께 경고창이 뜬다. 근데 이런 경고창을 띄우기 위해서는 화면 가운데의 좌표를 알아내서 그곳에 위치하도록 설정을 해줘야 되고 경고창에 나와있는 !표시도 넣어주어야 한다. 하지만 alert라는 명령어 하나 만으로 저 모든 과정을 퉁칠 수 있다. 여기서 alert라는 명령어를 API라고 한다. 이런 API는 크롬, 파이어폭스, 인터넷 익스플로러 같은 브라우저를 만든 개발자들이 만들어 놓은 것이다. API의 정의는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 웹 개발자들은 alert같은 API를 응용하여 브라우저의 기능을 제어한다.
2019년 3월 28일 목요일
마크업과 마크다운
드디어 전공 동아리 숙제가 나왔다. 지금까지 뭘 해야 될지 몰라서 갈팡질팡하고 있었는데 드디어 할게 생겼다. 그리고 오늘 동아리 백엔드를 맡고 있는 형한테 들은게 있는데 프론트엔드는 백엔드를 안 해도 되는데 백엔드는 프론트엔드도 알아야 되고 네트워크도 알아야 되고 뭐 다 알아야 된다는 것이었다. 그걸 듣고 힘들겠다는 생각도 났지만 그만큼 다재다능해질 수 있다는 얘기니까 그런 점은 좋았다.
본론으로 들어가서 오늘 받았던 숙제 내용은 마크다운과 github에 대해서 조사를 하고 할 수 있는 만큼 정리를 하라는 숙제였다. 우선 마크다운을 조사하다 보니까 마크다운이 마크업 언어의 일종이라는 것을 알게 됐다. 근데 마크업 언어의 뜻도 제대로 모르는데 마크다운을 배운다는게 말이 안된다고 생각이 되서 먼저 마크업에 대해서 알아봤다. 마크업은 문서가 화면에 표시되는 형식을 나타내거나 데이터의 논리적인 구조를 명시하기 위한 규칙들을 정의한 언어의 일종이라고 한다. 사실 아직 제대로 이해하지는 못했지만 결국 PC랑 서버가 주고받는 정보를 우리가 볼 수 있는 가상의 공간인 인터넷에 표시할 수 있게 해주는 언어라는 말인 것 같다. 이런 마크업 언어에 HTML, 마크다운 같은게 있는 것이다.
마크다운도 HTML과 비슷한 마크업 언어인데 마크다운으로 작성하면 더 간결하게 작성할 수 있고 HTML 같은 다른 문서형태로 변환도 가능하다. 마크다운의 장점은 앞서 말한 간결하다는 점, 다양한 형태로 변환이 가능하다는 점, 텍스트로 저장되서 용량이 적다는 점, 지원하는 프로그램과 플랫폼이 다양하다는 점 등이 있다. 반면에 단점도 있는데 먼저 비표준이라는 점이고 비표준이 이기 때문에 도구에 따라서 변환방식이나 생성물이 다르다는 단점이 있다. 그리고 모든 HTML 마크업을 대신하지 못한다는 단점도 있다.
아직은 자료를 보고 내용을 정리할 수 없지만 동아리 활동 열심히 하다보면 자료 안보고도 내용을 정리할 수 있게 될테니까 열심히 해야겠다.
본론으로 들어가서 오늘 받았던 숙제 내용은 마크다운과 github에 대해서 조사를 하고 할 수 있는 만큼 정리를 하라는 숙제였다. 우선 마크다운을 조사하다 보니까 마크다운이 마크업 언어의 일종이라는 것을 알게 됐다. 근데 마크업 언어의 뜻도 제대로 모르는데 마크다운을 배운다는게 말이 안된다고 생각이 되서 먼저 마크업에 대해서 알아봤다. 마크업은 문서가 화면에 표시되는 형식을 나타내거나 데이터의 논리적인 구조를 명시하기 위한 규칙들을 정의한 언어의 일종이라고 한다. 사실 아직 제대로 이해하지는 못했지만 결국 PC랑 서버가 주고받는 정보를 우리가 볼 수 있는 가상의 공간인 인터넷에 표시할 수 있게 해주는 언어라는 말인 것 같다. 이런 마크업 언어에 HTML, 마크다운 같은게 있는 것이다.
마크다운도 HTML과 비슷한 마크업 언어인데 마크다운으로 작성하면 더 간결하게 작성할 수 있고 HTML 같은 다른 문서형태로 변환도 가능하다. 마크다운의 장점은 앞서 말한 간결하다는 점, 다양한 형태로 변환이 가능하다는 점, 텍스트로 저장되서 용량이 적다는 점, 지원하는 프로그램과 플랫폼이 다양하다는 점 등이 있다. 반면에 단점도 있는데 먼저 비표준이라는 점이고 비표준이 이기 때문에 도구에 따라서 변환방식이나 생성물이 다르다는 단점이 있다. 그리고 모든 HTML 마크업을 대신하지 못한다는 단점도 있다.
아직은 자료를 보고 내용을 정리할 수 없지만 동아리 활동 열심히 하다보면 자료 안보고도 내용을 정리할 수 있게 될테니까 열심히 해야겠다.
2019년 3월 27일 수요일
C언어 배우기 (마지막 별찍기)
오늘 게시할 내용은 주말 동안 하고, 학교에서도 했던 별찍기들에 관한 내용이다. 그리고 이번 게시물이 마지막 별찍기 게시물이 될 것 같다. 왜냐하면 원래 백준 별찍기 문제를 다 풀 때까지 올리려고 생각을 했는데 그러면 너무 별찍기만 올릴 것 같기 때문이다. 그래서 내일부터는 별찍기가 아니라 다른 내용으로 올리려고 생각하고 있다.
저번 주말부터 오늘까지 별찍기 문제를 5문제 정도 푼 것 같다. 한 번 풀리니까 계속 잘 풀렸다. 사진으로 올린 코드는 숫자(n)를 입력하면 2 x n - 1줄 만큼 다이아몬드 모양으로 별을 찍는 코드다. 개인적으로 제일 공들였고 어려운 코드였다고 생각해서 대표로 넣었다. 전에 올렸던 별찍기는 if문 없이 for문만 이용해서 풀었는데 이번 별찍기는 중간부터 규칙이 달라지기 때문에 if문까지 포함해서 작성했다.
그리고 별찍기를 계속하면서 느낀건 규칙만 찾으면 되는 문제인데 그 규칙 찾기가 너무 힘들다는 것이다. 아직은 조금 쉬운 별찍기를 해서 규칙찾기가 엄청 어렵지는 않지만 좀 어려운 별찍기를 하면 하루종일 규칙만 찾다가 하루가 끝날 것 같다.
별찍기가 우려먹기 좋은 소재이고 별찍기하면서 배우는 것도 많지만 계속 별찍기만 올리면 나도 지겨워서 못할 것 같다.
내일부터 다른 소재로 게시물을 올릴 거지만 별찍기도 틈틈이 하면서 백준 별찍기 문제를 다 풀어봐야겠다.
저번 주말부터 오늘까지 별찍기 문제를 5문제 정도 푼 것 같다. 한 번 풀리니까 계속 잘 풀렸다. 사진으로 올린 코드는 숫자(n)를 입력하면 2 x n - 1줄 만큼 다이아몬드 모양으로 별을 찍는 코드다. 개인적으로 제일 공들였고 어려운 코드였다고 생각해서 대표로 넣었다. 전에 올렸던 별찍기는 if문 없이 for문만 이용해서 풀었는데 이번 별찍기는 중간부터 규칙이 달라지기 때문에 if문까지 포함해서 작성했다.
그리고 별찍기를 계속하면서 느낀건 규칙만 찾으면 되는 문제인데 그 규칙 찾기가 너무 힘들다는 것이다. 아직은 조금 쉬운 별찍기를 해서 규칙찾기가 엄청 어렵지는 않지만 좀 어려운 별찍기를 하면 하루종일 규칙만 찾다가 하루가 끝날 것 같다.
별찍기가 우려먹기 좋은 소재이고 별찍기하면서 배우는 것도 많지만 계속 별찍기만 올리면 나도 지겨워서 못할 것 같다.
내일부터 다른 소재로 게시물을 올릴 거지만 별찍기도 틈틈이 하면서 백준 별찍기 문제를 다 풀어봐야겠다.
2019년 3월 26일 화요일
방과후 HTML 첫 시간
배운 건 먼저 visual studio가 아니라 visual studio code라는 프로그램을 이용해서 만든다는 것이다. 아직은 차이점을 모르겠다. 그리고 html은 처음에 !를 적고 탭키를 누르면 기본적인 틀이 저절로 생긴다.
기본적인 틀의 처음에는 title이 나오는데 title과 /title 사이에 아무 내용이나 적으면 그 내용이 웹의 이름이 된다.
그 다음엔 body가 나오는데 이 부분이 내가 만든 사이트에 나올 내용이다. h1과 /h1사이에 시간이란...이라는 단어가 적혀있는데 이러면 사이트에 두껍고 큰 글씨로 시간이란...이 제목으로 나타난다. 그리고 h1 h2 h3 이렇게 숫자가 커질수록 글씨의 두께와 크기는 작아진다. 숫자는 최대 6까지 가능하다. 그리고 p가 나오는데 p는 본문을 적는 것이다. p를 한번 쓰고 다음 줄에 바로 또 p를 쓰면 한 줄 개행되고 문장이 나온다. 중간에 br은 한 줄 개행을 뜻한다. 마지막으로 img가 있는데 얘는 말 그대로 이미지를 나타낸다.
오늘은 좀 너무 형식적으로 적은 느낌이 있는데 배우다보면 형식적인게 아니라 좀 획기적인 내용이 나올 수 있을것 같다.
첫 수업의 느낌은 처음이라 그런거일지도 모르지만 나름 흥미로웠다. 이런 마음이 계속 유지된다면 참 좋을 것 같다.
2019년 3월 25일 월요일
C언어 배우기 (또 별찍기)
오늘도 또 별찍기다. 웬만하면 당분간은 별찍기만 올리게 될 것 같다. 이번 별찍기 문제는 주말에 집으로 노트북 가져가서 푼 문제다. 문제는 전 문제랑 다르게 피라미드를 거꾸로 출력하는 문제다. 이번 문제의 답을 구할 수 있었던 건 전에 답을 봤던 피라미드 문제에서 힌트를 얻어서 구할 수 있었다. 피라미드 문제에서 얻었던 구체적인 내용은 for문에서 j를 증가하게 두고 옆에 반복할 횟수를 구하는 식을 넣어준다는 것이다.
오늘은 간만에 나 혼자서 답을 구해내서 기분이 좋다.
---------------------------------------------------------------------------------------------------
별찍기 외에 오늘 알게 된 것이 있는데 바로 3항 연산자다. 3항 연산자를 쓰는 방법은
(조건식) ? 참일 때 실행문 : 거짓일 때 실행문
이다. 뭔가 방학 때 최호성의 C프로그래밍에서 이미 배운 것 같지만 오늘 재훈이가 3항 연산자로 문제를 풀어서 다시 떠올랐다. 그리고 비트 연산자의 사용법도 알게 됐다.
저번주 주간 목표가 C언어 교재 한 번 쭉보기 였는데 무리였던 것 같다. 그냥 천천히 읽어서 4월 중반 전까지 한 번 다볼수 있도록 해야겠다.
오늘은 간만에 나 혼자서 답을 구해내서 기분이 좋다.
---------------------------------------------------------------------------------------------------
별찍기 외에 오늘 알게 된 것이 있는데 바로 3항 연산자다. 3항 연산자를 쓰는 방법은
(조건식) ? 참일 때 실행문 : 거짓일 때 실행문
이다. 뭔가 방학 때 최호성의 C프로그래밍에서 이미 배운 것 같지만 오늘 재훈이가 3항 연산자로 문제를 풀어서 다시 떠올랐다. 그리고 비트 연산자의 사용법도 알게 됐다.
저번주 주간 목표가 C언어 교재 한 번 쭉보기 였는데 무리였던 것 같다. 그냥 천천히 읽어서 4월 중반 전까지 한 번 다볼수 있도록 해야겠다.
2019년 3월 22일 금요일
C언어 배우기 (별찍기 2)
.오늘은 학교에서 못썼고 집으로 가져온 노트북은 네트워크 연결이 안되고 집 컴퓨터는 켜지지가 않아서 휴대폰으로 쓰게됐다. 오늘 12교시 프로그래밍 시간에 했던 것도 별찍기 였다. 결론부터 말하자면 또 답을 못구했다. 오늘은 저번 별찍기랑 다르게 5를 입력하면 피라미드처럼 별이 찍히게 해야한다. 코드를 사진에 나온것처럼 작성했더니 조금 비슷한 것 같지만 다른 답이 나왔다. 이번 별찍기는 저번 별찍기랑 다르게 중첩 for문을 써봤지만 조건식 같은걸 잘못 작성한 것 같다. 그리고 요즘 어려운 문제를 풀어서 그런지 몇시간 동안 해도 한 문제도 못 풀때가 많아진 것 같다. 이번 별찍기 문제는 주말동안 꼭 답을 구해봐야겠다.
2019년 3월 20일 수요일
C언어 배우기 (별찍기 분석)
잘 안보이지만 저번 별찍기 문제의 답에 하나하나 주석을 달아봤다.하나하나 주석 다는건 재훈이가 해보라고 해서 해봤는데 아직 효과가 있는지는 모르겠다.
그래도 한다고 안 좋을건 없으니까 계속 해봐야 겠다.
우선 내가 어제 만들었던 소스코드랑 다른 점은 첫 번째 for문 안에 for문이 2개 들어가 있다는 점이다. 그리고 첫 번째 for문 안에 들어있는 2개의 for문이 둘 다 int형 변수 j를 선언하고 1로 정의 한다. 그런데 조건식을 다르게 해서 답을 구해낸다. 이런 걸 보면 어제 내가 했던 방식(두 번째 for문 안에 if문 사용)으로 해도 잘만 하면 답이 나올 것 같다.
이번에 별찍기 문제 답을 분석하면서 새롭게 알게 된게 있다. 먼저 for문에서 변수를 선언, 정의 할 수 있다는 점이다. 그리고 지금까지 for문을 두개 연달아 붙인다는 걸 생각해 본적이 없는데 이번 별찍기 문제 답을 보면서 좀 더 다양한 생각을 해야 겠다고 느꼈다.
C언어 배우기 (별찍기편)
오늘은 별찍기 문제를 풀어보았다.
문제의 답을 얻진 못했지만 답에 근접한 답을 얻었다.
여러가지 삽질을 했다. 답답하지만 이 또한 경험이라고 생각한다.
문제는
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제
다.
원래 5를 입력하면
*****
****
***
**
*
이런 식으로 별들이 오른쪽으로 정렬된 채로 계단 형식으로 출력돼야 한다.
근데 내가 만든 소스코드에 5를 입력하면 별들이 왼쪽으로 정렬된 계단이 출력된다.
내가 만든 소스코드는
#include <stdio.h>
int main()
{
int n, i, k;
scanf("%d", &n);
for(i = 0; n > i; i++)
{
for(k = n; k >= 1; k--)
{
if(k - i > 0)
{
printf("*");
}
else printf(" ");
}
printf("\n");
}
}
이거다.
문제의 답을 구하지 못했기 때문에 이 문제의 답을 검색해본 다음에 그 답을 하나하나 분석해야 겠다. 내일은 문제의 답을 분석해 본 다음에 별찍기 다음 문제를 풀어봐야 겠다.
삽질을 많이 했지만 충분히 좋은 삽질이었던 것 같다.
끝
문제의 답을 얻진 못했지만 답에 근접한 답을 얻었다.
여러가지 삽질을 했다. 답답하지만 이 또한 경험이라고 생각한다.
문제는
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제
다.
원래 5를 입력하면
*****
****
***
**
*
이런 식으로 별들이 오른쪽으로 정렬된 채로 계단 형식으로 출력돼야 한다.
근데 내가 만든 소스코드에 5를 입력하면 별들이 왼쪽으로 정렬된 계단이 출력된다.
내가 만든 소스코드는
#include <stdio.h>
int main()
{
int n, i, k;
scanf("%d", &n);
for(i = 0; n > i; i++)
{
for(k = n; k >= 1; k--)
{
if(k - i > 0)
{
printf("*");
}
else printf(" ");
}
printf("\n");
}
}
이거다.
문제의 답을 구하지 못했기 때문에 이 문제의 답을 검색해본 다음에 그 답을 하나하나 분석해야 겠다. 내일은 문제의 답을 분석해 본 다음에 별찍기 다음 문제를 풀어봐야 겠다.
삽질을 많이 했지만 충분히 좋은 삽질이었던 것 같다.
끝
2019년 3월 17일 일요일
C언어 배우기 (1)
#include <stdio.h>
int main()
{
int n1, n2;
int sum, minus, mul;
double div;
system("color 1F");
puts("=================================================================");
puts("==== ==== = ======= ====== ======== === =====");
puts("======== == = ====== == ==== ================ === =====");
puts("======= ===== = ==== ===== === ============ ==== =====");
puts("===== ===== = === ======= == ============== ===== =====");
puts("============== = ================ ============= ====== =====");
puts("============== = ===== ======================= ======= =====");
puts("================= ===== =======================================");
puts("======================== ===========================");
puts("======================================C로 만든 간단 계산기=======");
_getch();
system("cls");
printf("input 2 data : ");
scanf("%d %d", &n1, &n2);
sum = n1 + n2;
minus = n1 - n2;
mul = n1 * n2;
div = (double)n1 / n2;
printf("\nn%d + %d = %d\n", n1, n2, sum);
printf("%d - %d = %d\n", n1, n2, minus);
printf("%d * %d = %d\n", n1, n2, mul);
printf("%d / %d = %.2f\n\n", n1, n2, div);
system("pause>nul");
return 0;
}
int main()
{
int n1, n2;
int sum, minus, mul;
double div;
system("color 1F");
puts("=================================================================");
puts("==== ==== = ======= ====== ======== === =====");
puts("======== == = ====== == ==== ================ === =====");
puts("======= ===== = ==== ===== === ============ ==== =====");
puts("===== ===== = === ======= == ============== ===== =====");
puts("============== = ================ ============= ====== =====");
puts("============== = ===== ======================= ======= =====");
puts("================= ===== =======================================");
puts("======================== ===========================");
puts("======================================C로 만든 간단 계산기=======");
_getch();
system("cls");
printf("input 2 data : ");
scanf("%d %d", &n1, &n2);
sum = n1 + n2;
minus = n1 - n2;
mul = n1 * n2;
div = (double)n1 / n2;
printf("\nn%d + %d = %d\n", n1, n2, sum);
printf("%d - %d = %d\n", n1, n2, minus);
printf("%d * %d = %d\n", n1, n2, mul);
printf("%d / %d = %.2f\n\n", n1, n2, div);
system("pause>nul");
return 0;
}
오늘 배운 건 계산기 만들기다. 계산기를 만드는 과정에서 시스템 함수의 여러 기능을 알게 됐다. (color를 통해서 콘솔창의 색깔을 바꾸는 것, cls로 콘솔창에 써있는 것을 싹 지우는 것 등) 그리고 원래 알고 있었지만 형변환을 다시 되새길수 있었다.
2019년 3월 13일 수요일
C언어 수업 세 번째(3월 14일 목요일 1교시)
이번 수업 시간에는 프로그래밍 언어의 분류를 배웠다.
프로그래밍 언어는 기계어, 어셈블리어, 고급언어로 분류되어있다.
사람이 알아듣기 쉬운 말일수록 고급언어라고 한다. 그리고 기계어와 어셈블리어는 저급언어라고 한다.
프로그래밍 언어의 분류 다음에 배운 것은 IDE(Integrated Development Environment)이다.
IDE라는 것은 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어이다. 예를 들면 비주얼 스튜디오, Dev c++, 코드블럭, 넷빈즈 등등이 있다.
옛날에는 소스파일을 빌드할 때 전처리기 따로, 컴파일러 따로, 링커를 따로 실행해서 했다고 한다. 역시 세상의 발전은 놀랍다고 느꼈다.
C표준에서 함수의 값을 반환하도록 되어있다고 한다. 그래서 원래는 void를 main함수의 자료형으로 사용했었는데 이제부터 int를 사용하는 것으로 습관을 만들어야 겠다.
IDE는 정말 좋은 프로그램이다. 전처리기, 컴파일러, 링커를 모두 합쳐놓은 프로그램이기 때문이다. 그리고 컴파일러가 정말 친절한 프로그램이라는 것을 느꼈다.
프로그래밍 언어는 기계어, 어셈블리어, 고급언어로 분류되어있다.
사람이 알아듣기 쉬운 말일수록 고급언어라고 한다. 그리고 기계어와 어셈블리어는 저급언어라고 한다.
프로그래밍 언어의 분류 다음에 배운 것은 IDE(Integrated Development Environment)이다.
IDE라는 것은 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어이다. 예를 들면 비주얼 스튜디오, Dev c++, 코드블럭, 넷빈즈 등등이 있다.
옛날에는 소스파일을 빌드할 때 전처리기 따로, 컴파일러 따로, 링커를 따로 실행해서 했다고 한다. 역시 세상의 발전은 놀랍다고 느꼈다.
C표준에서 함수의 값을 반환하도록 되어있다고 한다. 그래서 원래는 void를 main함수의 자료형으로 사용했었는데 이제부터 int를 사용하는 것으로 습관을 만들어야 겠다.
IDE는 정말 좋은 프로그램이다. 전처리기, 컴파일러, 링커를 모두 합쳐놓은 프로그램이기 때문이다. 그리고 컴파일러가 정말 친절한 프로그램이라는 것을 느꼈다.
2019년 3월 12일 화요일
C언어 수업 두 번째(3월 12일 화요일 7교시)
이번 두 번째 시간에는 printf를 이용한 예제를 풀어보았다.
개행(\n)을 해서 입력하는 방법이나 공간을 두고 문자를 입력하는 방법(%숫자d) 등을 이용했다.
이 과정에서 서식 문자(%s, %d, %f 등등)의 의미를 찾아보면서 머리 속에 새겨두었다.
또한 자주 헷갈렸던 큰따옴표와 작은따옴표의 의미도 완벽히 깨달았다.
큰따옴표 : 문자열
작은따옴표 : 문자
그리고 컴퓨터 구조에 대해서도 공부했다.
비트는 컴퓨터의 정보를 처리하는 가장 작은 단위이고 1비트당 0과 1 두개의 정보를 가진다. 그리고 바이트는 1바이트당 8비트다. 그래서 처리할 수 있는 정보의 수는 2의 8제곱이다.
윈도우 32비트는 쓸 수 있는 메모리 주소의 사이즈가 4기가 바이트다. 그래서 만약에 32비트 윈도우로 16기가 바이트짜리 램을 사용하면 나머지 12기가 바이트는 사용하지 못한다.
이번 시간에는 printf에 대한 예제와 함께 간단한 컴퓨터 구조에 대해서 배워보았다. 마지막에 적었던 16기가 바이트 램 얘기는 처음 들어본 얘기라서 매우 신기했다.
개행(\n)을 해서 입력하는 방법이나 공간을 두고 문자를 입력하는 방법(%숫자d) 등을 이용했다.
이 과정에서 서식 문자(%s, %d, %f 등등)의 의미를 찾아보면서 머리 속에 새겨두었다.
또한 자주 헷갈렸던 큰따옴표와 작은따옴표의 의미도 완벽히 깨달았다.
큰따옴표 : 문자열
작은따옴표 : 문자
그리고 컴퓨터 구조에 대해서도 공부했다.
비트는 컴퓨터의 정보를 처리하는 가장 작은 단위이고 1비트당 0과 1 두개의 정보를 가진다. 그리고 바이트는 1바이트당 8비트다. 그래서 처리할 수 있는 정보의 수는 2의 8제곱이다.
윈도우 32비트는 쓸 수 있는 메모리 주소의 사이즈가 4기가 바이트다. 그래서 만약에 32비트 윈도우로 16기가 바이트짜리 램을 사용하면 나머지 12기가 바이트는 사용하지 못한다.
이번 시간에는 printf에 대한 예제와 함께 간단한 컴퓨터 구조에 대해서 배워보았다. 마지막에 적었던 16기가 바이트 램 얘기는 처음 들어본 얘기라서 매우 신기했다.
2019년 3월 11일 월요일
C언어 수업 첫 번째(3월 12일 화요일 6교시)
이번 시간에는 C언어의 기본을 배웠다.
프로그래밍을 하는 데 필요한 프로그램인 코드블럭을 설치 했다.
코드블럭을 켜고 처음 했던 것은 가장 기본인 Hello World 예제였다.
그리고 내가 입력한 코드가 프로그램으로 실행되는 과정을 배웠다.
-과정
1. 내가 작성한 코드의 소스 파일을 전처리한다.
2. 전처리한 소스 파일을 컴파일해서 개체 파일로 만든다.
3. 컴파일한 개체 파일을 링크해서 프로그램(exe파일)로 만든다.
이 모든 과정을 통틀어서 빌드라고 한다.
그리고 이 과정을 배우는 과정에서 전처리기와 헤더 파일의 의미를 알게 됐다.
프로그래밍의 기본기를 다질 수 있는 유익한 시간이었다.
프로그래밍을 하는 데 필요한 프로그램인 코드블럭을 설치 했다.
코드블럭을 켜고 처음 했던 것은 가장 기본인 Hello World 예제였다.
그리고 내가 입력한 코드가 프로그램으로 실행되는 과정을 배웠다.
-과정
1. 내가 작성한 코드의 소스 파일을 전처리한다.
2. 전처리한 소스 파일을 컴파일해서 개체 파일로 만든다.
3. 컴파일한 개체 파일을 링크해서 프로그램(exe파일)로 만든다.
이 모든 과정을 통틀어서 빌드라고 한다.
그리고 이 과정을 배우는 과정에서 전처리기와 헤더 파일의 의미를 알게 됐다.
프로그래밍의 기본기를 다질 수 있는 유익한 시간이었다.
피드 구독하기:
덧글 (Atom)

