프로그래머스 데브코스 웹 풀사이클 11주차 3일차

geun·2024년 1월 23일
0

데브코스

목록 보기
36/79
post-thumbnail

C언어 기초 배우기

반복문

break문과 continue문

반복문 while문 내부에서 특정 조건이 되면 break를 만나게 되는데, break문은 while문을 빠져나가게 해준다.
continue는 해당 분기의 반복만을 넘어가고 다시 반복문으로 돌아가게 한다.

연습문제

  1. 구구단을 출력하되, 짝수단만 출력하는 프로그램을 작성하라. 단, continue문을 사용하여 작성할 것.
#include <stdio.h>

int main()
{
    for(int i=1;i<=9;i++){
        if(i%2==1){
            continue;
        }
        for(int j=1;j<=9;j++){
            printf("%d * %d = %d\n",i,j,i*j);
        }
    }

    return 0;
}

함수

대부분의 프로그래밍 언어는 함수의 집합체로, 함수들이 서로 연동하여 유기적으로 동작한다.

함수의 목적

  • 코드의 가독성 향상
  • 코드의 유지 보수 및 확장 용이성 증가

함수의 종류

  • 표준 함수 : 언어에서 기본적으로 제공하는 함수로, 함수를 라이브러리화 시켜 편리하게 사용 가능하다.
  • 사용자 정의 함수 : 사용자가 원하는 기능을 직접 만든 함수로, 표준 함수에는 한계가 있기 때문에 직접 만들어서 사용한다.

함수의 기본 형태

  • 데이터 타입 : 함수가 리턴하는 값의 타입
  • 함수 이름 : 함수의 기능과 밀접한 이름으로 만드는 것이 좋다.
  • 인수 목록 : 함수에 필요한 값을 전달할 때 사용한다.
  • 함수의 내용 : 중괄호 사이의 영역 안에서 작성하는 함수의 기능이다.

함수의 타입

  • void 타입 : 결과 값을 리턴하지 않는 함수

연습문제

  1. 사각형의 넓이를 구하는 함수를 작성해보자.
 void square(int width, int heigth){
    printf("사각형의 넓이 : %d",width * heigth);
}
  1. 사용자로부터 두 수를 입력받아, 두 수를 비교하여 최대값과 최소값을 구하는 함수를 정의하고, main함수에서 이 함수들을 호출하여 결과값을 출력하도록 하라.
#include <stdio.h>
void minMax(int num1, int num2){
    int min;
    int max;
    
    if(num1 > num2){
        min = num2;
        max = num1;
    } else{
        min = num1;
        max = num2;
    }
    printf("최대값 : %d 최소값 : %d",max,min);
}
int main()
{
    minMax(5,4);

    return 0;
}

출력
최대값 : 5 최소값 : 4

  1. 커피 자판기가 있다. 100원을 넣으면 '블랙커피', 200원을 넣으면 '밀크커피'가 나온다. 자판기가 함수와 같은 블랙박스라고 했었다. 자판기를 함수로 구현해보자 즉, 사용자로부터 정수형 가격(100,200)을 입력받아 100을 입력 받으면 '블랙커피'를 출력하고, 200을 입력받으면 '밀크커피'를 출력하면 된다.
void coffeeMachine(int price){
    if(price == 100) {
        printf("블랙커피");
    }
    else if(price == 200) {
        printf("밀크커피");
    }
}

변수의 범위

지역변수

지역 변수란, 그 지역에서만 사용하는 변수를 의미한다. 같은 이름의 변수더라도, 다른 영역에 속해있으면 독립된 다른 변수이다. 또한, 지역변수는 스택 메모리에 저장된다.
함수 a와 함수 b에 똑같은 num이란 변수가 있다고 할때, 이 변수는 서로 다른 변수이다.

전역변수

함수 바깥쪽에 선언된 함수로, 모든 지역에서 사용 가능한 변수이다.
전역변수는 프로그램이 시작하자마자 메모리 상에 올라가서 프로그램이 종료될 때 소멸된다.
또한, 전역 변수는 데이터 영역에 저장된다.

static 변수

static 변수는, 지역 변수처럼 중괄호 영역에서 선언되지만, 중괄호를 벗어나도 메모리 상에 고정되어 소멸하지 않는다.
static 변수는 함수내에서 선언될 때 생성되어, 프로그램이 종료될 때, 소멸한다

연습문제

  1. 책읽기 마라톤 기능을 가진 프로그램을 구현해보자. 책읽기 마라톤이란 내가 읽은 책들의 페이지 수를 누적 계산하는 기능이다. 그날 그날 읽은 책들의 페이지 수를 사용자로부터 입력 받으면 최종 누적된 페이지 수에 새로 입력된 페이지 수가 추가로 더해지고, 다시 갱신된 최종 페이지 수가 출력되는 것이다. 한번의 출력이 끝나면 다시 읽은 책의 페이지 수를 사용자로부터 입력 받고, 누적된 최종 페이지 수를 출력한다. 이 과정을 사용자가 -1을 입력할 때까지 계속 반복한다. 이 기능을 함수로 구현하되, 페이지의 누적 결과를 저장하는 변수를 전역 변수로도 구현해보고, static 변수로도 구현해보도록 한다.

전역 변수

#include <stdio.h>

int total = 0;

void bookMarathon(int page){
    total += page;
    printf("최종 누적 페이지 : %d\n",total);
}
int main()
{
    int page;
    while(1){
        printf("읽은 책의 페이지 수를 입력하시오 : ");
        scanf("%d",&page);
        if(page == -1){
            printf("더 분발하세요\n");
            break;
        }
        bookMarathon(page);
    }
}

static 변수

#include <stdio.h>

void bookMarathon(int page){
    static int total = 0;
    total += page;
    printf("최종 누적 페이지 : %d\n",total);
}
int main()
{
    int page;
    while(1){
        printf("읽은 책의 페이지 수를 입력하시오 : ");
        scanf("%d",&page);
        if(page == -1){
            printf("더 분발하세요\n");
            break;
        }
        bookMarathon(page);
    }
}

배열

배열이란, 같은 속성을 가진 것들을 나열해 놓은 것으로, 요소가 순서대로 여러 개 모여 있다. 반드시 같은 속성을 가져야 한다.
배열을 이용하면 지나치게 많은 변수들을 하나하나 선언할 필요가 없어진다.

배열의 선언

  • 배열의 타입 : 배열 요소들의 타입을 지정한다.
  • 배열 이름 : 각 배열 요소에 접근하기 위한 이름이다.
  • 배열 길이 : 배열에 들어갈 변수의 개수를 나타낸다.

배열의 복사

배열은 배열 자체는 상수이기 때문에, 대입 연산자를 통해 값을 넘겨받을 수 없고, 각각 개별의 요소끼리 복사를해야한다.

연습문제

  1. arr1의 값을 arr2에 복사하되, 배열 요소를 역순으로 저장하도록 하고, 복사된 arr2의 요소값들을 출력하도록 하라.
#include <stdio.h>

int main()
{
    int arr1[5] = {1,2,3,4,5};
    int arr2[5];
    
    for(int i=0;i<5;i++){
        arr2[4-i]=arr1[i];
    }
    for(int i=0;i<5;i++){
        printf("%d\n", arr2[i]);
    }
}

문자열 변수

문자열 또한, 배열인데, 문자열의 개수보다 1더 큰 공간을 가진다 그 이유는 마지막에 null이 들어가는 공간이 필요하기 때문이다.

※ null 문자가 들어가는 이유?
문자열의 크기가 100이고, 문자수가 9개면 91개의 공간이 비어있게 된다. 이 91개의 쓰래기 값들을 효율적으로 관리하기 위해 문자의 마지막에 null을 추가하여, 공간을 효율적으로 사용하게 해준다.

포인터

포인터란? 포인터 변수의 약자로, 메모리의 주소값을 저장하는 변수다. 보통 주소값을 저장한다는 표현을 반대로 해당 메모리를 가리킨다고도 한다.

포인터 사용방법

포인터 변수 선언 시 일반 변수명 앞에 * 기호를 붙여, 주소값만 저장할 수 있다.
& 기호를 통해 변수의 주소값을 얻어 낼 수 있다.

포인터와 배열

배열의 이름은, 배열의 첫번째 요소의 주소값을 가진다. 즉 arr이란 배열이 있을 때, arr은 배열을 가리키는 포인터이며, arr과 arr[0]의 값은 일치한다.

※ 배열의 이름은 주소값을 가지는 포인터이지만, 상수이므로 주소값을 변경할 수 없다.

함수와 포인터

기본적인 함수의 인자 전달 형태는 복사이며 두가지로 나뉜다.

  • 값에 의한 복사(call by value) : 함수의 매개변수에 변수를 그대로 넣는 방식
  • 참조에 의한 복사(call by reference) : 매개변수가 지나치게 많으면, 배열의 포인터 변수를 이용해 참조를 통해 넣는다.

0개의 댓글