TIL_21.01.26 πŸƒπŸ½β€β™‚οΈπŸƒπŸ½β€β™‚οΈ

Doum KimΒ·2021λ…„ 1μ›” 26일
0

TIL

λͺ©λ‘ 보기
68/71
post-thumbnail

CS50

Cμ—λŠ” μ—¬λŸ¬ μžλ£Œν˜•μ΄ 있고 각각의 μžλ£Œν˜•μ€ μ„œλ‘œ λ‹€λ₯Έ 크기의 λ©”λͺ¨λ¦¬λ₯Ό μ°¨μ§€ν•œλ‹€. char νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λ©΄ λ©”λͺ¨λ¦¬μ˜ ν•œ μ‚¬κ°ν˜• μ•ˆμ— κ·Έ λ³€μˆ˜μ˜ 값이 μ €μž₯λœλ‹€.

Array

#include <stdio.h>
#include <cs50.h>

int main(void)
{
    int score1 = 72;
    int score2 = 73;
    int score3 = 33;

    printf("Average: %i\n", (score1 + score2 + score3)/3);
}

μ„Έ 개의 점수λ₯Ό μ €μž₯ν•˜κ³  평균을 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.
ν•˜μ§€λ§Œ 이 μ½”λ“œκ°€ μ΅œμ„ μ˜ λ””μžμΈμ΄ μ•„λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” μ μˆ˜κ°€ 3κ°€μ§€λ‘œ 고정적이고 μ†Œμˆ˜μ μ— λŒ€ν•œ λŒ€μ‘λ„ μ—†λ‹€. 반볡적인 μž‘μ—…μ΄ λˆˆμ— 보인닀.

λ”°λΌμ„œ κ°œμ„ μ˜ 여지가 μžˆλŠ” ν”„λ‘œκ·Έλž¨μΈ 것이닀.

일단 점수의 κ°œμˆ˜κ°€ 더 λ§Žμ•„μ§ˆλ•Œ μ‚¬μš©ν•  수 μžˆλŠ” 것이 배열이닀.

배열은 λ™μΌν•œ μžλ£Œν˜•μ˜ 데이터λ₯Ό λ©”λͺ¨λ¦¬μƒμ— μ—°μ΄μ–΄μ„œ μ €μž₯ν•˜κ³  이λ₯Ό ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

#include <stdio.h>
#include <cs50.h>

int main(void)
{
    int scores[3];  // 크킀가 3인 배열을 λ§Œλ“€κ³  
    scores[0] = 72; // ν•΄λ‹Ή index에 값을 ν• λ‹Ή
    scores[1] = 73;
    scores[2] = 33;

    printf("Average: %i\n", (scores[0] + scores[1] + scores[2])/3);
}

ν•˜μ§€λ§Œ 이 μ½”λ“œμ—μ„œλ„ 점수의 κ°œμˆ˜κ°€ κ³ μ •λœλ‹€λŠ” 문제점이 μ—¬μ „νžˆ μ‘΄μž¬ν•œλ‹€.
또 μ μˆ˜κ°€ μž…λ ₯을 λ°›λŠ”κ²Œ μ•„λ‹Œ μ½”λ“œ 내뢀에 이미 지정이 λ˜μ–΄μžˆλ‹€. 그리고 κ°œμ„  κ°€λŠ₯ν•œ λ°˜λ³΅λ“€λ„ μ—¬μ „νžˆ μ‘΄μž¬ν•œλ‹€.

#include <stdio.h>
#include <cs50.h>

float average (int length, int array[]);

int main(void)
{
    int n = get_int("Number of scores: ");
    int scores[n];

    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score %i: ", i + 1);
    }
    printf("Average: %.1f\n", average(n, scores));
}

float average (int length, int array[])
{
    int sum =0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return (float) sum / (float) length;
}

점수의 개수λ₯Ό μž…λ ₯ λ°›κ³  κ·Έ 값을 μ΄μš©ν•΄ n개의 μ‚¬μ΄μ¦ˆλ₯Ό 가진 배열을 λ§Œλ“€κ³ 
n번 점수 μž…λ ₯을 λ°›λŠ”λ‹€. 또 average ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ λ°°μ—΄μ˜ 길이와 배열을 μΈμžκ°’μœΌλ‘œ 전달해 평균 값을 ꡬ해쀀걸 좜λ ₯ν•œλ‹€.

λ¬Έμžμ—΄κ³Ό λ°°μ—΄

string은 char μžλ£Œν˜•μ˜ λ°μ΄ν„°λ“€μ˜ 배열이닀.
string = "HI!"; λŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 μ €μž₯λœλ‹€.

λ¬Έμžμ—΄μ€ λ”°λ‘œ 길이λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 컴퓨터가 λ¬Έμžμ—΄μ΄ μ’…λ£Œλ˜λŠ” 지점을 μ•ŒκΈ°μœ„ν•΄μ„œ λ¬Έμžμ—΄μ˜ 끝은 항상 null 쒅단 문자 \0이 λ“€μ–΄κ°„λ‹€.

string names[4];

names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRIAN";
names[3] = "DAVID";

printf("%s\n", names[0]);
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);

μ΄λŸ¬ν•œ μ½”λ“œκ°€ μžˆλ‹€λ©΄ μ‹€μ œ λ©”λͺ¨λ¦¬ μƒμ—λŠ” μ•„λž˜μ™€ 같이 μ €μž₯λœλ‹€.

λ¬Έμžμ—΄μ˜ ν™œμš©

λ¬Έμžμ—΄ 길이 탐색

λ¬Έμžμ—΄ 길이 νƒμƒ‰ν•˜λŠ” 방법은 첫번째둜 λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•΄ λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©° \0κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ κ²€μ‚¬ν•˜λŠ” 것이닀. ν•˜μ§€λ§Œ strlenν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ μ‰½κ²Œ 얻을 수 μžˆλ‹€.

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  string s = get_string("input: ");
  printf("Output:\n");
  for (int i =0, n = strlen(s); i < n; i++)
  {
    printf("%c\n",s[i]);
  }
}

λ¬Έμžμ—΄ 탐색 및 μˆ˜μ •

μž…λ ₯받은 λ¬Έμžμ—΄μ„ λŒ€λ¬Έμžλ‘œ λ°”κΏ”μ£ΌλŠ” 방법은 크게 2가지가 μžˆλ‹€.
μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄ λ³€κ²½ν•΄μ£ΌλŠ” 방법이 μžˆλ‹€.

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  string s = get_string("Before: ");
  printf("After:  ");
  for (int i = 0, n = strlen(s); i < n; i++)
  {
    if (s[i] >= 'a' && s[i] <= 'z')
    {
      printf("%c", s[i] - 32);
    }
    else
    {
      printf("%c", s[i]);
    }
  }
  printf("\n");
}

또 ctype λΌμ΄λΈŒλŸ¬λ¦¬μ— μžˆλŠ” toupper ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string s = get_string("Before: ");
    printf("After:  ");
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c", toupper(s[i]));
    }
    printf("\n");
}

CS50 Manual Pages λ₯Ό μ°Έμ‘°ν•΄μ„œ λ‹€μ–‘ν•œ 라이브러리의 ν•¨μˆ˜λ₯Ό 확인할 수 μžˆλ‹€.

λͺ…λ Ήν–‰ 인자

컴파일 ν›„ μ €μž₯ν•˜κ³ μž ν•˜λŠ” 파일λͺ…κ³Ό 같이 좔가적인 정보λ₯Ό ν•¨κ»˜ 쀄 수 μžˆλ‹€.
μ΄λŸ¬ν•œ 정보λ₯Ό λͺ…λ Ήν–‰ 인자라고 ν•œλ‹€.

#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("hello, %s\n", argv[1]);
    }
    else
    {
        printf("hello, world\n");
    }
}

첫번째 λ§€κ°œλ³€μˆ˜ argcλŠ” main ν•¨μˆ˜κ°€ λ°›κ²Œ 될 μž…λ ₯의 κ°œμˆ˜μ΄λ‹€. 그리고 argv[]λŠ” κ·Έ μž…λ ₯이 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 배열이닀. argv[0] 은 기본적으둜 ν”„λ‘œκ·Έλž¨ μ΄λ¦„μœΌλ‘œ μ €μž₯λœλ‹€.

예λ₯Ό λ“€μ–΄ μœ„ ν”„λ‘œκ·Έλž¨μ„ arg.c 둜 μ €μž₯ν•˜κ³  컴파일 ν•œ 후에 ./argc Kim 으둜 μ‹€ν–‰ν•˜λ©΄ hello, Kim의 값이 좜λ ₯이 λœλ‹€.
argc == 2, argv[1] == Kim

0개의 λŒ“κΈ€