반응형

1. There are three towers and 64 disks of different diameters placed on the first tower. The disks are in order of decreasing diameter as one scans up the tower. Monks were reputedly supposed to move the disk from tower 1 to tower 3 obeying the rules :




(a) Only one disk can be moved at any time.

(b) No disk can be placed on top of a disk with a smaller diameter.

Write a recursive function that prints out the sequence of moves needed to accomplish this task.




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
/*****************************************************************
num : 원판의 갯수 from : 옮기는 판이 원래 있던 기둥
to : 옮기는 판이 옮겨질 기둥  disk : 사용자가 입력한 원판의 개수
pass_stop : from에 있던 (n-1)개의 원판이 to로 가기 위해 경유하는 기둥 
count : 움직인 횟수
기둥은 총 3개가 있는데 각 기둥을 정수 1,2,3으로 표현하였다.
****************************************************************/
 
#include <stdio.h>
void Hanoi(int num, int from, int to);
int count = 0;
int main(void)
{
    int disk = 0
    printf("원판 수를 입력하세요: ");
    scanf("%d"&disk); // 옮길 원판 개수 입력
    Hanoi(disk, 13); // 시작 위치 : 기둥1 도착 위치 : 기둥3
    printf("총 움직인 횟수는 %d회 입니다.\n", count);
    return 0;
}
void Hanoi(int num, int from, int to) 
{
    int pass_stop = 2// 각 기둥을 1,2,3 이라고 정함, 1+2+3=6
    if (num <= 1)
    {
        printf("%d번째 원판을 %d에서 %d로 옮겼습니다.\n", num, from, to);
        count++;
    }
    else {
        pass_stop = 6 - from - to;
        Hanoi(num - 1, from, pass_stop); // (n-1)개를 from에서 pass_stop으로 옮긴다.
        printf("%d번째 원판을 %d에서 %d로 옮겼습니다.\n", num, from, to);
        count++;
        Hanoi(num - 1, pass_stop, to); // (n-1)개를 pass_stop에서 to 로 옮긴다.
    }
}
cs






2. Write the iterative(반복의) (Program 2-1) and recursive(회귀의) (Program 2-2) binary search function and measure the worst case performance of both functions (using Program 1.25), and analyze average case time complexity of binary search algorithm.


*프로그램 1.25에 써있는 numtime 대로 하면 cpu 성능이 너무 좋아 시간이 제대로 나오지 않으므로 곱하기 100씩 한 수를 넣어주었다.





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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COMPARE(mid,searchnum)  (((mid)<(searchnum)) ? (-1) : (((mid)>(searchnum)) ? (1) : (0)))  //미들값과 찾는값의 크기를 비교하여 해당 값 반환
/* mid<searchnum 이면 -1 반환, mid>searchnum이면 1 반환, mid=searchnum이면 1 반환*/
#define MAX_SIZE 1001 //상수 MAX_SIZE는 1001
#define ITERATIONS 16 //상수 ITERATIONS는 16
int binsearch_rec(int list[], int searchnum, int left, int right);
int binsearch_itr(int list[], int searchnum, int left, int right);
int main(void)
{
    int i,j,position;  //int형 변수 i,j,positon 선언
    int list[MAX_SIZE]; //int형 배열 list 선언, 배열의 크기는 MAX_SIZE=1001
    int sizelist[]={0,10,20,30,40,50,60,70,80,90,100,200,400,600,800,1000}; //이진탐색을 시행할 크기
    int numtimes[]={3000000,1200000,600000,500000,400000,400000,400000,300000,300000,200000,200000,100000,50000,50000,50000,20000}; // 이진탐색을 돌릴 횟수
    clock_t start, stop; //clock_t는 time.h에서 정의되어있는데 long 형과 같다. start, stop 변수 선언
    double duration, total; //double 형 변수 duration, total 선언
    for(i=0;i<MAX_SIZE;i++)
    {
        list[i]=i; //각 배열의 원소의 값을 번호로 초기화
    }
        printf("=====================ITERATIVE=====================\n");
        printf("sizelist[i]  numtimes[i]  stop-start     total     duration     positon\n");
    for(i=0;i<ITERATIONS;i++
    {
        start=clock(); //start에 프로그램이 시작될 때부터 지난 틱수 저장
        for(j=0;j<numtimes[i];j++// j=0부터 numtimes[i] 미만까지 반복
        {
            position=binsearch_itr(list,sizelist[i]+1,0,sizelist[i]); //positon에 binseasrch_itr함수의 반환값 저장 최악의 경우로 없는 숫자를 찾는다.
                                                                    //예를들어 sizelist[2]면 searchnum은 0에서 10사이에서 11을 찾는 것이다. 리턴은 -1일 것이다.
        }
        stop=clock(); //stop에 프로그램이 시작될 때부터 지난 틱수 저장
        total=((double)(stop-start))/CLOCKS_PER_SEC; //CLOCKS_PER_SEC는 초당 클락수이다.1000으로 정의되어 있다. stop-start=사이의 클락수이므로 연산을 하면 시간(초)가 반환된다.
        duration=(total/numtimes[i]); //total을 numtimes[i]로 나눈 값
        printf("%11d %11d %11d %11f %11f %11d\n",sizelist[i],numtimes[i],(int)(stop-start),total,duration,position); //화면에 각각의 값을 11자리씩 출력
        list[sizelist[i]]=sizelist[i]; //reset value 라고 써있는데 왜 있는지 잘 모르겠다.
    }
    printf("=====================RECURSIVE=====================\n");
    printf("sizelist[i]  numtimes[i]  stop-start     total     duration     positon\n");
    for(i=0;i<ITERATIONS;i++)
    {
        start=clock();    //start에 프로그램이 시작될 때부터 지난 틱수 저장
        for(j=0;j<numtimes[i];j++)// j=0부터 numtimes[i] 미만까지 반복
        {
            position=binsearch_rec(list,sizelist[i]+1,0,sizelist[i]); //positon에 binseasrch_rec함수의 반환값 저장 최악의 경우로 없는 숫자를 찾는다.
                                                                    //예를들어 sizelist[2]면 searchnum은 0에서 10사이에서 11을 찾는 것이다. 리턴은 -1일 것이다.
        }
        stop=clock(); //stop에 프로그램이 시작될 때부터 지난 틱수 저장
        total=((double)(stop-start))/CLOCKS_PER_SEC; //CLOCKS_PER_SEC는 초당 클락수이다.1000으로 정의되어 있다. stop-start=사이의 클락수이므로 연산을 하면 시간(초)가 반환된다.
        duration=(total/numtimes[i]); //total을 numtimes[i]로 나눈 값
        printf("%11d %11d %11d %11f %11f %11d\n",sizelist[i],numtimes[i],(int)(stop-start),total,duration,position); //화면에 각각의 값을 11자리씩 출력
        list[sizelist[i]]=sizelist[i]; //reset value 라고 써있는데 왜 있는지 잘 모르겠다.
    }
    return 0;
}
int binsearch_itr(int list[], int searchnum, int left, int right)  //반복적으로 짠 이진탐색
{
    int middle; //int형 변수 middle 선언
    while(left<=right) //left가 right 이하일때 반복
    {middle=(left+right)/2;  //미들은 left와 right의 산술평균
    switch(COMPARE(list[middle],searchnum))  //COMPARE 의 값을 받아와 그에 따라 switch-case로 판단
    {
    case -1 : left=middle+1;  
                break;    //-1경우 left에 middle+1로 대입 후 break
    case 0 :    return middle;
                break//0경우 middle값 리턴 후 break
    case 1 : right=middle-1;
                break//1경우 right에 middle-1로 대입 후 break
    }
    }
    return -1//while 루프가 깨졌을 경우 반환값 -1
}
int binsearch_rec(int list[], int searchnum, int left, int right) //recursive function으로 짠 이진탐색
{
    int middle;//int형 변수 middle 선언
    while(left<=right)//left가 right 이하일때 반복 recursive function이라서 if 를 써도 무방하다.
    {middle=(left+right)/2;//미들은 left와 right의 산술평균
    switch(COMPARE(list[middle],searchnum)) //COMPARE 의 값을 받아와 그에 따라 switch-case로 판단
    {
    case -1 : return binsearch_rec(list,searchnum,middle+1,right);
                break//-1경우 binsearch_rec함수의 left자리에 middle+1, right 인자에 right 넣어 호출 후 break
    case 0 :    return middle; 
                break//0의 경우 middle값 리턴 후 break
    case 1 : return binsearch_rec(list,searchnum,left,middle-1);
                break//1경우 binsearch_rec함수의 left자리에 left, right 인자에 middle-1 넣어 호출 후 break
    }
    }
    return -1//while 루프가 깨졌을 경우 반환값 -1
}
 
 
cs


반응형

'컴퓨터 & 프로그래밍 & 전자공학 > Data Sturcture' 카테고리의 다른 글

dfs, bfs, prim, kruskal  (0) 2017.10.01
preorder, postorder, inorder, heap, tree  (0) 2017.10.01
stack, queue  (0) 2017.10.01
참고 사항  (0) 2017.10.01
Array, Pointer  (0) 2017.10.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
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 40
typedef struct NODE{
    char name[SIZE];
    int year;
    struct NODE *link;
}NODE;
int menu();
void add(NODE **list, NODE **prev);
void printing(NODE **list);
void exit1(NODE **list,NODE **next);
int main(void)
{
    int cho=0;
    NODE *list=NULL;
    NODE *p,*next,*prev;
    while((cho=menu())!=3){
    getchar();
    if(cho==1)
    {
        add(&list,&prev);
    }
    else if(cho==2)
    {
        printing(&list);
    }
    else if(cho==3)
    {
        exit1(&list,&next);
    break;
    }
    }
    return 0;
}
int menu()
{
    int men=0;
    printf("----------------------\n");
    printf("1. 영화 정보 추가\n");
    printf("2. 영화 정보 출력\n");
    printf("3. 종료\n");
    printf("----------------------\n");
    printf("번호를 선택하세요: ");
    scanf("%d",&men);
    return men;
}
void add(NODE **list, NODE **prev)
{
    NODE *p=NULL;
    p=(NODE*)malloc(sizeof(NODE));
        printf("영화의 제목을 입력하세요: ");
        gets(p->name);
        printf("영화의 개봉 연도를 입력하세요: ");
        scanf("%d",&(p->year));
        if(*list==NULL)
        {*list=p;}
        else
        {(*prev)->link=p;}
            p->link=NULL;
            *prev=p;
}
void printing(NODE **list)
{
    NODE *p=NULL;
    p=*list;
    while(p!=NULL)
    {
        printf("제목: %s\n",p->name);
        printf("년도: %d\n",p->year);
        p=p->link;
    }
}
void exit1(NODE **list,NODE **next)
{
    NODE *p=NULL;
    p=*list;
    while(p!=NULL)
    {
        *next=p->link;
        free(p);
        p=*next;
    }
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

전화 번호부 작성  (2) 2017.02.25
양의 정수 저장  (0) 2017.02.22
단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
반응형

전화 번호부를 연결 리스트를 이용하여 만들어보자. 사용자가 전화 번호를 입력하면 연결리스트의 끝에 추가한다. 탐색 기능도 추가하라.


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
107
108
109
110
111
112
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 30
typedef struct NODE {
    char name[SIZE];
    char num[SIZE];
    struct NODE *link;
}NODE;
int menu();
void initialize(NODE **list, NODE **next);
void add(NODE **list, NODE **prev);
void search(NODE **next, NODE **list);
void exit1(NODE **next, NODE **list);
int main(void)
{
    NODE *list = NULL;
    NODE *prev, *next;
    int men = 0;
    prev = NULL; next = NULL;
    while ((men = menu()) != 4)
    {
        getchar();
        if (men == 1)
        {
            initialize(&list, &next);
        }
        else if (men == 2)
        {
            add(&list, &prev);
        }
        else if (men == 3)
        {
            search(&next, &list);
        }
    }
    exit1(&next, &list);
    return 0;
}
int menu()
{
    int a = 0;
    printf("연결 리스트를 이용한 전화 번호부 메뉴\n");
    printf("-------------------------\n");
    printf("1. 초기화\n");
    printf("2. 전화 번호 추가\n");
    printf("3. 전화 번호 탐색\n");
    printf("4. 종료\n");
    printf("-------------------------\n");
    scanf("%d"&a);
    return a;
}
void initialize(NODE **list, NODE **next)
{
    NODE *p;
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        free(p);
        p = *next;
    }
    printf("초기화가 완료되었습니다.\n");
}
void add(NODE **list, NODE **prev)
{
    NODE *p;
    p = (NODE*)malloc(sizeof(NODE));
    printf("이름: ");
    gets(p->name);
    printf("번호: ");
    gets(p->num);
    if (*list == NULL)
    {
        *list = p;
    }
    else
    {
        (*prev)->link = p;
    }
    p->link = NULL;
    *prev = p;
}
void search(NODE **next, NODE **list)
{
    NODE *p;
    char nam[SIZE];
    printf("찾을 이름: ");
    gets(nam);
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        if (strcmp(p->name, nam) == 0)
        {
            printf("전화 번호는 %s입니다.\n", p->num);
            break;
        }
        p = *next;
    }
}
void exit1(NODE **next, NODE **list)
{
    NODE *p;
    p = *list;
    while (p != NULL)
    {
        *next = p->link;
        free(p);
        p = *next;
    }
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

영화 목록 만들기  (2) 2017.02.25
양의 정수 저장  (0) 2017.02.22
단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
반응형

소규모의 데이터베이스 프로그램 작성, 자기가 소유하고 있는 도서를 관리하는 프로그램을 작성하여 보자. 다음과 같은 메뉴 화면을 가진다.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef struct BOOK {
    char name[SIZE];
    char author[SIZE];
    char company[SIZE];
} book;
int menu(void);
void add(FILE *fp);
void find(FILE *fp);
int main(void)
{
    int num = 0;
    FILE *fp = NULL;
    if ((fp=fopen("booklist.bin","a+"))==NULL)
    {
        printf("파일오픈실패\n");
        exit(1);
    }
    while (1)
    {
        num = menu();
        if (num == 1)
            add(fp);
        else if (num == 2)
            find(fp);
        else
            break;
    }
    fclose(fp);
    return 0;
}
int menu(void)
{
    int i = 0;
    printf("메뉴\n");
    printf("1. 추가\n");
    printf("2. 탐색\n");
    printf("3. 종료\n");
    printf("번호를 입력하세요: ");
    scanf("%d"&i);
    getchar();
    return i;
}
void add(FILE *fp)
    book a;
    printf("도서의 이름: ");
    gets(a.name);
    printf("저자: ");
    gets(a.author);
    printf("출판사명: ");
    gets(a.company);
    fseek(fp, 0, SEEK_END);
    fwrite(&a, sizeof(book), 1, fp);
}
void find(FILE *fp)
{
    char arr[SIZE];
    book find;
    printf("도서의 이름을 입력하세요: ");
    gets(arr);
    fseek(fp, 0, SEEK_SET);
    while (!feof(fp))
    {
        fread(&find, sizeof(book), 1, fp);
        if (strcmp(find.name,arr)==0)
        {
            printf("저자: %s\n",find.author);
            printf("출판사명: %s\n",find.company);
            break;
        }
    }
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

특정 단어 찾기  (0) 2017.02.18
텍스트 파일과 이진 파일  (0) 2017.02.17
줄 번호 붙이기  (0) 2017.02.17
사용자 입력 텍스트 파일 저장  (0) 2017.02.13
인쇄 가능 문자 수 세기  (0) 2017.02.13
반응형

두 개의 텍스트 파일을 서로 비교하는 프로그램을 작성하여 보자. 파일의 이름은 사용자에게 입력받는다. 만약 두개의 파일이 일치하면 "파일은 서로 일치함"을 출력하며 일치하지 않으면 일치하지 않는 첫 번째 문장을 다음과 같이 출력한다.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
    FILE *fp1;
    FILE *fp2;
    char a[SIZE];
    char b[SIZE];
    char f1[SIZE];
    char f2[SIZE];
    int bytes=0;
    printf("첫번째 파일 이름: ");
    gets(a);
    printf("두번째 파일 이름: ");
    gets(b);
    if((fp1=fopen(a,"r"))==NULL)
    {
        fprintf(stderr,"파일 열기 오류1\n");
        exit(1);
    }
    if((fp2=fopen(b,"r"))==NULL)
    {
        fprintf(stderr,"파일 열기 오류2\n");
        exit(1);
    }
    while(1)
    {
    fgets(f1,sizeof(f1),fp1); //fgets는 \n(개행문자) 나올 때까지 문자열을 받음 
    fgets(f2,sizeof(f2),fp2);
    if(strcmp(f1,f2)!=0// f1이 크면 양, f2가 크면 음, 같으면 0
    {
        printf("<< %s\n", f1);
        printf(">> %s\n", f2);
        break;
    }
    if(feof(fp1)!=0// 파일의 끝이면 not0, 끝이 아니면 0
    {
    printf("파일은 서로 일치함\n");
    break;
    }
    }
    return 0;
}
cs

만약 일치하지 않는 모든 문장을 나타내고 싶으면 strcmp 가 들어간 if 문에서 break; 만 빼주면 될 것이다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

인쇄 가능 문자 수 세기  (0) 2017.02.13
성적 평균 구하기  (0) 2017.02.12
fgets 함수  (0) 2017.02.11
파일 복사  (0) 2017.01.31
대문자로 변경  (0) 2017.01.31
반응형

하나의 파일을 다른 이름의 파일로 복사하는 프로그램을 작성하라. 이진 파일이라고 가정하고 fread()와 fwrite()를 사용한다.


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>
#define SIZE 100
int main(void)
{
    FILE *fpr=NULL;
    FILE *fpw=NULL;
    char buff[SIZE];
    int count=0;
    if((fpr=fopen("first.bin","rb"))==NULL)
    {
        printf("잘못된 파일 열기1\n");
        exit(1);
    }
    if((fpw=fopen("second.bin","wb"))==NULL)
    {
        printf("잘못된 파일 열기2\n");
        exit(1);
    }
    while((count=(fread(buff,sizeof(char),SIZE,fpr)))!=0)
    {
        printf("%d",count); //몇 개 세었는지 보려고
    fwrite(buff,sizeof(char),count,fpw);
    }
    return 0;    
}
cs

buff 와 fread 나 fwrite 를 쓸 때 덩어리의 크기를 int로 하면 오류가 생길 수 있습니다. 중간에 잘리는 경우(예를들어 09에서 0과 9사이에서 잘리는 경우)

데이터가 손실되는 것을 경험하였습니다. 따라서 1byte 단위인 char로 하는 것이 가장 안전합니다. (촘촘이 자르는 것이 가장 안전하겠죠??)

예를들어 int 형으로 한다면

1000100 을 복사하면 앞의 1000만 복사가 됩니다. 뒤에 100은 덩어리 (4byte) 가 꽉 안차서 손실이 되는 것 같아요 (정확한 것 아님 결과로부터 추론한 것임 (출력값은 1이됨)

정확한 것을 아시는 분은 댓글로 달아주세요)

그런데 10001000 을 하면  10001000 이 복사되고 출력값은 2가됩니다. 따라서 덩어리를 다 채워줘야 하는 것 같습니다.






반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11
대문자로 변경  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
반응형

텍스트 파일을 열어서 파일 안에 들어 있는 문자들을 모두 대문자로 변경하는 프로그램을 작성한다.


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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
 
int main(void)
{
    FILE *fp=NULL;
    char a[SIZE];
    int i;
    if((fp=fopen("1.txt","r+"))==NULL)
    {
        printf("잘못된 파일 열기\n");
        exit(1);
    }
    fgets(a,SIZE,fp);
    printf("입력 파일 : ");
    for(i=0;a[i]!=NULL;i++)
    {
        printf("%c ", a[i]);
    }
    printf("\n");
    fseek(fp,0,SEEK_SET);
    for(i=0;a[i]!=NULL;i++)
    {
        a[i]=toupper(a[i]);
    }
    fputs(a,fp);
    fseek(fp,0,SEEK_SET);
    fgets(a,SIZE,fp);
    printf("출력 파일 : ");
    for(i=0;a[i]!=NULL;i++)
    {
        printf("%c ", a[i]);
    }
    printf("\n");
    return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

fgets 함수  (0) 2017.02.11
파일 복사  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
대소문자 변경  (0) 2017.01.16
반응형

두개의 텍스트 파일을 비교하여 같은지 다른지를 알려주는 프로그램을 작성하라.


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
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
#define DEBUG 0
void open_file(FILE **fp1, FILE **fp2);
void check(FILE *fp1, FILE *fp2);
int main(void)
{
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    int quit=0;
    while(1)
    {
    open_file(&fp1,&fp2);
    check(fp1,fp2);
    fseek(fp1,0,SEEK_SET);
    fseek(fp2,0,SEEK_SET);
    printf("종료하려면 9999 계속하려면 1\n");
    scanf("%d",&quit);
    if(quit==9999)
        break;
    getchar();
    }
    return 0;
}
void open_file(FILE **fp1, FILE **fp2)
{
    char name1[SIZE];
    char name2[SIZE];
    printf("첫번째 파일 이름: ");
    gets(name1);
    printf("두번째 파일 이름: ");
    gets(name2);
    if((*fp1=fopen(name1,"r"))==NULL)
    {
        printf("파일오픈불가능1\n");
        exit(1);
    }
    if((*fp2=fopen(name2,"r"))==NULL)
    {
        printf("파일오픈불가능2\n");
        exit(1);
    }
}
void check(FILE *fp1, FILE *fp2)
{
    char a,b;
    while(1)
    {
        a=fgetc(fp1);
        b=fgetc(fp2);
        #if DEBUG==1
        printf("%d %d\n", a,b);
        #endif
        if((feof(fp1)!=0&&feof(fp2)==0)||(feof(fp1)==0&&feof(fp2)!=0))
        {
            printf("두 파일은 서로 다릅니다(길이다름).\n");
            break;
        }
        if(a!=b)
        {
            printf("두 파일은 서로 다릅니다(글자다름).\n");
            break;
        }
        if(feof(fp1)!=0&&feof(fp2)!=0)
        {
            printf("두 파일은 서로 같습니다.\n");
            break;
        }
    }
}
cs



먼저 이중포인터를 사용한 이유는 fp1, fp2 자체가 파일을 가리키는 포인터죠. 따라서 처음에 초기값으로

NULL을 가리키고 있으니까 포인터가 가리키는 주소를 바꿔주려면 이중포인터를 사용해야해서 그렇습니다.

두번째로 중요한 것은 check 함수인데요. 여기서 '글자다름' 파트를 '길이다름' 파트보다 먼저 쓰게되면

무조건 다른 것이 글자다름으로 나오게 됩니다. 왜냐하면 텍스트 파일에서 EOF(파일의 끝)은 -1 값을

반환하게 되는데요 이것을 비교했을 때 글자다름을 먼저 수행하게 되면 무조건 -1과는 다른 값이 되므로

(길이가 다르기 때문에 다른 한쪽은 문자일 것이므로 어떠한 정수값을 가질 것임) 글자다름

으로 출력이 됩니다. 따라서 길이다름을 먼저 해주어야 길이가 다를 때는 길이다름으로 출력을 할 수 있습니다.

이것은 눈으로 확인할 수 있게 #if 로 표시를 해놓았습니다. 눈으로 확인하고 싶으시면 DEBUG 값을 1로 바꾸세요.

아래 스크린샷에도 추가해 놓았습니다.

파일 실행하기전 txt 파일로 아래와 같이 생성한 후에 시작해야합니다. (r타입으로 읽기 때문에)



이와같이 텍스트 파일에서는 파일의 끝이 -1로 표현되기 때문에 꼭 길이다름을 먼저 판별해 주어야 한다.

아니면 무조건 글자다름으로만 나온다. (길이가 다를 경우 -1은 무조건 다른 파일의 남은 글자와 다를테니까)




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

파일 복사  (0) 2017.01.31
대문자로 변경  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
대소문자 변경  (0) 2017.01.16
정수 비트 이동  (0) 2017.01.16
반응형

암호화 방법 중의 하나는 암호화할 값을 키값과 비트 XOR 연산을 하는 것이다. 원래의 값을 복원하려면 다시 비트 XOR 연산을 하면 된다. 이 암호화 방법을 사용하여 사용자로부터 문자열을 입력받아서 암호화하고 다시 복호화하는 프로그램을 작성하라. 다중 소스 파일 형태로 작성하라.


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
#include <stdio.h>
void print(char a[]);
int main(void)
{
    char s[50];
    int key=17;
    int i=0;
printf("문자열을 입력하세요: ");
gets(s);
print(s);
for(i=0;s[i]!='\0';i++)
{
    s[i]=s[i]^key;
}
printf("    ");
print(s);
printf("로 엔코딩됨.\n");
print(s);
for(i=0;s[i]!='\0';i++)
{
    s[i]=s[i]^key;
}
printf("    ");
print(s);
printf("로 디코딩됨.\n");
return 0;
}
void print(char a[])
{
    int i=0;
    for(i=0;a[i]!='\0';i++)
    {
        printf("%c", a[i]);
    }
}
cs


만약 키가 32 (100000) 이면 공백 이후 문자가 출력이 안되는데요 그 이유는 공백의 아스키 코드가 32(100000) 인데,

i am a boy 에서 i 이후 나오는 공백과 xor 연산을 하게 되는 것을 볼 수 있습니다. 그런데

같은 수를 XOR연산하면 무조건 000000 이나오고 이것의 아스키코드는 널문자(\0) 입니다. 따라서 조건문이 종료되버립니다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

대문자로 변경  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
대소문자 변경  (0) 2017.01.16
정수 비트 이동  (0) 2017.01.16
2진수 출력  (0) 2017.01.16
반응형

사용자로부터 입력받은 정수를 비트 이동시키는 프로그램을 작성하여 보자. 먼저 정수 변수의 값을 입력받은 후에 이동시킬 방향, 이동할 거리를 사용자로부터 입력받는다. 비트 이동 전후에 정수의 값을 비트로 출력하도록 한다. 앞 문제에서 작성한 display_bit() 함수를 사용한다.


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
#include <stdio.h>
#define GET_BIT(n,pos) ((n)>>(pos)&0x01)
void display_bit(int value);
int main(void)
{
    int val, move, dist, nval;
    val=0;move=0;dist=0;nval=0;
    while(1)
    {
    printf("정수값을 입력하세요(종료 9999): ");
    scanf("%d"&val);
    if(val==9999)
        break;
    printf("왼쪽 이동은 0, 오른쪽 이동은 1을 입력하세요: ");
    scanf("%d"&move);
    printf("이동시킬 거리: ");
    scanf("%d"&dist);
    printf("이동 전: ");
    display_bit(val);
    if(move==0)
    {
        nval=(val<<dist);
        printf("이동 후: ");
        display_bit(nval);
    }
    else if(move==1)
    {
        nval=(val>>dist);
        printf("이동 후: ");
        display_bit(nval);
    }}
    return 0;
}
void display_bit(int value)
{
    int i,count;
    count=0;
    for(i=31;i>=0;i--)
    {
        if(count==4)
            {printf(" ");
        count=0;}
        if(GET_BIT(value,i))
            printf("1");
        else
            printf("0");
        count++;
    }
    printf("\n");
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

암호화와 복호화  (0) 2017.01.16
대소문자 변경  (0) 2017.01.16
2진수 출력  (0) 2017.01.16
비트 매크로  (0) 2017.01.15
공백 세기  (0) 2017.01.14
반응형

정수값을 받아서 2진수 형태로 출력하는 함수 display_bit(int value) 를 작성하여 보자. 6번에서 정의한 함수 매크로 GET_BIT(n, pos)를 이용한다.


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
#include <stdio.h>
#define GET_BIT(n,pos) ((n)>>(pos)&0x01)
void display_bit(int value);
int main(void)
{
    int num=0;
    printf("정수값을 입력하세요: ");
    scanf("%d"&num);
    display_bit(num);
    return 0;
}
void display_bit(int value)
{
    int i,count;
    count=0;
    for(i=31;i>=0;i--)
    {
        if(count==4)
            {printf(" ");
        count=0;}
        if(GET_BIT(value,i))
            printf("1");
        else
            printf("0");
        count++;
    }
    printf("\n");
}
cs





반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

대소문자 변경  (0) 2017.01.16
정수 비트 이동  (0) 2017.01.16
비트 매크로  (0) 2017.01.15
공백 세기  (0) 2017.01.14
원기둥의 부피  (0) 2017.01.14
반응형

비트를 조작하는 다음의 매크로를 작성하고 동작을 확인하라.

(a) SET_BIT(n, pos) : 변수 n 안에 있는 pos번째 비트를 1로 설정한다. 

(b) CLR_BIT(n, pos) :  변수 n 안에 있는 pos번째 비트를 0으로 설정한다.

(c) GET_BIT(n, pos) :  변수 n 안에 있는 pos번째 비트를 0으로 반환한다.


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>
#define SET_BIT(n,pos) ((n)|=(0x01<<(pos))) //변수 n pos번째 비트
#define CLR_BIT(n,pos) ((n)&=~(0x01<<(pos)))
#define GET_BIT(n,pos) ((n)>>(pos)&0x00//무조건 0으로 반환이니까
 
int main(void)
{
    int n,c,pos;
    n=0;c=0;pos=0;
    while(1){
    printf("정수를 입력하세요: ");
    scanf("%d"&n);
    printf("%016x\n", n);
    printf("1: pos번째 비트 1로 설정 2: pos번째 비트 0으로 설정\n 3: pos번째 비트 0으로 반환 4:종료\n");
    printf("번호를 입력하세요 : ");
    scanf("%d"&c);
    if(c==1)
    {
        printf("몇번째 비트? ");
        scanf("%d"&pos);
        SET_BIT(n,pos);
        printf("%016x\n", n);
    }
    else if(c==2)
    {
        printf("몇번째 비트? ");
        scanf("%d"&pos);
        CLR_BIT(n,pos);
        printf("%016x\n", n);
    }
    else if(c==3)
    {
        printf("몇번째 비트? ");
        scanf("%d"&pos);
        printf("%016x\n", GET_BIT(n,pos));
    }
    else if(c==4)
        break;
    }
    return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

정수 비트 이동  (0) 2017.01.16
2진수 출력  (0) 2017.01.16
공백 세기  (0) 2017.01.14
원기둥의 부피  (0) 2017.01.14
배열 원소 일괄 초기화  (0) 2017.01.14
반응형

c가 공백 문자(탭, 스페이스, 줄바꿈 문자)이면 참이 되는 매크로 IS_SPACE(c)를 정의하여서 사용자가 입력한 문자열 중에서 공백 문자의 개수를 출력하여 보자.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#define SIZE 50
#define IS_SPACE(c) {int i;int count=0;for(i=0;i<SIZE;i++){if((c[i]==' ')||(c[i]=='\t')||(c[i]=='\n')){count++;}}\
                    printf("공백 문자의 개수는 %d개입니다.\n", count);}
int main(void)
{
char c[SIZE];
printf("문자열을 입력하세요:");
gets(c);
IS_SPACE(c);
return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

2진수 출력  (0) 2017.01.16
비트 매크로  (0) 2017.01.15
원기둥의 부피  (0) 2017.01.14
배열 원소 일괄 초기화  (0) 2017.01.14
3개 정수 비교  (0) 2017.01.14
반응형

배열 원소의 값을 모두 지정된 값으로 초기화하는 ARRAY_INIT(array, size, value)를 작성하여 테스트하여 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define ARRAY_INIT(array,size,value) {int i;for(i=0;i<size;i++){*(array+i)=value;}}
#define SIZE 10
#include <stdio.h>
int main(void)
{
    int a[SIZE];
    int s=0;
    int i;
    printf("값을 입력하세요 : ");
    scanf("%d"&s);
    ARRAY_INIT(a,SIZE,s);
    for(i=0;i<SIZE;i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

공백 세기  (0) 2017.01.14
원기둥의 부피  (0) 2017.01.14
3개 정수 비교  (0) 2017.01.14
소스에 대한 질문 답하기  (0) 2017.01.13
생명 게임(game of life - John H. Conway)  (0) 2017.01.13
반응형

다음 소스에 대한 질문에 답하라.


1
2
3
4
5
6
7
8
9
10
11
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
        printf("result=%f\n", result);
        result*=x;
    }
    return result;
}
cs

(a)전처리기 지시자 #ifdef를 사용하여 DEBUG가 정의되어 있는 경우에만 화면 출력이 나오도록 하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define DEBUG  
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
#ifdef DEBUG // #if defined(DEBUG)
        printf("result=%f\n", result);
#endif
        result*=x;
    }
    return result;
}
cs

(b)#if를 사용하여 DEBUG가 2일 경우에만 화면 출력이 나오도로 수정하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define DEBUG 2
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
#if (DEBUG ==2)
        printf("result=%f\n", result);
#endif
        result*=x;
    }
    return result;
}
cs
(c)#if를 사용하여 DEBUG가 2이고 LEVEL이 3인 경우에만 화면 출력이 나오도록 수정하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define DEBUG 2
#define LEVEL 3
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
#if ((DEBUG ==2)&&(LEVEL==3))
        printf("result=%f\n", result);
#endif
        result*=x;
    }
    return result;
}
cs
(d)문장 1을 수정하여 소스파일에서 현재의 행 번호가 함께 출력되도록 하라.

1
2
3
4
5
6
7
8
9
10
11
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
        printf("result=%f line number=%d\n", result,__LINE__);  //1
        result*=x;
    }
    return result;
}
cs
(e)POWER_TYPE이라는 매크로를 정의하여 POWER_TYPE이 0이면 결과값을 int형으로 반환하도록 하고 POWER_TYPE이 1이면 결과값을 double형으로 
반환하도록 하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define POWER_TYPE 1
 
double power(int x, int y)
{
    int i;
#if(POWER_TYPE==0)
    int result=1;
    for(i=0;i<y;i++)
    {
        printf("result=%d\n", result);
        result*=x;
    }
#elif(POWER_TYPE==1)
    double result=1.0;
    for(i=0;i<y;i++)
    {
        printf("result=%f\n", result);
        result*=x;
    }
#endif
    return result;
}
 
cs


(f)#if를 이용하여 문장 1을 주석처리하여 보라.


1
2
3
4
5
6
7
8
9
10
11
12
13
double power(int x, int y)
{
    double result=1.0;
    int i;
    for(i=0;i<y;i++)
    {
#if 0
        printf("result=%f\n", result);
#endif
        result*=x;
    }
    return result;
}
cs


반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

배열 원소 일괄 초기화  (0) 2017.01.14
3개 정수 비교  (0) 2017.01.14
생명 게임(game of life - John H. Conway)  (0) 2017.01.13
2차원 배열 복사  (0) 2017.01.06
디지털 영상  (0) 2017.01.06
반응형

생명 게임(game of life)라고 불리는 인구 증가 게임을 구현하여 보자. John H. Conway에 의해 발명된 생명 게임은 출생과 생존, 죽음의 모델을 가정한다. 이 게임은 가로와 세로로 20개씩의 셀을 갖는 보드 위에서 게임을 한다. 각 셀은 비어 있거나, 생명체를 나타내는 0 값을 가질 수 있다. 각 셀은 8개의 이웃을 갖는다. 생명체의 다음 세대는 다음 규칙에 따라 결정된다.

(a)출생-3개의 이웃에 사람이 살면 현재의 위치에서 사람이 탄생한다.

(b)죽음-4개 이상의 이웃에 사람이 살면 과밀로 인해 죽게 된다. 둘 보다 적은 이웃에만 사람이 살면 외로움으로 죽게 된다.

(c)생존-둘 또는 셋의 이웃에 사람이 살면 현 위치의 사람은 다음 세대까지 생존하게 된다. 예를 들어서 다음 그림은 하나의 세대에서 다음 세대로 

진행되는 모습을 보여 준다.


나는 생존을 1, 죽음을 0으로 표현 하였고 죽음과 생존을 한가지 함수로 표현하였다. 그리고 순서대로 함수가 진행 되는데 전게 바뀌면 다음 값의 결과가 바뀌어 버리니까 또다른 크기의 빈 배열을 만들어 그곳에다가 값들을 넣고 마지막에 한꺼번에 복사하였다.


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
107
108
#include <stdio.h>
#define SIZE 20
void printing(int a[][SIZE]);
void copy1(int ori[][SIZE],int cpy[][SIZE]);
void birth(int ori[][SIZE],int cpy[][SIZE]);
void death(int ori[][SIZE],int cpy[][SIZE]);
int main(void)
{        int ori[SIZE][SIZE]={
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
        int copy[SIZE][SIZE]={0,};
    int check=0;
    while(1){check=0;
    printf("계속하려면 1 종료하려면 2\n");
    printing(ori);
    birth(ori,copy);
    death(ori,copy);
    copy1(ori,copy);
    scanf("%d"&check);
    if(check==2)
        break;}
    return 0;}
void birth(int ori[][SIZE],int cpy[][SIZE])
{    int count=0;
    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp){
    if(*(p-SIZE-1)==1)
        count++;
    if(*(p-SIZE)==1)
        count++;
    if(*(p-SIZE+1)==1)
        count++;
    if(*(p+1)==1)
        count++;
    if(*(p-1)==1)
        count++;
    if(*(p+SIZE-1)==1)
        count++;
    if(*(p+SIZE)==1)
        count++;
    if(*(p+SIZE+1)==1)
        count++;
    if(*p==0&&count==3)
        *cp=1;
    count=0;
    p++;cp++;
    }}
void printing(int a[][SIZE])
{    int i,j;
    for(i=0;i<SIZE;i++)
    {for(j=0;j<SIZE;j++)
    {printf("%d ", a[i][j]);}
    printf("\n");}}
void copy1(int ori[][SIZE],int cpy[][SIZE])
{    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp)
    {*p=*cp;
    p++;cp++;}}
void death(int ori[][SIZE],int cpy[][SIZE])
{    int count=0;
    int *p= &ori[0][0];
    int *endp= &ori[SIZE-1][SIZE-1];
    int *cp=&cpy[0][0];
    while(p<=endp){
    if(*(p-SIZE-1)==1)
        count++;
    if(*(p-SIZE)==1)
        count++;
    if(*(p-SIZE+1)==1)
        count++;
    if(*(p+1)==1)
        count++;
    if(*(p-1)==1)
        count++;
    if(*(p+SIZE-1)==1)
        count++;
    if(*(p+SIZE)==1)
        count++;
    if(*(p+SIZE+1)==1)
        count++;
    if(*p==1&&((count>=4)||(count<2)))
        *cp=0;
    else if(*p==1&&(count==2||count==3))
        *cp=1;
    count=0;
    p++;cp++;}}
cs



이 게임의 패턴은 아래 사이트에서 확인할 수 있다. 여러가지를 넣어서 확인하여 보자.


https://namu.wiki/w/%EC%BD%98%EC%9B%A8%EC%9D%B4%EC%9D%98%20%EC%83%9D%EB%AA%85%20%EA%B2%8C%EC%9E%84


하는데 4일이나 걸렸네요.. 또다른 배열에 복사한다는 것을 생각을 못해서.. 후련합니다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

3개 정수 비교  (0) 2017.01.14
소스에 대한 질문 답하기  (0) 2017.01.13
2차원 배열 복사  (0) 2017.01.06
디지털 영상  (0) 2017.01.06
학생 성적 평균 구하기  (0) 2017.01.06
반응형

int 형 배열과 int 형 포인터를 받아서 포인터가 배열의 가장 큰 값을 가리키게 하는 함수 set_max_ptr()을 구현하고 테스트하여 보자.


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>
#define SIZE 10
void set_max_ptr(int m[], int size, int **pmax);
int main(void)
{
    int a[SIZE]={1,2,3,5,5,6,11,20,9,10};
    int *p=NULL; //가장 큰 수를 가리킬 포인터 p
    int i,max;
    for(i=0;i<SIZE;i++)
    {printf("%d번째 수 : %d\n",i,a[i]);}
    set_max_ptr(a,SIZE,&p);  //p가 포인터니까 p의 주소 &p는 이중포인터
    printf("가장 큰 수 : %d\n",*p);
    return 0;
}
void set_max_ptr(int m[], int size, int **pmax)
{
    int i;
    int max=0;
    for(i=0;i<size;i++)
    {
        if(max<m[i])
            {max=m[i];}
    }
    *pmax=&max; //이제 포인터 *pmax는 max를 가리킨다.
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

학생 성적 평균 구하기  (0) 2017.01.06
내림차순 정렬  (0) 2017.01.06
문자열의 배열 출력  (0) 2017.01.05
2차원 배열 합  (0) 2017.01.04
속담 선택기  (0) 2017.01.04
반응형
문자열의 배열을 인수로 받아서 저장된 문자열을 전부 출력하는 pr_str_array() 함수를 작성하여 테스트하여 보자. pr_str_array()는 다음과 같은 원형을 가진다.
void pr_str_array(char **dp, int n);


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>
#define SIZE 10
void pr_str_array(char **dp, int n);
int main(void)
{
    char *p[SIZE]={"넌 알 필요 없다!",
    "알 필요 없다고?",
    "하이구래! 하이구래!",
    "타즈딩고!",
    "둠 해머를 위하여!",
    "감사합니다!",
    "이게 아닌데..",
    "네 영혼에..",
    "용족들은 예의가 없단 말이야~",
    "바람이여~"};
    pr_str_array(p,SIZE);
    return 0;
}
void pr_str_array(char **dp, int n)
{
    char i;
    for(i=0;i<n;i++)
    {
    printf("%d번째 문자열 : %s\n",i,*(dp+i)); //포인터배열의 이름에서 크기만큼 증가시켜야함
    }
}



char *p[10] 이라고 선언을 했다면 각각의 배열 p[0]부터 p[9]는 포인터겠죠. 그렇기 때문에 배열의 이름 p가 이중포인터가 됩니다.

그래서 그 이중포인터인 배열의 이름 p에서 크기만큼 더해주면 모든 배열 포인터 (문자열의 배열)을 출력할 수가 있을 것입니다.

반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

내림차순 정렬  (0) 2017.01.06
가장 큰 값  (0) 2017.01.05
2차원 배열 합  (0) 2017.01.04
속담 선택기  (0) 2017.01.04
데이터베이스  (0) 2017.01.03
반응형

2차원 배열에 정수가 저장되어 있다고 가정한다. 우리가 가지고 있는 단 하나의 함수는 1차원 배열에 저장된 정수의 합을 구하는 int get_sum(int array[], int size)라고 가정하자. 2차원 배열의 각 행에 대하여 get_sum()을 호출하여서 각 행의 합을 구한 후에 이것들을 모두 합쳐서 전체 2차원 배열에 저장된 정수들의 합을 구하는 프로그램을 작성하여 보자.

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>
#define ROW 3
#define COL 6
int get_sum(int array[], int size);
int main(void)
{
    int a[ROW][COL]={{10,10,10,10,10,10},{10,10,10,10,10,10},{10,10,10,10,10,10}};
    int sigma=0;
    int sum[ROW]={0,0,0};
    int i;
    for(i=0;i<ROW;i++)
    {sum[i]=get_sum(a[i],COL);
    sigma+=sum[i];
    printf("%d행의 합 : %d\n", i, sum[i]);}
    printf("전체 합 : %d\n", sigma);
    return 0;
}
int get_sum(int array[], int size)
{
    int *p;
    int *endp;
    int sum=0;
    p=&array[0];
    endp=&array[size-1];
    while(p<=endp)
        {sum+=*p++;}
    return sum;
}
 
cs





반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

가장 큰 값  (0) 2017.01.05
문자열의 배열 출력  (0) 2017.01.05
속담 선택기  (0) 2017.01.04
데이터베이스  (0) 2017.01.03
삼각형, 사각형, 원  (0) 2017.01.02
반응형

10개 정도의 속담을 문자열의 형태로 함수 set_proverb() 내부에 저장하고 있다가 사용자가 set_proverb()을 호출하면 인수로 받은 이중 포인터를 이용하여 외부에 있는 char형 포인터 s를 설정하는 set_proverb()을 작성하고 테스트하라.


저는 너무 어렵게 느껴지는 이중포인터네요.. 여러번 읽어보니까 우리가 어떤 변수를 함수를 통해 원본을 바꾸려고 할 때 포인터를 쓰는 것처럼,

포인터를 함수를 통해 바꿔주기 위하여 포인터의 포인터를 사용하는 것이 이중 포인터 같은데.. (제 생각임)

굉장히 헷갈리네요!! 여기서는 포인터가 문자열처럼 쓰였네요 아래 array는 포인터배열이네요

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
#include <stdio.h>
void set_proverb(char **q, int n);
                //포인터 p를 가리킬 이중포인터 q
int main(void)
{    
    char *p;  //포인터 p가 배열처럼 사용될 예정임
    int i=0;
    printf("몇 번째 속담을 선택하시겠습니까?(0~9)");
    scanf("%d"&i);
    set_proverb(&p,i);
    printf("%s \n", p);
    return 0;
}
void set_proverb(char **q, int n)
{
    static char *array[10]=
    {"낮말은 새가 듣고 밤말은 쥐가 듣는다.",
    "베지밀 아몬드와 호두우유",
    "두루마리 휴지",
    "파도무늬를 가진 텁",
    "끼얏-호!",
    "어처구니가 없구만",
    "메이플스토리~메이플스토리~",
    "앗잇읏헥!",
    "소환사의 협곡에 오신 것을 환영해요",
    "어써오쎄요~"};
        *q= array[n]; //*q=p가 된다. 즉 p에 array[n]이 대입된다.(array[n]도 포인터이자 배열)
}
cs



반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

문자열의 배열 출력  (0) 2017.01.05
2차원 배열 합  (0) 2017.01.04
데이터베이스  (0) 2017.01.03
삼각형, 사각형, 원  (0) 2017.01.02
포커 카드 배열  (0) 2016.12.28

+ Recent posts