'@C언어 : Layer7' 카테고리의 다른 글

구조체  (0) 2018.05.13
메모리 구조  (0) 2018.05.12
문자열 함수 구현  (0) 2018.04.11
함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include<stdlib.h>
size_t strlen(const char *str)
{    //문자열 길이 출력
    int a = 0;
    while (str[a] != '\0') {
        ++a;
    }
    return a;
}
 
int strcmp(const char *str1, const char *str2)
{        //문자가 서로 다른곳 까지의 아스키코드 합을 비교함
    int i;
    for (i = 0; (str1[i] != NULL|| (str2[i] != NULL); i++) {
        if (str1[i] == str2[i])
            continue;
        else if (str1[i] > str2[i]) {
            return 1;
        }
        else if (str1[i] < str2[i]) {
            return -1;
        }
    }
    return 0;
}
 
char * strcpy(char * destination, const char * source)
{    //문자열 복사
    int i;
    for (i = 0; source[i] != NULL; i++) {
        destination[i] = source[i];
    }
    destination[i] = '\0';
    return destination;
}
 
int main()
{
    int result[32];
    int index = 0;
    char arr[32];
 
    result[index++= strcmp("asdf""asdfg");
    result[index++= strcmp("asdf""asdf");
    result[index++= strcmp("asdg""asdf");
    result[index++= strcmp("asdf""asdf");
    result[index++= strcmp("00""0011");
    result[index++= strcmp("00""100");
    result[index++= strcmp("00"" 00");
    result[index++= strcmp("0"" 0");
    result[index++= strcmp("0""0 ");
    result[index++= strcmp("0""0");
    result[index++= strcmp(" "" ");
 
    strcpy(arr, "asdf1234!@#$");
    result[index++= strcmp("asdf1234!@#$", arr);
    strcpy(arr, "");
    result[index++= strcmp("asdf1234!@#$", arr);
    result[index++= strcmp("", arr);
 
    result[index++= strlen("");
    result[index++= strlen(" ");
    result[index++= strlen(" \t");
    result[index++= strlen(" \t\r\n\"");
    result[index++= strlen("asdf");
    result[index++= strlen("asdf  ");
    result[index++= strlen("  asdf");
    result[index++= strlen("  asdf  ");
    result[index++= strlen("  asdf  \t");
 
    for (int i = 0; i < index; i++)
    {
        printf("%d : %d\n", i, result[i]);
    }
    system("pause");
    /*
    Expected Result:
    0 : -1
    1 : 0
    2 : 1
    3 : 0
    4 : -1
    5 : -1
    6 : 1
    7 : 1
    8 : -1
    9 : 0
    10 : 0
    11 : 0
    12 : 1
    13 : 0
    14 : 0
    15 : 1
    16 : 2
    17 : 5
    18 : 4
    19 : 6
    20 : 6
    21 : 8
    22 : 9
    */
}
cs





'@C언어 : Layer7' 카테고리의 다른 글

메모리 구조  (0) 2018.05.12
Codeup 100제  (0) 2018.04.13
함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09

//1610

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
 
char *mysubstr(char *str, int start, int count);
 
int main() {
 
    char arr[101];
    int start,count;
    scanf("%s"&arr);
    scanf("%d %d"&start, &count);
    printf("%s\n", mysubstr (arr, start, count));
    
    return 0;
}
 
char *mysubstr(char *str, int start, int count)
{
    int i;
    char a[1000];
    for (i = start; i < count+start; i++) {
        a[i] = str[i];
    }
    a[i] = '\0';
 
    return &a[start];
}
cs




//1620

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<stdlib.h>
 
int su;
 
int hap(int su);
 
int main() {
    scanf("%d"&su);
    printf("%d", hap(su));
    return 0;
}
int hap(int su) {
    int sum = 0, num, i;
    while (1) {
        sum = 0;
        while (su != 0) {
            num = su % 10;
            sum += num;
            su = su / 10;
            printf("num : %d\nsum : %d\n", num, sum);
        }
        su = sum;
        num = 0;
        if (sum <= 9)
            break;
    }
    return sum;
}
cs


//2601


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
#include<stdlib.h>
 
int pibo(int num);
 
int main() {
    int num;
    scanf_s("%d"&num);
    printf("%d", pibo(num));
    system("pause");
    return 0;
}
 
int pibo(int num) {
    int i,num2;
    int arr[100];
    for (i = 0; i < 100; i++) {
        arr[i] = i; //arr[0]=1 arr[1]=1
    }
    arr[0= 1;
    for (i = 2; i < num; i++) {
        arr[i] = arr[i-2+ arr[i - 1];
    }
    return arr[num-1];
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

Codeup 100제  (0) 2018.04.13
문자열 함수 구현  (0) 2018.04.11
수업 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09
함수 보고서  (0) 2018.04.06


//1405


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<stdlib.h>
int main() {
    int num[1000];
    int num1,num2,i,j=0,temp=0;
    scanf_s("%d"&num1); //5
    
    for (i = 0; i < num1; i++) {
        scanf_s("%d"&num2);
        num[i] = num2;
    }
    
    for (i = 0; i < num1; i++) {
        printf("%d ", num[0]);
        temp = num[0]; //0
        for (j = 1; j < num1; j++) {
            num[j-1= num[j];
            printf("%d ", num[j]);
        }
        num[num1-1= temp; //4
        printf("\n");
    }
 
    system("pause");
    return 0;
}
cs


//1409

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<stdlib.h>
int main() {
    int arr[10];
    int num,num1,i;
    for (i = 0; i < 10; i++) {
        scanf_s("%d"&num);
        arr[i] = num;
    }
    scanf_s("%d"&num1);
    printf("%d", arr[num1 - 1]);
 
    system("pause");
    return 0;
}
cs

//1566

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include<stdlib.h>
int a, n;
 
long long int pow(int a, int n);
 
int main()
{
    scanf_s("%d%d"&a, &n);
    printf("%lld\n", pow(a,n));
    system("pause");
}
long long int pow(int a, int n) {
    long long int expo = 1,i;
    for (i = 1; i <= n; i++) {
        expo *= a;
    }
    return expo;
}
cs

//1580

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
 
float circle(int banzi);
 
int main() {
    float banzi;
    scanf_s("%f"&banzi);
    printf("%.2f", circle(banzi));
    system("pause");
    return 0;
}
 
float circle(int banzi) {
    float banzi2=0;
    banzi2 = (float)banzi * banzi*3.14;
    return banzi2;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

문자열 함수 구현  (0) 2018.04.11
함수 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09
함수 보고서  (0) 2018.04.06
오름차순 문제  (0) 2018.04.04

포인터 보고서


3-1. 포인터란 ?

어떤 대상을 가리키는 것

포인터는 메모리에 저장된 것을 가리키기 위한 것이다. 가리킨다는 것은 포인터가 어떤 대상의 주소를 저장하고 있다는 것을 의미한다.

포인터는 메모리 주소를 저장하기 위한 변수이다.


3-2. 포인터를 사용하는 이유


1) 함수로 하나 이상의 값을 리턴하기 위해


2) 메모리의 정보를 쉽게 다루기 위해서


3) 메모리의 공간을 효율적으로 사용하기 위해서


3-3. 포인터 선언법

     

타입 *포인터명; //지정된 차입의 값을 가리키기 위한 포인터를 선언


int * ptr ;

ptr : 포인터의 이름

int * : 포인터의 타입

int : 포인터의 대상타입(포인터가 가리키는 대상의 타입

ptr가 가리키는 대상의 타입이 'int'이고, ptr의 타입은 'int*'이다.


3-4. 포인터 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
 
int main() {
    int i = 5;
    int *= &i;
 
    printf("i =%d\n", i);
    //변수 i에 저장된 수
    printf("&i =%p\n"&i);
    //변수 i의 주소
    printf("p =%p\n", p);
    //포인터에 저장된 주소
    printf("&p=%p\n"&p);
    //포인터 p의 주소
 
    return 0;
}
cs

변수 i의 값, 변수 i의 주소, 포인터에 저장된 주소, 포인터 p의 주소를 출력



3-5. &연산자와 *연산자

1)   '&'연산자 = 주소 연산자 : 피연산자의 주소를 반환한다.

int i = 1;

int *ptr = &i;  //변수 i의 주소를 포인터 ptr에 저장


2)  '*'연산자 = 역참조 연산자 : 지정된 주소에 저장된 값을 반환한다.


포인터가 가리키는 대상에 저장된 값을 가져올 때는 '*'연산자 사용한다.  피연산자(포인터)가 가리키는 주소에 저장된 값을 읽어서 반환한다. 

int i=200 ;

int *ptr = &i ;  //포인터 ptr이 변수 i를 가리키게 된다.


3-6. Call by value 와 Call by reference

Call by value: 

main 함수에서 선언한 변수 n에 10을 넣어주고 값을 받아서 func함수에서 다시 20을 넣어주는데 main함수에서의 n=10과 func함수에서의 n=20은 메모리상 다른 위치에 상주해 있으므로 다시 main함수로 넘어오면 수정했던 값이 없어진다.


Call by reference:

변수 n의 주소를 함수 func의 n에게 넘겨주었으므로 func에서 넣은 20이 그대로 n에 들어가게 된다.(둘은 같은 주소를 공유하고 있으므로)



3-7. Swap 함수 구현 및 설명


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
void swap_r(int *a, int *b);
 
int main() {
    int a, b;
    swap_r(&a, &b);
    printf("%d %d\n", a, b);  //주소를 이용하여 바꾸어줌
    system("pause");
    return 0;
}
void swap_r(int *a, int *b) {
    int temp;
    temp = *a;
    *= *b;
    *= temp;
}
cs

설명 :

main함수에서 &a,&b를 이용하여 swap_r함수에 값을 전달했기 때문에 두 함수의 a,b는 같은 주소를 공유하고 있다.

swap_r함수에서 변수 temp를 선언하여 a->temp / a=b / b=temp로 두 a,b값을 바꿔주고 값을 main에서 출력하면 바뀐 두 값이 정상적으로 출력된다.

'@C언어 : Layer7' 카테고리의 다른 글

함수 문제풀이  (0) 2018.04.09
수업 문제풀이  (0) 2018.04.09
함수 보고서  (0) 2018.04.06
오름차순 문제  (0) 2018.04.04
달팽이 배열  (0) 2018.04.04

2. 함수 보고서


2-1. 함수란?

함수는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.


2-2. 함수를 사용하는 이유

대표적으로 3가지가 있다.


1) 높은 재사용성

만들어 놓은 함수는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.


2) 중복된 코드의 제거

프로그래밍을 하다 생기는 같은 내용의 문장들을 하나로 묶어서 함수로 작성해 놓으면 함수를 호출하는 한 문장으로 대처할 수 있다.


3) 프로그램의 구조화

지금까진 짧은 단위의 프로그램을 작성하여 별 문제가 없었지만 프로그램의 규모가 커질 수록 문장들을 작업단위로 나눠서 여러 개의 함수에 담아 프로그램의구조를 단순화 시키는 것이 필수적이다. 프로그램의 전체흐름이 한눈에 들어올 정도로 단순하게 구조화 해야 프로그램에 문제가 발생해도 해당 부분을 쉽게 찾아 오류를 해결할 수 있다.


2-3. 함수의 형태


반환타입 함수이름 (매개변수 선언){

//함수 호출시실행될 문장들

.....

return 반환값 ; 


}


2-4. 함수의 선언

함수는 크게 두 부분, '선언부'와 '구현부'로 이루어져 있다.


함수의 선언부 는 '반환 타입'과 '함수의 이름' 그리고 '매개변수 선언'으로 구성되어 있으며 함수가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는 지에 대한 정보를 제공한다.


-매개변수 선언

매개변수는 함수가 작업을 수행하는데 필요한 값들을 제공받기 위한 것이며 필요한 값으 개수만큼 변수를 선언한다. 만일 값을 전혀 입력받을 필요가 없다면 괄호()안에 'void'라고 적는다.


-반환 타입

함수의 작업수행 결과인 '반환값'의 타입을 적는다. 반환값이 없는 경우 반환타입으로 'void'를 적어야 한다.


함수의 구현부는 함수를 호출했을 때 수행될 문장들을 넣는다.


-return문

함수의 반환타입이 'void'가 아닌 경우. 구현부{ } 안에 'return 반환값 ;' 이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환값을 호출한 함수로 전달하는데, 이 반환값의 타입은 반환타입과 일치해야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
 
int hap(int a, int b); 
//hap이라는 함수가 존재한다는 것을 알려주기 위해 미리 선언
 
int main() {
    int num1, num2;
    scanf_s("%d %d"&num1, &num2);
    hap(num1, num2); 
 //함수를 호출하고 int a,b의 값을 전달해 준다(여기선 num1,num2)
    system("pause");
    return 0;
}
 
int hap(int a, int b) {  //반환값이 있으므로 int라고 정해준다
    int hap;
    hap = a + b;
    return printf("%d",hap); //hap의 출력을 반환한다.
}
cs

ㄴ> 이해를 도와줄 입력받은 두 수의 합을 구하는 프로그램을 만들어 보았다.



2-5. 함수의 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<stdlib.h>
 
int put();
 
int main() {
    put();
    system("pause");
    return 0;
}
 
void put() {
    int a;
    scanf_s("%d"&a);
    printf("입력받은 값: %d\n", a);
}
cs

ㄴ> 입력 받은 값을 그대로 출력하는 프로그램이다.

값을 입력받고 출력하는 모든일을 함수에서 한다.

4번째 줄에서 함수를 한번 더 선언하는 이유는 C언어는 프로그램을 위에서 아래로 읽어내리는 방식이기 때문에 미리 이런 함수가 있다 라고 알려주지 않으면 오류가 발생한다.

15번째 줄에서 return이 쓰이지 않은 이유는 main함수에서 put함수의 결과 값을 받아서 할 일이 없기때문에 바로 printf를 해주면 put함수의 역할은 끝나는 것이다.



2-6. return문


함수의 반환타입이 'void'가 아닌 경우. 구현부{ } 안에 'return 반환값 ;' 이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환값을 호출한 함수로 전달하는데, 이 반환값의 타입은 반환타입과 일치해야 한다.

void일때 사용된 return문은 함수 종료의 뜻을 가진다.


2-7. <string.h>에 있는 strcpy, strlen,strcmp 조사


-strcpy


#include <string.h>

char * strcpy ( char * destination, const char * source );


문자열을 복사한다.
source 가 가리키는 C 형식의 문자열 (널null 종료 문자열) 을 destination 이 가리키는 곳에 복사한다. 이 때, 널도 포함해서 복사한다. 
오버플로우를 방지하기 위해서, destination 이 가리키는 배열의 크기는 반드시 source 문자열의 크기와 같거나 이보다 커야 한다. 또한, 복사하는 영역이 source 와 겹치면 안된다. 


-strlen


#include <sting.h>

strlen(const char * str)


문자열의 길이를 구한다.
문자열의 길이는 리턴한다. C 문자열의 길이는 마지막 널 문자에 의해 결정된다. 따라서 strlen 은 문자열의 시작 부터, 널 문자 직전 까지의 문자의 개수를 센다. 


-strcmp


#include <string.h>

int strcmp( const char * str1 ,const char * str2);


두 개의 문자열을 비교한다.
C 문자열 형식의 str1 과 str2 를 비교한다.
이 함수는 각 문자열의 첫 번째 문자 부터 비교를 시작한다. 만일 같다면 두 문자가 다를 때 까지나 NULL 에 도달할 때 까지 계속 비교를 수행한다. 

(http://itguru.tistory.com 참조)



2-7-1. 전달인자


매개변수와 전달인자는 같은 의미로 쓰이는 경우가 많지만 둘은 명백히 다른용어이다.


 -매개변수

int sum(int a, int b);

int sum(int a, int b) 은 실제값은 존재하지 않고 형태를 나타내 준다.


-전달인자

sum(10,20);

sum함수를 호출했을때 10,20을 전달인자라고 한다. 전달인자에는 값이 존재한다.

(http://wowon.tistory.com 참조)




2-7-2. 반환값


strcpy - 목적지 문자열 destination에 대한 포인터를 반환


strlen - 문자열의 길이 반환


strcmp - 두 문자열의 관계에 따라 정수값 반환



2-7-3. 함수의 기능


1) 높은 재사용성


2) 중복된 코드의 제거

 

3) 프로그램의 구조화

'@C언어 : Layer7' 카테고리의 다른 글

수업 문제풀이  (0) 2018.04.09
포인터 보고서  (0) 2018.04.09
오름차순 문제  (0) 2018.04.04
달팽이 배열  (0) 2018.04.04
배열 문제  (0) 2018.04.02
//오름차순 문제 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<stdlib.h>
int main() {
    int arr[5= { 66,55,33,77,44 };
    int i, j, c;
 
    for (i = 0; i < 5; i++) {    
 
        for (j = i + 1; j < 5; j++) {    
            if (arr[i] > arr[j]) {        
                c = arr[i];         
                arr[i] = arr[j];          
                arr[j] = c;                
            }              
        }
                       
    }
    for (i = 0; i < 5; i++) {
        printf("%3d", arr[i]);
    }
    system("pause");
 
    return 0;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

포인터 보고서  (0) 2018.04.09
함수 보고서  (0) 2018.04.06
달팽이 배열  (0) 2018.04.04
배열 문제  (0) 2018.04.02
배열 보고서  (0) 2018.04.01

//달팽이 배열을 풀어보았다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int arr[100][100]; // 배열[x][y]
    int x = 0// 열(세로)
    int y = -1// 행(가로)
    int turn = 1// 증가하는 값
    int num = 1// 입력받은 값
    int num1, i, j, a;
 
    scanf_s("%d"&num1);
    a = num1;
 
    while (num1 != 0) {
        for (i = 0; i < num1; i++) {
            y += turn;
            arr[x][y] = num;
            num++;
        }
 
        num1--;
 
        for (i = 0; i < num1; i++) {
            x += turn;
            arr[x][y] = num;
            num++;
        }
 
        turn = turn * -1;  //turn = 1
    }
 
    for (i = 0; i < a; i++) {
        for (j = 0; j < a; j++) {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
cs


'@C언어 : Layer7' 카테고리의 다른 글

함수 보고서  (0) 2018.04.06
오름차순 문제  (0) 2018.04.04
배열 문제  (0) 2018.04.02
배열 보고서  (0) 2018.04.01
이중for문 문제풀이  (0) 2018.04.01

+ Recent posts