break < return < exit 으로 갈수록 범위가 커짐

 

1. break

 -switch문 / 반복문에서 중괄호를 빠져나오게 함.

 

2. return

 -함수에서 빠져나오게 함.

 -그 아래 코드는 실행하지 않음.

 

3.exit

 -main함수가 아닌 곳에서도 프로그램을 종료시킴 (그렇군!)

 -main함수에서 return 0한 것과 동일

 -exit(0) 정상적인 종료

  exit(1) 비정상적인 종료 (에러가 발생함을 보여줌)

저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

 c언어에서는 더 정확한 printf와 scanf를 하기 위해서 %d, %lf같이 형식지정자를 지정해줄 수 있다.

 

 

 형식지정자

 형식

 약자

 d

 int

 decimal number / 10진수

 o

 int

 octal number / 8진수 (printf 할 때 '0'을 표기하지 않음.

 x 또는 X

 int

 hexadecimal number / 16진수(printf하면 '0x'를 따로 표기하지 않음.)

X를 사용하면 ABCDEF 대문자 사용함.

 ld

 long

decimal number / 10진수

 u

 unsigned

decimal number 

 lu

 unsigned long

decimal number

 c

 char

single character

 s

 char pointer

string

 f

 float

 

 g

 float

 

 e

 float

 

 lf

 double

 

 lg

 double

 

 le

 double

 

 

1. int

#include<stdio.h>
void main(void)
{
 int i = 10;
 printf("10진수: %d\n", i);
 printf("8진수: %o\n", i);
 printf("16진수(대문자): %X\n", i);
 printf("16진수(소문자): %x\n", i);
}

 

2. 문자

#include<stdio.h>
void main(void)
{
 char c = 'A'; //A는 아스키코드로 65
 printf("문자열: %c\n", c);
 printf("아스키코드로 'A': %d\n", c);
 
}

 


참고


 

 

저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

c언어에서 다항식을 표현하는 것에는 두가지 방법이 있다.

poly_add1은 배열을 이용해 0차부터 최고차항까지 다 표현한다. 연산이 편리한 장점이 있다.

poly_add2는 0이 아닌 차수만 표현하기에 메모리 낭비가 적다.

 

 

 

#include <stdio.h>#define MAX(a,b) (((a)>(b))?(a):(b))

#define MAX_DEGREE 10
typedef struct
{
    int degree;
    int coef[MAX_DEGREE];
} polynomial;
 
polynomial poly_add1(polynomial A, polynomial B)
{
    int i;
    polynomial C;
    int Apos = 0, Bpos = 0, Cpos = 0;
    int degree_a = A.degree, degree_b = B.degree;
    C.degree = MAX(A.degree, B.degree);
    while (Apos <= A.degree && Bpos <= B.degree) {
        if (degree_a > degree_b) {
            C.coef[Cpos++] = A.coef[Apos++];
            degree_a--;
        }
        else if (degree_a == degree_b) {
            C.coef[Cpos++] = A.coef[Apos++] + B.coef[Bpos++];
            degree_a--; degree_b--;
        }
        else {
            C.coef[Cpos++] = B.coef[Bpos++];
            degree_b--;
        }
    }
    while (C.coef[0] == 0)
    {
        for (i = 0; i < C.degree; i++)
        {
            C.coef[i] = C.coef[i + 1];
        }
        C.degree--;
 
    }
    return C;
}
void print_poly1(polynomial p)
{
 
    int i;
    int exponent = p.degree;
 
    for (i = 0; i <= p.degree; i++)
    {
        if (p.coef[i] != 0)
            printf("%dx^%d ", p.coef[i], exponent);
        exponent--;
    }printf("\n");
}
int main(void) {
    polynomial a = { 6,{ 4, 3, 6, 0, 0, 0, 10 } };
    polynomial b = { 6,{ -4, -3, 7, 0, 5, 1, 10 } };
    //polynomial a = {6, {4, 3, 6, 0, 0, 0, 10}};
    //polynomial b = {4, {7, 0, -5, 1, 0}};
    polynomial c;
    c = poly_add1(a, b);
    printf("a = "); print_poly1(a);
    printf("b = "); print_poly1(b);
    printf("a + b = c = "); print_poly1(c);
    printf("C의 차수:%d\n", c.degree);
}

 

 

#include <stdio.h>
#define MAX_TERMS 11
typedef struct {
    int coef;
    int expon;
} term;
 
int poly_add2(term t1[], int t1Size, term t2[], int t2Size, term t3[])
{
 
    int i = 0, j = 0, k = 0;
    int coef;
    while (i < t1Size && j < t2Size)
    {
        if (t1[i].expon > t2[j].expon)
            t3[k++] = t1[i++];
        else if (t1[i].expon == t2[j].expon)
        {
            if ((coef = t1[i].coef + t2[j].coef) != 0)
            {
                t3[k].coef = coef;
                t3[k].expon = t1[i].expon;
                k++;
            }
            i++; j++;
 
        }
        else
            t3[k++] = t2[j++];
 
    }
    while (i < t1Size)
        t3[k++] = t1[i++];
 
    while (j < t2Size)
        t3[k++] = t2[j++];
 
 
    return k;
}
 
 
void print_poly2(term t[], int tSize)
{
    int i = 0;
 
    for (i = 0; i < tSize; i++)
    {
        printf("%dx^%d ", t[i].coef, t[i].expon);
 
    }printf("\n");
}
 
 
 
int main(void)
{
    term a[] = { { 60, 6 },{ 40, 4 },{ 30, 3 },{ 10, 1 } };
    int aSize = sizeof(a) / sizeof(a[0]);
    term b[] = { { -60, 5 },{ -40, 4 },{ -10, 1 } };
    int bSize = sizeof(b) / sizeof(b[0]);
 
 
 
 
 
    term c[MAX_TERMS];
    int cSize;
 
 
    cSize = poly_add2(a, aSize, b, bSize, c);
 
    printf("a = ");
    print_poly2(a, aSize);
    printf("b = ");
    print_poly2(b, bSize);
    printf("c = ");
    print_poly2(c, cSize);
 
    printf("\nC 항의 개수%d", cSize);
 
 
}
저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

 c언어에서 외부 파일을 불러오는 방법이다.

 

 

int main()
{
    FILE *fp;
    char sentence[30];
    if ((fp = fopen("input.txt""r")) == NULL)
    {
        fprintf(stderr, "fileOpenError");
        exit(1);
    }
    while (fgets(sentence, sizeof(sentence), fp) != NULL)
    {
        printf("%s\n", sentence);
    }
 
 
}
저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

merge sort

 #include<stdio.h>
#include<stdlib.h>
void display(int* A, int n);
void merge(int A[], int p, int q, int r);
void mergeSort(int A[], int p, int r);
void copyArray(int *A, int *temp, int p, int r);
int main()
{
    int n;
    int *A;
    int i;
 
    printf("배열의 길이를 입력하세요:");
    scanf("%d", &n);
    A = (int*)malloc(sizeof(int) * n);
 
    for (i = 0; i < n; i++)
    {
        printf("%d번째 배열의 원소를 입력하세요:", i + 1);
 
        scanf("%d", &A[i]);
    }
 
    printf("정렬 전:\n");;
    display(A, n);
 
    mergeSort(A, 0, n - 1);
    printf("정렬 후:\n");
    display(A, n);
    free(A);
}
 
void mergeSort(int A[], int p, int r)
{
    int q;
 
    if (p == r) return;
 
    q = (p + r) / 2;
    mergeSort(A, p, q);
    mergeSort(A, q + 1, r);
    merge(A, p, q, r);
}
void merge(int A[], int p, int q, int r)
{
    int i = p, j = q + 1, k;
    int *temp = (int*)malloc(sizeof(int) * (r - p + 1));
 
    if (!temp) printf("메모리를 할당할 수 없습니다.");
    for (k = 0; k < r - p + 1; k++)
    {
        while (i > q)
        {
            if (j > r)
            {
                copyArray(A, temp, p, r);
                free(temp);
                return;
            }
            temp[k] = A[j];
            k++;
            j++;
 
        }
        while (j > r)
        {
            if (i > q)
            {
                copyArray(A, temp, p, r);
                free(temp);
                return;
            }
            temp[k] = A[i];
            k++;
            i++;
 
        }
 
        if (A[i] < A[j])
        {
            temp[k] = A[i];
            i++;
        }
        else
        {
            temp[k] = A[j];
            j++;
        }
 
    }
    copyArray(A, temp, p, r);
 
}
void display(int* A, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
}
 
void copyArray(int *A, int *temp, int p, int r)
{
    int i;
    int j = 0;
    for (i = p; i <= r; i++)
    {
        A[i] = temp[j];
        j++;
    }
}

 

 

insert sort

#include<stdio.h>
insertionSort(int *A, int n)
{
    int i, j, k, temp;
    for (i = 1; i < n; i++)
    {
        for (j = 0; j < i; j++) {
            if (A[j] > A[i]) break;//>:오름차순 <:내림차순
        }
 
       
        temp = A[i];//A[i]인지 A[j]인지 판단
        for (k = i; k > j; k--)
        {
            A[k] = A[k - 1];
 
        }
        A[j] = temp;
 
 
    }
}
void display(int* A, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
 
    }
    printf("\n");
}
int main()
{
    int A[5] = { 3,5,4,2, 6 };
    printf("정렬 전:\n");
    display(A, 5);
    insertionSort(A, 5);
    printf("정렬 후:\n");
    display(A, 5);
}

 

quick sort

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void quickSort(struct Student s[], int p, int r);
int partition(struct Student s[], int p, int r);
void print_array(struct Student s[], int n);
void swqp(struct Student s[], int i, int j);
struct Student
{
 int id;
 int english;
 int math;
 int korean;
};

int main()
{
 struct Student* s;
 int n;
 int i;
 srand(time(NULL));
 printf("학생의 수를 입력하세요:");
 scanf("%d", &n);
 s = (struct Student*)malloc(sizeof(struct Student) * n);
 if (!s)
 {
  printf("메모리를 할당할 수 없습니다.");
  return 0;
 }
 for (i = 0; i < n; i++)
 {
  s[i].id = i + 1;
  s[i].english = rand() % 101;
  s[i].math = rand() % 101;
  s[i].korean = rand() % 101;
 }
 quickSort(s, 0, n-1);


}

void quickSort(struct Student s[], int p, int r)
{
 int q;
 if (p >= r) return;
 q = partition(s, p, r);
 quickSort(s, p, q - 1);
 quickSort(s, q + 1, r);

}
void swap(struct Student s[], int i, int j)
{
 struct Student temp;
 temp = s[i];
 s[i] = s[j];
 s[j] = temp;

}
int partition(struct Student s[], int p, int r)
{
 int i = -1, j = 0;
 while (p != r)
 {
  if (s[j].korean < s[r].korean)
  {
   swap(i + 1, j);
   i++;
   j++;
  }
  else
   j++;

 }
 swap(i + 1, r);
 return i + 1;
}

void print_array(struct Student s[], int n)
{
 int i;
 printf("        id     korean    english        math\n");
 for (i = 0; i < n; i++)
 {
  printf("%10d %10d %10d %10d", s[i].id, s[i].korean, s[i].english, s[i].math);
  printf("\n");
 }

}

 

 

 

 

저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

m[0][0]에서 m[3][3]까지 가는데 합이 가장 큰 길은??

M배열에 자기 까지의 최고 합을 메모한다.

 

m배열

 6

12 

 5

 5

11 

 18

 7

 17

3

 3

 8

 10

14

 9

 

 #include <stdio.h>
#include <stdlib.h>
 
int matrixPath(int m[][4], int r, int c, int i, int j, int M[][4])
{
    if (i == 0 && j == 0)
    {
        printf("m[%d][%d] :%d  \n", i, j, m[i][j]);
        return m[i][j];
    }
    else if (i == 0)
    {
        if (M[0][j] == 0)
            M[0][j] = matrixPath(m, r, c, 0, j - 1, M) + m[i][j];
        printf("M[%d][%d] :%d  \n", i, j, M[i][j]);
 
        return M[0][j];
 
    }
    else if (j == 0)
    {
        if (M[i][0] == 0)
            M[i][0] = matrixPath(m, r, c, i - 1, 0, M) + m[i][j];
        printf("M[%d][%d] :%d  \n", i, j, M[i][j]);
       
        return M[i][0];
 
    }
    else
    {
        int a, b;
        if (M[i - 1][j] == 0)
            M[i - 1][j] = matrixPath(m, r, c, i - 1, j, M);
        if (M[i][j - 1] == 0)
            M[i][j - 1] = matrixPath(m, r, c, i, j - 1, M);
        a = M[i - 1][j];
        b = M[i][j - 1];
        printf("M[%d][%d] :%d , M[%d][%d]: %d \n",i-1, j, a, i, j-1,b);
        return ((M[i - 1][j] < M[i][j - 1]) ? M[i - 1][j] : M[i][j - 1]) + m[i][j];
    }
}
int main(void)
{
    int m[4][4] =  { { 6,7,12,5 },{ 5,3,11,18 },{ 7,17,3,3 },{ 8,10,14,9 } };
    int i, j, r, c;
    //int **M ;
 
    int M[4][4];
    r = c = 4; // 4x4 matrix
 
   
    for(i = 0; i < r; i++)
        for (j = 0; j < c; j++)
        {
            M[i][j] = 0;
 
       
        }
       
 
 
        printf("%d\n", matrixPath(m, r, c, 3, 3, M));
}

 

 

 

저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

 순환을 이용한 피보나치 수열

같은 계산을 또 하지 않기 위해 F배열에 값을 메모한다.

 

#include <stdio.h>
#include <stdlib.h>
 
int fib(int n, int* F) {
    if (n == 1 || n == 2)
        return 1;
    if (F[n - 1] == 0)
        F[n - 1] = fib(n - 1, F);
    if (F[n - 2] == 0)
        F[n - 2] = fib(n - 2, F);
    printf("%d ", F[n - 1] + F[n - 2]);
    return F[n - 1] + F[n - 2];
}
 
int main(void)
{
    int n, i;
    int *F;
  
 
    printf("몇 번째까지의 피보나치 수열:");
    scanf("%d", &n); //fn
 
                    
    F = (int*)malloc(sizeof(int)*(n + 1));
                    
    for (i = 0; i < n; i++)
        F[i] = 0;
                 
    fib(n, F);
}
 
저작자 표시 비영리 변경 금지
신고
Posted by 친절한 LEELAB

 순환을 이용한 조합

m 배열에 값을 메모한다.

#include<stdio.h>
int comb(int n, int r, int *m);
int main()
{
    int c;
    int i;
    int n, r;
    int *m;
    printf("enter number n and r (nCr)\n");
    printf("n:");
    scanf("%d", &n);
    printf("r:");
    scanf("%d", &r);
 
    m = (int*)malloc(sizeof(int) * (r + 1));
    for (i = 0; i <= r; i++)
        m[i] = 0;
    c = comb(n, r, m);
    printf("%d", c);
 
    return 0;
}
int comb(int n, int r, int *m)
{
    if (r == n || r == 0)
        return 1;
    if (n - 1 == r)
    {
 
        if(m[r] == 0)
            m[r] = comb(n - 1, r - 1, m) + comb(n - 1, r, m);
        return m[r];
    }
   
    return comb(n - 1, r - 1, m) + comb(n - 1, r, m);
}
 
 
저작자 표시 비영리 변경 금지
신고

'개발 공부 > C' 카테고리의 다른 글

[c언어] 순환 / 큰 값으로 만들어주는 길 찾기  (0) 2017.10.04
memorization / 피보나치 수열  (0) 2017.10.04
memorization / 조합 combination  (0) 2017.10.04
[c언어] 미로 길 찾기  (0) 2017.10.04
[c언어] 디버깅 debuging  (0) 2017.09.28
[c언어] string.h 함수  (0) 2017.09.28
Posted by 친절한 LEELAB

미로 길 찾기

 

 

#include <stdio.h>
#include <stdlib.h>
 
int matrixPath(int **m, int r, int c, int i, int j, int **M, int **N)
{
    if (i == 0 && j == 0)
        return m[i][j];
   
    else if (i == 0)
    {
        if (N[0][j] == 0)
        {
            M[0][j] = matrixPath(m, r, c, 0, j - 1, M, N) + m[i][j];
            N[0][j] = 1;
        }
        return M[0][j];
    }
    else if (j == 0)
    {
        if (N[i][0] == 0)
        {
            M[i][0] = matrixPath(m, r, c, i - 1, 0, M, N) + m[i][j];
            N[i][0] = 1;
 
        }
        return M[i][0];
    }
    else
    {
        int a, b;
        if (N[i - 1][j] == 0)
        {
            M[i - 1][j] = matrixPath(m, r, c, i - 1, j, M, N);
            N[i - 1][j] = 1;
        }
        if (N[i][j - 1] == 0)
        {
            M[i][j - 1] = matrixPath(m, r, c, i, j - 1, M, N);
            N[i][j - 1] = 1;
        }
        a = M[i - 1][j];
        b = M[i][j - 1];
        return ((a < b) ? a : b) + m[i][j];
    }
}
int main(void)
{
 
    int i, j, r, c;
    int **M;
    int **N;
    int **m;
    printf("enter row and column\n");
    printf("number of row:");
    scanf("%d", &r);
    printf("number of column:");
    scanf("%d", &c);
    m = (int**)malloc(sizeof(int*) * r);
    M = (int**)malloc(sizeof(int*) * r);
    N = (int**)malloc(sizeof(int*) * r);
    for (i = 0; i < r; i++)
    {
        m[i] = (int*)malloc(sizeof(int) * c);
        M[i] = (int*)malloc(sizeof(int) * c);
        N[i] = (int*)malloc(sizeof(int) * c);
    }
   
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
        {
            M[i][j] = 0;
            N[i][j] = 0;
        }
    printf("%d x %d 행렬의 값을 입력하세요:\n", r, c);
   
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            scanf("%d", &m[i][j]);
 
    printf("%d\n", matrixPath(m, r, c, r - 1, c - 1, M, N));
    for (i = 0; i < r; i++)
    {
        free(m[i]);
        free(M[i]);
        free(N[i]);
    }
 
    free(m);
    free(M);
    free(N);
}

 

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
 
int matrixPath(int m[][4], int r, int c, int i, int j, int M[][4], bool check[][4]);
int main(void)
{
   
    int m[4][4] = { { 6,7,12,5 },{ 5,3,11,18 },{ 7,17,3,3 },{ 8,10,14,9 } };
    int i, j, r, c;
    bool check[4][4] = { false };
 
    int M[4][4] = {0};
    r = c = 4;
   
    printf("%d\n", matrixPath(m, r, c, 3, 3, M, check));
}
int matrixPath(int m[][4], int r, int c, int i, int j, int M[][4], bool check[][4])
{
    if (i == 0 && j == 0)
    {
        printf("m[%d][%d] :%d  \n", i, j, m[i][j]);
        return m[i][j];
    }
    else if (i == 0)
    {
        if (!check[0][j])
        {
 
            M[0][j] = matrixPath(m, r, c, 0, j - 1, M, check) + m[i][j];
            check[0][j] = true;
        }
        printf("M[%d][%d] :%d  \n", i, j, M[i][j]);
 
        return M[0][j];
 
    }
    else if (j == 0)
    {
        if (!check[i][0])
        {
 
 
            M[i][0] = matrixPath(m, r, c, i - 1, 0, M, check) + m[i][j];
 
            check[i][0] = true;
        }
        printf("M[%d][%d] :%d  \n", i, j, M[i][j]);
 
        return M[i][0];
 
    }
    else
    {
        int a, b;
        if (!check[i - 1][j])
        {
            M[i - 1][j] = matrixPath(m, r, c, i - 1, j, M, check);
            check[i - 1][j] = true;
        }
        if (!check[i][j - 1])
        {
            M[i][j - 1] = matrixPath(m, r, c, i, j - 1, M, check);
            check[i][j - 1] = true;
        }
    
 
        return ((M[i - 1][j] < M[i][j - 1]) ? M[i - 1][j] : M[i][j - 1]) + m[i][j];
    }
}

 
저작자 표시 비영리 변경 금지
신고

'개발 공부 > C' 카테고리의 다른 글

memorization / 피보나치 수열  (0) 2017.10.04
memorization / 조합 combination  (0) 2017.10.04
[c언어] 미로 길 찾기  (0) 2017.10.04
[c언어] 디버깅 debuging  (0) 2017.09.28
[c언어] string.h 함수  (0) 2017.09.28
[c언어] scanf / gets / fgets  (0) 2017.09.28
Posted by 친절한 LEELAB

C언어 디버깅 매크로

 

ctrl + F5 디버깅 없이 실행

 

F5 디버깅 시작

shift + F5 디버깅 종료

 

 

F10 다음 줄 / 디버깅 시작

F11 다음 줄 (함수를 만나면 함수 내부로 감)

 

F9 중단점 설정/ 해제

F5 중단점으로 바로 가기

 

 

 

 

저작자 표시 비영리 변경 금지
신고

'개발 공부 > C' 카테고리의 다른 글

memorization / 조합 combination  (0) 2017.10.04
[c언어] 미로 길 찾기  (0) 2017.10.04
[c언어] 디버깅 debuging  (0) 2017.09.28
[c언어] string.h 함수  (0) 2017.09.28
[c언어] scanf / gets / fgets  (0) 2017.09.28
C언어 fflush(stdin) gets()가 안돼요  (0) 2017.05.28
Posted by 친절한 LEELAB