[C 프로그래밍] 1. 기초 개념

166973 단어 CC

C언어 영상 보고 내용 정리: https://www.youtube.com/watch/2NWeucMKrLI

printf 입력

  • 쌍따옴표 안에 넣어줘야 하고 마지막에 ; 넣어줘야 함
int main()
{
    printf("");
    return 0;
}

새로운 줄 출력 \n & 탭 \t & alert \a

int main()
{
    printf("I miss 우\n");
    printf("우 miss 윤 too\n");
    return 0;
}

Comments 주석

/* 안녕 나는 c언어는 처음이야 */

Conversion Characters 변환 문자

(1) string (\s)


int main()
{
    printf("%s is the best food\n","망고");

    return 0;
}

(2) numbers (\d) - decimal

int main()
{
    printf("%d is the best number\n",614);

    return 0;
}

(3) float (\f)

int main()
{
    printf("%f is the best number\n",614.000);

    return 0;
}

  • float에서 소수점 자리도 지정해줄 수 있음
    printf("%.2f is the best number\n",614.000);

Variables 변수

  • 변수명 처음은 알파벳으로만 & 공백 없이
int main()
{
    int age; /* age라는 변수가 있는데 정수로 받아줄 것임*/
    age=22;
    printf("I am %d years old", age);

    return 0;
}
int main()
{
    int age; /* age라는 변수가 있는데 정수로 받아줄 것임*/
    age=2020-2000;
    printf("I am %d years old", age);

    return 0;
}

String Terminator

  • array사용할거면 어떤 데이터타입 사용할건지 지정
  • char~
int main()
{ /* array사용할거면 어떤 데이터타입 사용할건지 지정*/
    char name[14]="Bucky Roberts";
    printf("my name is %s", name);
    return 0;
}

Arrays

  • array, list에서 특정부분만 바꾸기 가능

int main()
{ /* array사용할거면 어떤 데이터타입 사용할건지 지정*/
    char name[14]="Bucky Roberts";
    printf("my name is %s \n", name);

    name[2]="zzz";
    printf("my name is %s", name);

    return 0;
}
  • 굳이 리스트 안에 숫자 안 넣어줘도 알아서 세준다
char food[]="tuna";
    printf("my favorite food is %s \n", food);
  • strpy(변경할 리스트, 변경할 값[새로 저장할 값])
char food[]="tuna";
    printf("my favorite food is %s \n", food);

    strcpy(food,"bacon");
    printf("my favorite food is %s \n", food);

    return 0;

Creating Header File

  • 다른 헤더(~.h라고 저장해야 함) 파일에서 정의한 것을 불러다가 (상단에 #include "~.h") 쓸 수 있다


#include <stdio.h>
#include <stdlib.h>
#define MYNAME "Tuna Butter" /*MYNAME이란 변수를 찾으면서 찾으면 튜나버터로 바꿔주기*/

int main()
{
    printf("name : %s",MYNAME);
    return 0;
}

Getting input with scanf

  • scanf("받을 것의 속성(%d,%s..)", 저장받을 array)
  • 그런데 이 scanf는 입력받을 때 띄어쓰기(스페이스) 만나면 입력의 끝이라고 인식함
    따라서 woo woo 라고 쓰면 안되고 woowoo 라고 입력해야 함

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

int main()
{
    char firstname[20];
    char crush[20];
    int numberofBabies;

    printf("What is your name? \n");
    scanf("%s",firstname);

    printf("Who are you going to marry? \n");
    scanf("%s",crush);

    printf("How many kids do you want to have? \n");
    scanf("%d",&numberofBabies);

        printf("%s and %s will marry and have %d babies", firstname, crush, numberofBabies);

    return 0;
}

- before every single variables에 연산자 &을 꼭 써줘야 한다, except for arrays

Math Operators

    • plus
int main()
{
    int weight = 595;
    printf("if i eat mango, I will weigh %d \n", weight+12);

    return 0;
}
  • % remainder
int main()
{
    int weight = 595;
    printf("if i eat mango, I will weigh %d \n", weight %  12);

    return 0;
}
  • 정수로 출력하기, 실수로 출력하기

int main()
{
    int a=80;
    int b =90;
    printf("%d \n", a/b);

    int c=80.0;
    int d =90.0;
    printf("%f \n", c/d);

    return 0;
}

Order Operations

  • () 괄호 먼저 계산

Calculating the Average Age

int main()
{
    int a;
    int b;
    int c;
    a = b = c = 100;
    printf("%d %d %d", a, b, c);
    
    return 0;
}

 
int main()
{
    float age1, age2, age3, average;
    age1=age2=4.0;

    printf("enter your age\n");
    scanf("%f", &age3);

    average=(age1+age1+age3) / 3;
    printf("\n average %f", average);

    return 0;
}


Calculate Interest

int main()
{
    int pageview =0;
    pageview=pageview+1;
    printf("page views : %d \n", pageview);
    pageview=pageview+1;
    printf("page views : %d \n", pageview);

    float balance = 1000.00;
    balance*=1.1;
    printf("balance : %f \n", balance);
    balance*=1.1;
    printf("balance : %f \n", balance);
    balance*=1.1;
    printf("balance : %f \n", balance);
    return 0;
}

Typecasting

  • 계산 할 때 int와 float을 더하면 정확하지 않은 결과 나올 때도 있음
  • 따라서 type을 변경해줘야 한다, 동일하게
int main()
{
float avgProfit;
    int priceofpumpkin = 10;
    int sales = 50;
    int dayworked = 7;

    avgProfit=((float)priceofpumpkin * (float)sales) / (float)dayworked;
    printf("profit: %f", avgProfit);

    return 0;
}

if

(1) 형식

  • if(조건) {
    조건이 참이면 돌려질 코드
    }

int main()
{
    if(4<10) {
        print("yes");
    }

    return 0;
}

(2) 적용


int main()
{
    int age;

    printf("How old are you?\n");
    scanf("%d", &age);

    if(age>=18) {
        printf("You may enter this website");
    }
    if (age<19) {
        printf("Nothing to see here!");
    }
    return 0;

Nesting if statements

: if 안에 if문을 놔주기


int main()
{
    char gender;
    int age;

    printf("How old are you?\n");
    scanf("%d", &age);

    printf("What is your gender? (m/f) \n");
    scanf("%s", &gender);

    if(age>=18) {
        printf("You may enter this website ");

        if (gender=='m'){
            printf("dude");
        }
        if (gender=='f') {
            printf("lady");
        }

    }

    if (age<18) {
        printf("Nothing to see here!");
    }
    return 0;

if ~ else

int main()
{

    char gender;
    int age;

    printf("How old are you?\n");
    scanf("%d", &age);

    printf("What is your gender? (m/f) \n");
    scanf("%s", &gender);

    if(age>=18) {
        printf("You may enter this website ");

        if (gender=='m'){
            printf("dude");
        }
        else {
            printf("my lady");
        }

    }

    else{
        printf("Noting to see here!");
    }
    return 0;
}

More than two choices : else if


int main()
{
    float grade1;
    float grade2;
    float grade3;

    printf("Enter your three test grade: \n");
    scanf(" %f", &grade1);
    scanf(" %f", &grade2);
    scanf(" %f", &grade3);

    float avg = (grade1+grade2+grade3)/3;
    printf("Average: %.2f \n", avg);

    if (avg>=90){
        printf("A");
    } else if(avg>=80){
        printf("B");
    } else if(avg>=70){
        printf("C");
    }else if(avg>=60){
        printf("D");
    }
    else{
        printf("F");
    }
    return 0;
}

반성사항 : 스캔 받은 것을 담아둘 때, array 아닌데 저장할거면 무조건 &연산자 써야한다


int main()
{
    float grade1;
    float grade2;
    float grade3;

    printf("Enter your three test grade: \n");
    scanf(" %f", grade1); #작동되지 않음 이렇게 앞에 &안 붙이고 실행하면
    scanf(" %f", grade2);
    scanf(" %f", grade3);

    float avg = (grade1+grade2+grade3)/3;
    printf("Average: %.2f \n", avg);

    return 0;
}

(1) More than one condition - &&

: use && signs


int main()
{
    int HoursStudied=60; /*10 or more hours*/
    int KidsBeatUp=0;
    
    if((test1)&&(test2)){ /*&&연산자로 묶어주면 됨*/
        printf("code");
    }
    
    return 0;
}

(2) More than one condition - OR (||)


int main()
{
    char answer;
    printf("Do you like bagles(y/n) \n");
    scanf(" %c", &answer);

    if((answer=='y')||(answer=='n')){
        printf("Good Job");
    }else{
        printf("Wrong spelling dude");
    }
    return 0;
}

Shorthand if else

(1) 형식 : (test) ? trueCode : falseCode; => 참이면 truecode 출력, 아니라면 falsecode 출력


int main()
{
    (test) ? trueCode : falseCode;
    return 0;
}

(2) 적용


int main()
{
    char lastName[20];
    printf("Last name : \n");
    scanf("%s", lastName);

    (lastName[0] < 'M') ? printf("Blue Team") : printf("Red Team");

    return 0;
}

(3) 적용 : 친구가 한명일 때만 friend로 출력되게 하고 나머지 경우에는 s 붙이기

int main()
{
    int friends=9;
    printf("I have %d friend%s", friends, (friends!=1)? "s" : "");
    return 0;
}

Increment Operator(++) / Decrement Operator(--)


int main()
{
    int tuna = 20;
    printf("%d\n", tuna);
    tuna++;
    ++tuna;				
    printf("%d\n", tuna);
    tuna--;
    printf("%d\n", tuna);
    return 0;
}

(2) ++를 앞에 붙이냐(왼), 뒤에 붙이느냐(오) 따라서 결과가 달라짐

왼 : change a before doing anything else
오 : change a after the equation

int main()
{
    int a=5, b=10, answer=0;
    /* =>++left : change a before doing anything else*/
    answer = ++a * b;
    printf("Answer : %d \n",answer);/*60 이 출력됨*/
    
    a=5, b=10, answer=0;
    answer = a++ * b;
    /* => right++ : change a after the equation */
    printf("Answer : %d \n", answer);/*50이 출력됨*/
}

while loop


int main()
{
    int tuna=1;

    while(tuna< 5){
        printf("Tuna is now %d \n",tuna);
        tuna++;
    }
    return 0;
}

(2)


int main()
{
    int day=1;
    float amount= .01;

    while(day <=31){
        printf("Day:%d \t Amount: $ %.2f \n", day, amount);
        amount*=2;
        day++;
    }

    return 0;
}

do While Loops

(1) 형태


int main()
{
	float grade = 0 ;
    do{
        this code;
    }while(this test is true);
    return 0;
}

(2) 적용


int main()
{
    float grade = 0 ;
    float scoreEntered = 0;
    float numberOfTests = 0;
    float average = 0;

    printf("Press 0 when complete, \n\n");

    do{
        printf("Tests :%.0f     Average:%.2f",numberOfTests, average);
        printf("\nEnter test scores ");
        scanf("%f", &scoreEntered);
        grade +=scoreEntered;
        numberOfTests++;
        average=grade/numberOfTests;
    }while(scoreEntered != 0);

    return 0;
}

=>

for Loop

: for(bacon=1; bacon<=10; bacon++) => 베이컨이 1부터 10까지 있고, 한번 돌때마다 베이컨을 하나씩 늘려주어라

(1) 베이컨을 하나씩만 늘리는 경우


int main()
{
    int bacon;

    for(bacon=1; bacon<=10; bacon++){
        printf("Bacon is %d \n", bacon);
    }
    return 0;
}

=>

(2) 베이컨을 8개씩 늘리고 싶을 때


int main()
{
    int bacon;

    for(bacon=1; bacon<=100; bacon+=8){
        printf("Bacon is %d \n", bacon);
    }
    return 0;
}

=>

(3) 이중 for


int main()
{
    int columns;
    int rows;

    for(rows=1; rows<=6; rows++){
        for(columns=1;columns<=4;columns++){
            printf("%d ", columns);
            }

        printf("\n");

    }
    return 0;
}

break


int main()
{
    int a;
    int howMany;
    int maxAmount=10;

    printf("How many times do you want this loop to loop? (up to ten)\n");
    scanf("%d", &howMany);

    for(a=1;a<=maxAmount;a++){

        printf("%d \n", a);

        if (a==howMany){
            break;
        }

    }
    return 0;
}

Continue

  • 밑에 있는 것 무시하고 다시 반복문 처음으로 돌아가라
    =>아래를 출력하면 6이랑 8일 때는 출력이 되지 않음

int main()
{
    int num=1;
    do{
            if(num==6 || num==8){
                num++;
                continue;
            }
        printf("%d is available \n",num);
        num++;
    }while(num<=10);

    return 0;
}

Switch


int main()
{
    char grade='A';
    switch(grade){
        case 'A': printf("sweet! \n");
            break;
        case 'B': printf("Try harder! \n");
            break;
        case 'C': printf("I C you didn't study \n");
            break;
        case 'D': printf("Embarrassing \n");
            break;
        case 'F': printf("HAHAHA \n");
            break;
        default : printf("NON SENSE!"); /* 어떤 케이스에도 속하지 않을때 디펄트값 출력*/

    }
    return 0;
}

Few Character Functions

  • #include <ctype.h> =>/provides a bunch of built-in characters/

(1) int랑 character 이랑 interchange 되는 부분

  • isalpha : 알파벳이면 참, 아니면 거짓
  • isdigit : 숫자면 참, 아니면 거짓

int main()
{
    int tuna='88';

    if(isalpha(tuna)) {
        printf("%c is a letter",tuna);
    }else{
        if(isdigit(tuna)){
            printf("%c is a number",tuna);
        }else{
        printf("OMGGGGGG");
    }
    }
    return 0;
}

toupper

:직접적으로 소문자인 것을 대문자로 바꾸는 것, 만약 소문자 아니고 대문자나 다른 문자면 그냥 그대로 출력해준다


int main()
{
    char a='a';
    char b='F';
    char c='7';

    printf("%c \n",toupper(a));
    printf("%c \n",toupper(b));

    return 0;
}

strcat

  • ham이라는 글자에 strcat 해서 글자 append하기 가능,
    다만[] 안에 있는 숫자 수만 안 넘게

int main()
{
    char ham[100]="hey";
    strcat(ham," Bucky");
    printf("%s",ham);
    return 0;
}

strcpy

:replaces one string with another string


int main()
{
    char ham[100]="hey";
    strcat(ham,"Bucky SMELLS");
    strcpy(ham, "Bucky is Awesome");
    printf("%s",ham);
}

=>SMELLS 문장이 아닌 AWESOME 문장이 출력된다

Puts & Gets

  • scanf는 hello darling 이라고 입력하면, hello 다음의 스페이스를 끝나는 것으로 인식한다는 문제점이 있음

개념 및 예시 출처 : 링크텍스트

- get

헤더파일 : <stdio.h>,
함수원형 : char~ gets(char~ str);

=> gets 함수가 "문자열"이라고 감지하는 기준은 개행(\n)입니다.
gets 함수는 들어온 문자열에 대해 '\0'울 붙여줍니다.
정리하면, 표준입력으로 들어온 문자열을 개행한 부분 앞까지 짤라서 char* 타입의 문자열로 저장해주고, 자동으로 문자열 맨 끝에 '\0'을 넣어서 문자열을 완성해 줍니다.

- puts

헤더파일 : <stdio.h>,
함수원형 : int puts(const char* str)

=>매개변수로 들어온 char* 타입의 문자열의 주소값으로 가서 문자열의 끝 '\0'이 나올때까지의 문자들을 표준출력(output)에 쭉 출력해주다가 다 출력한 후에는 친절하게 개행('\0') 까지 넣어주는 함수

(1) 예시1


int main()
{
    char catname[30];
    char catfood[20];
    char sentence[75]=" ";

    puts("What is your cat name? : ");
    gets(catname);

    puts("What does he loves to eat? : ");
    gets(catfood);

    strcat(sentence, catname);
    strcat(sentence, " loves to eat ");
    strcat(sentence, catfood);
    printf(sentence);
}

(2) 예시2


//[C언어/C++] puts example.
//BlockDMask.
#include<stdio.h>
 
int main(void)
{
    char str[100];
    for (int i = 0; i < 3; ++i)
    {
        printf("input : ");
        gets_s(str);
 
        printf("output : ");
        puts(str);
    }
    return 0;
}

Rounding Numbers (floor / ceil)


int main()
{
    float bacon1=9.44;
    float bacon2=3.3;

    printf("bacon 1 is %.2f\n",floor(bacon1));
    printf("bacon 1 is %.2f\n",floor(bacon2));

    printf("bacon 1 is %.2f\n",ceil(bacon1));
    printf("bacon 1 is %.2f\n",ceil(bacon2));
}

Absolute value : abs


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
    int year1;
    int year2;
    int age;

    printf("Enter a year \n");
    scanf(" %d", &year1);
    printf("Enter another year \n");
    scanf(" %d", &year2);

    age=year1-year2;/*절대화 안돼서 나와서 마이너스 나올수도 있음*/
    printf("%d \n", age);
    
    age=abs(age); /*절대화 되어서 나옴*/
    printf("%d \n", age);

    return 0;
}

pow

  • pow(5,3) => 5^3

int main()
{
    printf("%f \n", pow(5,3) );
    return 0;
}

sqrt

  • 제곱근

int main()
{
    printf("%.0f \n", sqrt(16) );
    return 0;
}

Random number Generator with ran

(1)
=> rand() 하면 무작위의 number이 나온다


int main()
{
    int i;
    int diceRoll;
    for(i=0; i<20; i++){
        printf("%d \n",rand());
    }
}

(2) 범위 지정해놓고 그 안에서만 랜덤 넘버 출력되게 하기(주사위처럼)


int main()
{
    int i;
    int diceRoll;
    for(i=0; i<20; i++){
        diceRoll=(rand() %6) +1 ;
        printf("%d \n",diceRoll);

    }
}

int and float arrays

(1)=> not useful

int main()
{
    int i;
    int meatballs[4] = {7,9,43,21}; /* initializing array*/
    for(i=0;i<4;i++){

        printf("element %d: %d \n",i,meatballs[i]);
    }

}

(2)

                      
int main()
{
    int i;
    int meatballs[5]; /* initializing array*/
    int totalballs=0;

    for(i=0; i<5;i++){
        printf("How many meatballs did you eat on day %d? \n",i+1);
        scanf("%d",&meatballs[i]); /* 여기다가 &연산자 꼭 붙여줘야 함 */
    }
    for(i=0; i<5;i++){
            totalballs+=meatballs[i];
    }
    int avg = totalballs /5;
    printf("You ate %d meatballs total, that's an average of %d per day! \n", totalballs, avg);
}
                      

pararell arrays (최댓값 갱신)

                       
int main()
{
    int i;
    int player[5]={58,66,68,71,87};
    int goals[5]={26,39,25,29,31};
    int gamesplayed[5] = {30,30,28,30,26};
    float ppg[5];
    float bestPPG=0.0;
    int bestplater;

    for (i=0;i<5;i++){
        ppg[i]=(float)goals[i]/gamesplayed[i];
        printf(" %d \t %d \t %d \t %.2f \n",player[i],goals[i],gamesplayed[i],ppg[i]);

        if (ppg[i]>bestPPG){
            bestPPG=ppg[i];
            bestplater=player[i];
        }

    }
    printf("\n The best player is %d \n", bestplater);
    return 0;
}
                       

Sorting arrays (while true & swwapping & temp)

                       
int main()
{
    int i, temp, swapped;
    int howmany=10;
    int goals[howmany];

    for(i=0;i<howmany;i++){
        goals[i]=(rand()%25)+1;
    }
    printf("Original list \n");
    for(i=0;i<howmany;i++){
        printf("%d \n",goals[i]);
    }

    while(i){
        swapped=0;/* sorted됐으면 0, 아니면 1 */

        for(i=0;i<howmany-1;i++){

            if(goals[i]>goals[i+1]){
                int temp=goals[i];
                goals[i]=goals[i+1];
                goals[i+1]=temp;
                swapped=1;
                }

        }
        if (swapped==0){
            break;
        }

    }

    printf("Sorted list \n");
    for(i=0;i<howmany;i++){
        printf("%d \n", goals[i]);
    }

    return 0;
}

                       

Pointers

그림 출처 링크텍스트

  • 컴퓨터 데이터가 어떤 위치에 저장되는지 보여줌
int main()
{
    int mango=22;
    printf("%p", &mango);

    return 0;
}                       

=>

(2) 좀 더 시각적이게

int main()
{
    int mango=22;
    printf("Address \t\t name \t Value \n");
    printf("%p \t %s \t %d \n", &mango,"mango",mango);
    return 0;
}                       

=> 이때 %p는 int나 str에서나 담지 못함(캐릭터도 있고 숫자도 있어서)
따라서 포인터에 저장하는 것 (store addresses)

(3) 저장하는 것

int main()
{
    int mango=22;
    printf("Address \t\t name \t\t Value \n");
    printf("%p \t %s \t\t %d \n", &mango,"mango",mango);

    int * pMango=&mango; /*we're going to hold a memory address called a pointer now*/

    printf("Address \t\t name \t\t Value \n");
    printf("%p \t %s \t\t %d \n", pMango,"mango",mango); /* 포인터에 저장한 애로 위치 불러오기기*/

    printf("Address \t\t name \t\t Value \n");
    printf("%p \t %s \t %d \n", &pMango,"pMango",pMango); /*피망고가 저장되어있는 위치- - 피망고가 저장하고 있는 값은 망고의 위치*/

    return 0;
}                       

Dereference Pointer

: go to the variable and get the value of it !!

                       
int main()
{
    int mango=22;

    int * pMango=&mango; /*we're going to hold a memory address called a pointer now*/
    printf("Address \t\t name \t\t Value \n");
    printf("%p \t %s \t\t %d \n", pMango,"mango",mango); /* 포인터에 저장한 애로 위치 불러오기기*/
    printf("%p \t %s \t %d \n", &pMango,"pMango",pMango); /*피망고가 저장되어있는 위치- - 피망고가 저장하고 있는 값은 망고의 위치*/
    
    printf("\n&pMango :%d \n",*pMango)
    /* 포인터 앞에 *붙이면(dereference) 자신이 저장하고 있는 위치값 내놓는 게 아니라 
    내가 포인팅 하고 있는 애한테로 가서 그 애의 value값을 가져온다 */
    
    return 0;
}
                       

(+) 더 나아가서 "*pMango" 는 mango랑 exactly same, 따라서 *pMango의 값을 변경하면 mango의 값도 변경이 된다
==>

int main()
{
    int mango=22;

    int * pMango=&mango; /*we're going to hold a memory address called a pointer now*/
    printf("Address \t\t name \t\t Value \n");
    printf("%p \t %s \t\t %d \n", pMango,"mango",mango); /* 포인터에 저장한 애로 위치 불러오기기*/
    printf("%p \t %s \t %d \n", &pMango,"pMango",pMango); /*피망고가 저장되어있는 위치- - 피망고가 저장하고 있는 값은 망고의 위치*/

    printf("\n*pMango :%d \n",*pMango);
    /* 포인터 앞에 *붙이면(dereference) 자신이 저장하고 있는 위치값 내놓는 게 아니라
    내가 포인팅 하고 있는 애한테로 가서 그 애의 value값을 가져온다 */

    *pMango=71;

    printf("\n*pMango :%d \n",*pMango);
    printf("\n*mango :%d \n",mango);

    return 0;
}                      

Arrays and Pointer

                       
int main()
{
    int i;
    int meatballs[5]={7,9,43,21,3};

    printf("Element \t Address \t\t Value \n");

    for (i=0;i<5;i++){
        printf("meatballs[%d] \t %p \t %d \n",i, &meatballs[i],meatballs[i]);
    }

    printf("\nmeatballs \t\t %p \n", meatballs); /*원래는 %p 값에 할당할 때 앞에 &연산자 붙여줘야 하는데, 저렇게 아무것도 안 붙이고 써주면 array 에 있는 첫번째 element를 가리키게 된다*/

    return 0;
}
                       

=> array names are just pointers to the first element

Strings and Pointers

=> whenever we make simple arrays of characters, it's hard to chamge because the name of the array it is constant,
however when we mae a pointer to a string, pointer here is a variable.
Since all that doing is its storing the address of sth sothat we can treat it like a string, saying start this address, start movie 2 and start printing until you get to 0

                       
int main()
{
    char movie[]="Sungwoo Love"; //it is a constant, cannot change it//
    char *movie2[]="I love Sungwoo"
    
    puts(movie2); //puts means print out the things that movie 2 is saving its location until it arrives to the final(0)//
    
    movie2="DONGSUNGMARRY";
    
    puts(movie2); //we can change this cuz it's a variable//
    
 
    return 0;
}
                       

Problems with String Lengths

  • 만약 영화 제목으로 20글자까지만 입력받게 만들었는데 (char movie[20];)
    20글자를 초과하게 된다면 =>
    fgets(pMovie,20,stdin)
    이렇게 해주면 20글자 넘어가면 잘라버리낟
                       
int main()
{
    char movie[20];
    char *pMovie=movie; //whenever you set a pointer equal to an array, don't use the &, cuz the name of your array is already a memory address//

    fgets(pMovie, 20, stdin);//,maximum length-so if the number gets over it, it cuts it off. stdin=input from keyboard//
    puts(pMovie);

    return 0;
}
                       

=>

The Heap

  • heap : 컴퓨터에는 extra memory들이 존재하고 있음, heap은 이러한 leftover memory, which we can borrow whenever we need and give it back whenever our programs ends
  • malloc : allocate memory or get memory from the heap, so the only parameter this function takes if how much memory do you need
    => first thing to save memory == malloc
    (how you get the extra memory)
  • free : to give it back
    =>
                       
int main()
{
    int *points;
    points=(int *) malloc(5 & sizof(int));
  
  /*sizeof(int) saves us from finding out how many bytes each system store in its variable*/
  
    /* (int*)=>int typecast pointer whenever you're storing*/
    
    free(points0) 
    
    return 0;
                       

Creating an Expandable program using the heap

  • 사용자가 입력한 값에 따라서 array의 길이가 달라지게 해주기
                     
                       
int main()
{
   int i, howmany;
   int total=0;
   float average=0.0;
   int * pointArray;

   printf("How many numbers do you want to average? \n");
   scanf(" %d", &howmany);

   pointArray=(int *) malloc(howmany * sizeof(int));

   printf("Enter them hoss! \n");
;
   for(i=0;i<howmany;i++){
    scanf("%d",&pointArray[i]);
    total+=pointArray[i];

   }

   average=(float)total/(float)howmany;
   printf("Average is %f", average);

   free(pointArray);
   return 0;
}
                       

Structures

  • '.' used for accessing individual elements or items inside your structure
                       
int main()
{
   struct user dongyun;
   struct user sungwoo;

   dongyun.userID=1;
   sungwoo.userID=2;

   puts("Enter the first name of user1");
   gets(dongyun.firstname);
   puts("Enter the first name of user2");
   gets(sungwoo.firstname);

   printf("User 1 id is %d \n", dongyun.userID);
   printf("User 2 first name is %s \n", sungwoo.firstname);

   return 0;
}
                       

Writing files in C

(1) sequential access file

  • r :read
  • a: add to end of the file (append)
  • fprint : file에 써라
int main()
{
    FILE *Fpointer;
    Fpointer= fopen("bacon.txt","w");

return 0;
}                       

=>bacon이라는 파일이 없어도 컴퓨터가 알아서 생성해 줄 것

int main()
{
    FILE *Fpointer;
    Fpointer= fopen("bacon.txt","w");
    fprintf(Fpointer, "I love cheese \n");
    fclose(Fpointer); /*done with this and back your data to your computer*/
return 0;
}                

=> 베이컨이라는 txt파일이9 생기고 아이러브치즈가 파일안에 작성이 된다

how to Read Files

  • feof loop : 라인이 있는 동안 계속 진행해라
int main()
{
    FILE *Fpointer;
    Fpointer= fopen("bacon.txt","r");

    char singleline[150];

    while(!feof(Fpointer)){
        fgets(singleline, 150, Fpointer);
        puts(singleline);
    }

    fclose(Fpointer);
return 0;
}                       

=> 문장들 사이에 빈칸들이 있는데 한 문장의 끝이 \n 이 있는 것으로 인식하기 때문이다

Append to file

                       

int main()
{
    FILE *Fpointer;
    Fpointer= fopen("bacon.txt","a");

    fprintf(Fpointer, "\nI really want to be a developer.");
    fprintf(Fpointer, "\nActually it is the only way for me.");
return 0;
}                       

=>

Random File Access

  • w+ : 처음엔 writing mode로 열었다가 나중엔 r모드로 바꿔라!
  • wseek : 문서에 작성된 곳 인덱스에 접근하는 것
  • SEEKSET : 처음부터 찾아보아라 seek to the beginning(커서가 맨앞)
  • SEEKEND : seek to the end

fseek(Fpointer, -6, SEEK_END); 왼쪽 방향으로 가는 것
fseek(Fpointer, 7, SEEK_SET); 오른쪽 방향으로 가는 것, 위에 것과 도달점 same

int main()
{
    FILE *Fpointer;
    Fpointer= fopen("bacon.txt","w+");

    fputs("pumpkkin",Fpointer);

    fclose(Fpointer);
return 0;
}                       

=>

Functions

  • return : we are done with the program, go back to sth else
  • 프로그램은 위에서부터 함수를 읽는다
  • 따라서 함수를 main 밑에 만들어놓고 이 함수명을 main위에 설정해주고(이런 함수가 존재한다~라고 말할 수 있게), 그러면 main 이 함수 읽으면서 결과 출력
                       
void printSth();

int main(){

    printSth();
    return 0;
}

void printSth(){
    printf("I'm a function");
    return;
}                     

Global , Local

(1) 이렇게 하면 int가 다 적용되어서 두번 잘 출력

                       
void printSth();

int warts=23;

int main(){
    printf("I have %d warts \n", warts);
    printSth();
    
    return 0;
}

void printSth(){
    printf("I have %d warts \n", warts);
    return;
}
                       

=>

(2) int를 main안에서만 정의해주면 printSth 함수에선 이를 인식하지 못해서 오류가 난다

                       
void printSth();

int main(){
    int warts=23;
    printf("I have %d warts \n", warts);
    printSth();

    return 0;
}

void printSth(){
    printf("I have %d warts \n", warts);
    return;
}
                       

=>

Passing arguments to Functions

                       
void convert2dollars(float euro);

int main(){

    float europrice1 = 1.00;
    float europrice2 = 5.50;

    convert2dollars(europrice1);

    return 0;
}

void convert2dollars(float euro){
    float usd = euro * 1.37;
    printf("%.2f Euros - %.2f USD\n", euro, usd);

    return;
}
                       

=>

Return Values

-리턴은 리턴한 값을 함수에 저장해주는 것

int calculateBonus(int yearsworked);

int main(){
    int yunibonus = calculateBonus(14);
    int woobonus = calculateBonus(2);
    printf("%d $ \n",yunibonus);
    printf("%d $ \n",woobonus);
    return 0;
}

int calculateBonus(int yearsworked){
    int bonus=yearsworked * 250;

    if (yearsworked > 10 ){
        bonus+=1000;
    }
    return bonus;
}     

Pass by Reference vs Pass by Value

  • 그냥 값으로 받으면 달라지지 않음, main 에서 지정된 인풋 값 그대로가 value 반영되기 때문 => 따라서 99로 튜나가 안 변하고 입력받은 값인 20 그대로 내보낸다
  • 그러나 reference 해서 받으면 영향 안받기 때문에
    함수에서 지정한 64로 그대로 나온다
void passbyvalue(int i);
void passbyaddress(int *i);

int main(){

    int tuna=20;

    passbyvalue(tuna);
    printf("Passing by value, tuna is now %d \n", tuna);

    passbyaddress(&tuna);
    printf("Passing by address, tuna is now %d \n", tuna);

    return 0;
}

void passbyvalue(int i){
    i=99;
    return;
}

void passbyaddress(int *i){
    *i = 64;
    return;
}                   

=>

좋은 웹페이지 즐겨찾기