- make ๋์ ์ธ ์ ์๋ ๊ฒ -
clang : ์ปดํ์ผ๋ฌ
ํด๋ญ์ ์กฐ๊ธ ๋ ๋ง์ ๊ฒ์ ์๊ตฌํ๋ค.
clang์ ์ฌ์ฉํด๋ณด์.
clang hello.c
์ํฐ๋ฅผ ์น๋ฉด ์๊ฑฐ๋ ์์ผ์ด๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉด ์ปดํ์ผ ์ ๋๊ฒ.
ls ํ๋ฉด ์ด์ํ a.out์ ๋ณด๊ฒ๋ ๊ฒ
์ด์ํ๋ฐ?
a.out ์ง์ด๋ค.
clang -o hello hello.c
์ปค๋งจ๋๋ผ์ธ ์๊ท๋จผํธ
==> ๊ฒฐ๋ก : ์ปดํ์ผํ๋ฉด clang ์ด์ฉ๊ตฌ ํ๋ฉด์ ๋ค clang์ ์ฌ์ฉํด์ ์ปดํ์ผํด์ค๋ค.
๋๋ clang ์ฌ์ฉํด์ ์ค์ค๋ก ์ปดํ์ผํ ์๋ ์์ด.
์ปดํ์ผ์ ๋จ๊ณ: (Lower-level detail)
1) ํ๋ก์ธ์ฑ(Source code)
- ํ๋ฆฌํ๋ก์ธ์ฑ ์คํ : ์ ํ๋๊ฑฐ์ง? #์ด ๋ค์ด๊ฐ ๋ฌธ์ฅ ์ ์จ์ผํ๋? ==> defining function / ์ปดํ์ผ๋ฌ ํธ๋ ์ด๋ ์ํค๋ ๊ฒ
header file : hint๋ฅผ ์ฃผ๋ ๊ฒ์ด์ผ.
2) ์ปดํ์ผ๋ง(Assembly code)
- ์ธ์์๋ ๋ค์ํ cpu๊ฐ ์๋๋ฐ, ์ด์ ๋ธ๋ฆฌ ์ฝ๋, ์ค๊ฐ์ main, get_string, printf --> ์์์.
์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ๋ฐ๊ฟ
์ฌ๋๋ค์ด ์๋ ์๋ ์ด์ ๋ธ๋ฆฌ ์ผ๋๋ฐ ์ด์ ๋ C, ํ์ด์ฌ ๋ฑ์ ์ด๋ค.
3) ์ด์๋ธ๋ง(Machine code)
์ด์ ๋ธ๋ง ์ฝ๋๋ฅผ ๋จธ์ ์ฝ๋(0,1)๋ก ๋ฐ๊ฟ
4) Linking
๋ชจ๋ 0101010๋ค(๋์ #, ์ซ์, ๋ฌธ์ ๋ฑ๋ฑ)์ ํ๋์ ๋ธ๋ญ์ผ๋ก ๋ชจ์์ --> ๋์ ์ฝ๋ ๋ธ๋ญ๋ค๋ก ์ฌ์ฉํ๋๊ฑฐ์ผ
์ฐ๋ฆฌ๊ฐ ์ฒ์ ์์คํ ์ ๋ค์ด๋ฐ์๋ ์ปดํ์ผ๋ฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ด .h ํ์ผ์ ํํ๋ก ์ ์ฅ์ด ๋๋ค.
์๋ฌ ๊ด์ฐฎ์
20% ์ ๋๋ ๋๋ ์๋ฌ ์๊ฒจ
์ฌ๋๋ค์ ์ค์ ํ์์.
์ด๋ป๊ฒ ๋๋ฒ๊ทธํ ์ ์์๊น?
์ด๋ค ํ๋ฒ๋ ์ปดํจํฐ ๊ด๋ จ ์ฌ๋์ด ์ปดํจํฐ๊ฐ ๋ฌธ์ ์์๋๋ฐ, ์ง์ง ๋ฒ๋ ๊ฐ ์์ด์ ๋ฒ๊ทธ ๋ผ๊ณ ํจ.
๋ฒ๋ ๋ ธํธ์ ๋ถ์ฌ๋
style50: ์ฌ๋์ด ์ฝ๊ธฐ ์ข๊ฒ ์์ ๋ฐ๊ฟ์ค
๋ค๋ฅธ ํด๋ ์ข์๋ฐ
ํ๋๋ ์ธ๊ณ์ ์ธ ๋๋ฒ๊น ํค๊ฐ ์์ด : printf
๋ # 10๊ฐ ํ๋ฆฐํธํ๊ณ ์ถ์๋ฐ ์ ํ๊ณ ์๋ ๋ณด๊ณ ์ถ์๋, ์๋์ฒ๋ผ ์ฝ๋ ์น ์ ์์
์ข ๋ ํ์ํํ ๋๋ฒ๊น ํด์ ์ฐพ์๋ณด๋๋ก ํ์. debug50
์ด๊ฑด ์คํ ๋ฐ์ด ์คํ ์ผ๋ก ๋์ ์ฝ๋๋ฅผ ์คํ์ํฌ๊ฑฐ์ผ.
์ฒ์ฒํ. ๊ทธ๋์ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ๋ณผ ์ ์์ง.
debug50์ ์คํ์ํค๋ฉด break point ์๊ธฐ๊ณ , ํ๋ํ๋ ์ฌ์ฉํ ์ ์์.
* ํฐ๋ฏธ๋์์ ๋ฐฉํฅํค ์ฌ์ฉํ๋ฉด ๋๊ฐ ์ฌ์ฉํ ๋ช ๋ น์ด๋ค ๋ณผ ์ ์์ด.
get_negative_int():
debug50 ./buggy1
step into๋ฅผ ๋๋ฌ๋ณด์.
function ์์ผ๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ค์์ step over์ ๋๋ฅด๋ฉด,
๋๋ฒ๊ฑฐ๋ ์ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ๋ค.
๊ณผ์
Lab2: scrabble.c
๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ:
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Points assigned to each letter of the alphabet
int POINTS[] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
int compute_score(string word)
{
//keep track of score
int score = 0;
// Compute score for each charcter
for (int i = 0, len = strlen(word); i < len; i++)
{
if (isupper(word[i]))
{
score += POINTS[word[i] - 'A'];
}
else if (islower(word[i]))
{
score += POINTS[word[i] - 'a'];
}
}
return score;
}
;
int main(void)
{
// Get input words from both players
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Score both words
int score1 = compute_score(word1);
int score2 = compute_score(word2);
// TODO: Print the winner
if (score1 > score2)
{
printf("Player 1 wins!");
}
else if (score1 < score2)
{
printf("Player 2 wins!");
}
else
{
printf("Tie!");
}
}
Readability.c
์ ์ด ๊ณผ์ ์ข ์ฌ๋ฐ๋ค...! ๊ณผ์ ๋๋ฌด ์น์ ํ๊ณ ์ต๊ณ ๋ค ์ง์ง
์์ด ์ง๋ฌธ๋ค์ด ๊ณผ์ฐ ๋ช ํ๋ ์ด ์ฝ๊ธฐ์ ์ ํฉํ์ง ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์!
์์ผ๋ก ์์ด ๋ฌธ์ฅ ์ฝ๊ธฐ ์ ์ ํ๋ก๊ทธ๋จ ๋ง๋ค์ด๋๊ณ ์ด๊ฑฐ ๋๋ ค๋ณด๊ณ ์ฝ์ด์ผ๊ฒ ๋ค.
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main(void)
{
string text = get_string("Text: ");
//string length
int i = strlen(text);
int letters = 0;
int words = 0;
int sentences = 0;
//Loop
for (int a = 0; a < i ; a++)
{
char c = text[a];
//count letters
if (isalpha(c) != 0)
{
letters++;
}
//count words
if (c == ' ')
{
words++;
}
//count sentencs
if (c == '.' || c == '!' || c == '?')
{
sentences++;
}
}
// ๋์ด์ฐ๊ธฐ์๋ ๋จ์ด ๊ฐ์ ์
๋ +1 ํด์ฃผ์ด์ผ ํจ์ผ๋ก
words = words + 1;
float L = ((float)letters / (float)words) * 100;
float S = ((float)sentences / (float)words) * 100;
float subindex = 0.0588 * L - 0.296 * S - 15.8;
int index = round(subindex);
// PRINT THE RESULT
if (index < 1)
{
printf("Before Grade 1\n");
}
else if (index >= 16)
{
printf("Grade 16+\n");
}
else
{
printf("Grade %i\n", index);
}
}
Caesar.c
์นด์ด์ฌ๋ฅด์ ์ํธ ํด๋ ํ๋ก๊ทธ๋จ
์๋ก์ด ์๋จ์ด๋ ๋ฐฐ์ ๋ค.
cipher : ์ํธ์
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
// if arc doesn't has 2 argument prints error
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
else
{
// if there are 2 arguments checks if all the second argument contains digits
string k = argv[1];
for (int i = 0; i < strlen(k); i++)
{
if (isdigit(k[i]) == 0)
{
printf("Usage: ./caesar key\n");
return 1;
}
}
// print commands below for testing purpose
// printf("Success\n");
// printf("%s\n",k);
// converts second argument to int
int myKey = atoi(k);
// asks users for plaintext to be ciphered
string plaintext = get_string("Plaintext: ");
// For loop to convert to ciphertext
for (int i = 0; i < strlen(plaintext); i++)
{
if (isupper(plaintext[i]))
{
// by given formula need to change base so that A is 0
// when you minus capital A ASCII value by 65 it becomes 0
plaintext[i] = (plaintext[i] - 65);
plaintext[i] = (plaintext[i] + myKey) % 26;
plaintext[i] = (plaintext[i] + 65);
// printf("%c",plaintext[i]);
}
if (islower(plaintext[i]))
{
plaintext[i] = (plaintext[i] - 97);
plaintext[i] = (plaintext[i] + myKey) % 26;
plaintext[i] = (plaintext[i] + 97);
// printf("%c",plaintext[i]);
}
if (isalpha(plaintext[i]) == 0)
{
plaintext[i] = plaintext[i];
// printf("%c",plaintext[i]);
}
}
printf("Ciphertext: %s", plaintext);
printf("\n");
}
}
'Coding > [EdX] CS 50' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Week 4] Memory (0) | 2021.12.06 |
---|---|
[Week 3] Algorithms (0) | 2021.12.05 |
[Week1] C (0) | 2021.11.29 |
[Week 0] Scratch (0) | 2021.11.23 |
Introduction to Mathematical Thinking ๋ก ๋ณธ๊ฒฉ ์์ (0) | 2021.10.08 |