반응형

Oval 클래스는 주어진 사각형에 내접하는 타원을 추상화한 클래스이다. Oval 클래스의 멤버는 모두 다음과같다. Oval 클래스를 선언부와 구현부로 나누어 작성하라. 

1. 정수값의 사각형 너비와 높이를 가지는 width, height 변수 멤버 

2. 너비와 높이 값이 매개 변수로 받는 생성자 

3. 너비와 높이를 1로 촉기화하는 매개 변수 없는 생성자 

4. Width와 height를 출력하는 소멸자 

5. 타원의 너비를 리턴하는 getWidth() 함수멤버 

6. 타원의 높이를 리턴하는 getHeight() 함수멤버

7. 타원의 너비와 높이를 변경하는 set(int w,int h) 함수멤버

8. 타원의 너비와 높이를 화면에 출력하는 show()함수 멤버


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
#include <iostream>
 
using namespace std;
 
class Oval {
private:
    int width;
    int height;
public:
    Oval(int a, int b) {
        width = a;
        height = b;
    }
    Oval() {
        width = 1;
        height = 1;
    }
    ~Oval() {
        cout <<"Oval 소멸 "<< "width : " << width << " " << "height : " << height << endl;
    }
    int getWidth() {
        return width;
    }
    int getHeight() {  //클래스 선언부에 직접 구현된 함수는 인라인 함수가 된다.
        return height;
    }
    void set(int w, int h);
    void show();
    
};
 
void Oval::set(int w, int h) { //width와 height를 셋 해주는 함수
    width = w;
    height = h;
}
void Oval::show() {  //width 와 height 출력 함수
    cout << "width : " << width << " " << "height : " << height << endl;
}
 
int main(void) {
    Oval a;  //Oval 형 객체 a 생성자 매개변수 없는 것이 호출되어 1,1 로 width와 height 초기화
    Oval b(34); //Oval 형 객체 b 3,4 로 width와 height 초기화
    a.set(1020); //a의 height와 width 를 10,20으로 셋
    a.show(); //출력
    cout << b.getWidth() << "," << b.getHeight() << endl//get 함수로 b의 width와 height 출력 직접 접근은 불가(private이라서)
 
    return 0;
    }
cs




반응형

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

SelectableRandom 클래스  (0) 2017.10.12
EvenRandom 클래스  (0) 2017.10.12
랜덤 수 출력  (0) 2017.09.16
별 출력  (0) 2017.09.09
1부터 10까지 더하기  (0) 2017.09.09
반응형

랜덤 수를 발생시키는 Random 클래스를 만들자. Random 클래스를 이용하여 랜덤한 정수를 10개 출력하는 사례는 다음과 같다. Random 클래스가 생성자, next(), nextInRange() 3개의 멤버 함수를 가지도록 작성하고 main() 함수와 합쳐 하나의 cpp파일에 구현하라.


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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
class Random {
public:
    Random() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int next() {
        return rand();
    }
    int nextInRange(int a,int b) {
        return ((rand() % (b - a + 1)) + a); //a이상 b미만 랜덤 정수를 뽑는 알고리즘
        
    }
};
 
int main(void) {
    Random r;
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.next() << " ";
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "4까지의 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextInRange(2,4<< " ";
    }
    cout << endl;
    return 0;
}
cs



5미만의 수를 rand 출력하려면 4의 나머지를 출력하면 된다. (0~3)

여기서 3~6을 출력하고싶으면 위의 값에 3을 더해주면 된다. 그런데 우리가 가진 인자는 3,6이기 때문에

4를 3,6으로 표현해야 한다. 0~4 = 4개 3~6= 4개 숫자이다. 즉 우리가 원하는건 3~6에 존재하는 숫자 개수이기 때문에

6-3+1을 해주면 된다. 

3미만의 수를 rand 출력하려면 3의 나머지를 출력하면 된다. (0~2)

여기서 2~4를 출력하고 싶으면 4-2+1을 통해 나눠주는 수를 구하고 결과 값에 2를 더해주면 된다.

즉 일반적으로 표현했을 때 a~b 사이 랜덤 정수를 출력하고 싶으면

rand%(b-a+1)+a 를 해주면 되는 것이다.




반응형

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

EvenRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
별 출력  (0) 2017.09.09
1부터 10까지 더하기  (0) 2017.09.09
개인정보 출력  (0) 2017.09.09
반응형

다음과 같이 출력하는 C++ 프로그램을 Visual C++로 작성하라.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int main(void){
    int i=0;
    int j=0;
    for(i=1;i<5;i++//총몇줄 입력할지 결정
    {
        for(j=0;j<i;j++){ 
            std::cout<<"*"//별출력
        }
        std::cout<<"\n"//한줄다입력하면 개행
    }
    return 0;
}
cs




반응형

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

Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
1부터 10까지 더하기  (0) 2017.09.09
개인정보 출력  (0) 2017.09.09
C++입문  (2) 2017.09.09
반응형

1에서 10까지 더하여 결과를 화면에 출력하는 C++ 프로그램을 Visual C++로 작성하라.


1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main(void){
    int i=0;
    int sum=0;
    for(i=1;i<=10;i++){ //1부터 10까지 반복
        sum+=i; //sum=sum+i
    }
    std::cout<<"1에서 10까지 더한 결과는 "<<sum<<"입니다.\n"//c언어에 비해 편한 표준출력
    return 0;
}
cs




반응형

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

Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
별 출력  (0) 2017.09.09
개인정보 출력  (0) 2017.09.09
C++입문  (2) 2017.09.09
반응형

다음 지시대로 자신의 학과, 나이, 희망 직업을 화면에 출력하는 C++ 프로그램을 Visual C++로 작성하라.

솔루션명 : prac1

프로젝트명 : 1-2

소스 파일명 : me.cpp


1
2
3
4
5
6
7
#include <iostream>
int main(void){
    std::cout<<"컴퓨터공학과\n";
    std::cout<<"21세\n";
    std::cout<<"대통령\n";
    return 0;
}
cs



반응형

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

Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
별 출력  (0) 2017.09.09
1부터 10까지 더하기  (0) 2017.09.09
C++입문  (2) 2017.09.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
#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
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
    int num;
    struct NODE *link;
}NODE;
int main(void)
{
    NODE *list=NULL;
    NODE *prev, *p, *next;
    int a=0;
    while(1)
    {
        printf("양의 정수를 입력하세요(종료는-1): ");
        scanf("%d",&a);
        if(a==-1)
            break;
        p=(NODE*)malloc(sizeof(NODE));
        p->num=a;
        if(list==NULL)
        {list=p;}
        else
        {prev->link=p;}
        p->link=NULL;
        prev=p;
    }
    p=list;
    while(1)
    {
    if(p==NULL)
        {printf("NULL\n");
        break;}
    printf("%d->",p->num);
    p=p->link;
    }
    p=list;
    while(p!=NULL)
    {
        next=p->link;
        free(p);
        p=next;
    }
    return 0;
 
}
cs




반응형

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

영화 목록 만들기  (2) 2017.02.25
전화 번호부 작성  (2) 2017.02.25
단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
반응형

사용자로부터 단어를 입력받는 공간을 동적 메모리로 할당받아 보자. 단어의 최대 크기는 50이라고 가정한다. 단어의 주소를 반환하는 함수 char *get_word()를 작성하고 테스트한다. 


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>
 
char* get_word();
 
int main(void)
{
    char *p;
    p=get_word();
    printf("동적 메모리에 저장된 단어는 %s입니다.\n",p);
    free(p); //어차피 p와 get_word 의 s의 주소가 같아서 p를 free해줘도 된다.
    return 0;
}
char* get_word()
{
    char *s;
    s=(char*)malloc(sizeof(char)*50);
    if(s==NULL)
    {
        printf("메모리할당오류\n");
        exit(1);
    }
    printf("단어를 입력하세요: ");
    gets(s);
    return s;
}
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
#include <stdio.h>
#include <stdlib.h>
#define SIZE 30
typedef struct BOOK
{
    char name[SIZE];
    char number[SIZE];
}book;
int main(void)
{
    int count=0;
    int i;
    book *p;
    printf("주소의 개수: ");
    scanf("%d",&count);
    getchar();
    p=(book*)malloc(count*sizeof(book));
    if(p==NULL)
    {
        printf("메모리할당오류\n");
        exit(1);
    }
    for(i=0;i<count;i++)
    {
        printf("이름을 입력하세요: ");
        gets(p[i].name);
        printf("휴대폰 번호를 입력하세요: ");
        gets(p[i].number);
    }
    printf("========================================\n");
    printf("이름\t휴대폰 번호\n");
    printf("========================================\n");
    for(i=0;i<count;i++)
    {
        printf("%s\t%s\n",p[i].name,p[i].number);
        printf("========================================\n");
    }
    free(p);
    return 0;
}
cs




반응형

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

양의 정수 저장  (0) 2017.02.22
단어 입력 받기  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
양의 정수들의 합  (0) 2017.02.21
명령어 라인으로 텍스트 파일 합치기  (0) 2017.02.18
반응형

길이가 100인 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
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int count=0;
    char **p=NULLint i;
    printf("문자열의 개수: ");
    scanf("%d",&count);
    p=(char**)malloc(sizeof(char*)*count);
    for(i=0;i<count;i++)
    {
        p[i]=(char*)malloc(sizeof(char)*100);
    }
    getchar();
    for(i=0;i<count;i++)
    {
    printf("문자열을 입력하세요: ");
    gets(p[i]);
    }
    printf("\n");
    for(i=0;i<count;i++)
    {
    puts(p[i]);
    }
    for(i=0;i<count;i++)
    {
    free(p[i]);
    }
    free(p);
    return 0;
}
cs

p에 동적메모리 할당할 때는 실제 메모리크기는 sizeof(char*) * count 이고
p[i]에 동적메모리 할당할 때 실제 메모리크기는 sizeof(char) * 100 이라는 것을 조심해야합니다.
p와 p[i]는 포인터인고 p[i]는 문자열을 가리키고 p는 문자열의 이름(즉 문자열의 주소)를 가리킵니다.
따라서 크기를 매우 조심해야합니다. 안그러면 오류가 발생합니다. (한마디로 2만큼 받아오고 4만큼 반납을 못시킨다는 말임)

참고 블로그 : http://bozeury.tistory.com/19




반응형

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

단어 입력 받기  (0) 2017.02.21
주소록 저장  (0) 2017.02.21
양의 정수들의 합  (0) 2017.02.21
명령어 라인으로 텍스트 파일 합치기  (0) 2017.02.18
단어 바꾸기  (0) 2017.02.18
반응형

동적 메모리 할당을 이용하여서 사용자로부터 양의 정수들의 합을 구하는 프로그램을 작성하라. 사용자로부터 먼저 정수의 개수를 입력받도록 하라.


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(void)
{
    int size=0;
    int i;
    int *p;
    int sum=0;
    printf("정수의 개수: ");
    scanf("%d",&size);
    p=(int*)malloc(sizeof(int)*size);
    for(i=0;i<size;i++)
    {
        printf("양의 정수를 입력하세요: ");
        scanf("%d",&p[i]);
    }
    for(i=0;i<size;i++)
    {
        sum+=p[i];
    }
    printf("합은 %d입니다.\n",sum);
    free(p);
    return 0;
}
cs







반응형

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

주소록 저장  (0) 2017.02.21
문자열 동적 메모리  (0) 2017.02.21
명령어 라인으로 텍스트 파일 합치기  (0) 2017.02.18
단어 바꾸기  (0) 2017.02.18
특정 단어 찾기  (0) 2017.02.18
반응형

명령어 라인으로 주어진 2개의 텍스트 파일을 합하여 하나의 파일로 만드는 프로그램을 작성하라.


argc는 argument의 수, argv는 argument가 char 형 문자열로 저장되는 포인터 배열입니다.

argv[0]은 무조건 실행 파일의 경로가 저장되고 argv[1]부터는 사용자가 입력한 인수가 저장되는데

공백문자(' ')로 분리됩니다. 

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
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int main(int argc, char *argv[])
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    FILE *fp3=NULL;
    char line[SIZE];
    if((fp1=fopen(argv[1],"r"))==NULL)
    {
        printf("file open error1\n");
        exit(1);
    }
    if((fp2=fopen(argv[2],"r"))==NULL)
    {
        printf("file open error2\n");
        exit(1);
    }
    if((fp3=fopen(argv[3],"a"))==NULL)
    {
        printf("file open error3\n");
        exit(1);
    }
    while(!feof(fp1))
    {
        fgets(line,SIZE,fp1);
        fputs(line,fp3);
    }
    while(!feof(fp2))
    {
        fgets(line,SIZE,fp2);
        fputs(line,fp3);
    }
    printf("\n%s %s를 합하여 %s를 작성하였습니다.\n",argv[1],argv[2],argv[3]);
    fclose(fp1);
    fclose(fp2);
    return 0;
}
cs







반응형

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

문자열 동적 메모리  (0) 2017.02.21
양의 정수들의 합  (0) 2017.02.21
단어 바꾸기  (0) 2017.02.18
특정 단어 찾기  (0) 2017.02.18
텍스트 파일과 이진 파일  (0) 2017.02.17
반응형

텍스트 파일에서 특정한 단어를 찾아서 다른 단어로 변경하여 출력 파일에 쓰는 프로그램을 작성하라.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define ROW 20
#define COL 20
int main(void)
{
    FILE *fpr=NULL;
    FILE *fpw=NULL;
    char tok[ROW][COL];
    char rpl[SIZE];
    char sub[SIZE];
    char line[SIZE];
    char *token;
    int count; int i;
    if((fpr=fopen("origin.txt","r"))==NULL)
    {
        printf("파일오픈실패1\n");
        exit(1);
    }
    if((fpw=fopen("change.txt","a"))==NULL)
    {
        printf("파일오픈실패2\n");
        exit(1);
    }
    printf("바뀔 단어를 입력하세요: ");
    gets(rpl);
    printf("대신 넣을 단어를 입력하세요: ");
    gets(sub);
    while(!feof(fpr))
    {
        fgets(line,SIZE,fpr);
            count=0;
            token=strtok(line," "); //토큰 분리
            while(token!=NULL)
            {
                strcpy(tok[count],token); //토큰을 이차원배열로 삽입
                if(strcmp(tok[count],rpl)==0//이차원배열과 rpl 비교
                {strcpy(tok[count],sub);} //같을시 이차원배열에 sub 삽입
                count++//카운트는 이차원배열 개수 세는데 사용
                token=strtok(NULL," \n"); //연속적 토큰 분리
            }
        for(i=0;i<count;i++)
        {
            strcat(tok[i]," "); //자르는 것으로 공백문자사용 했기에 다시 붙여줘야함
            fputs(tok[i],fpw);
        }
        fputs("\n",fpw); //자르는 것으로 개행문자 사용했으므로 다시 붙여줌
    } //이프로그램은 불완전한데 쉼표나 마침표가 붙어있으면 검색을 하지 못한다.
    fclose(fpr); //그렇다고 자르는 것으로 쉼표를 추가한다고 해도 그 쉼표를
    fclose(fpw); // 제자리에 다시 박아놓는 방법을 찾지 못하였다.(어떤 걸로 잘랐는지 어떻게 구분할까?)
    return 0;
    }
cs




이프로그램은 불안전합니다. 공백문자와 개행문자로 분리된 일반적인 단어는 잡아낼 수 있지만 

쉼표나 마침표가 붙어있는 문자는 잡아낼 수가 없습니다.  더 좋은 방법이 있으면 알려주세요!




반응형
반응형

파일에서 특정한 단어를 찾아서 파일 이름과 단어가 위치한 줄 번호를 출력하는 프로그램을 작성하라.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
    FILE *fp=NULL;
    char name[SIZE];
    char word[SIZE];
    char line[SIZE];
    int num=0;
    printf("파일 이름: ");
    gets(name);
    if((fp=fopen(name,"r"))==NULL)
    {
        printf("파일오픈오류\n");
        exit(1);
    }
    printf("탐색할 단어: ");
    gets(word);
    while(!feof(fp))
    {
        num++;
        fgets(line,SIZE,fp);
            if(strstr(line,word)!=NULL)
            {
                printf("%s: %d    %s",name,num,line);
            }
    }
    fclose(fp);
    return 0;
}
cs






반응형

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

명령어 라인으로 텍스트 파일 합치기  (0) 2017.02.18
단어 바꾸기  (0) 2017.02.18
텍스트 파일과 이진 파일  (0) 2017.02.17
도서 관리 프로그램  (0) 2017.02.17
줄 번호 붙이기  (0) 2017.02.17
반응형

임의의 실수 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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 100
int main(void)
{
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    int i;
    double arr[SIZE];
    srand((unsigned)time(NULL));
 
    if((fp1=fopen("first.bin","wb"))==NULL)
    {
        printf("파일 오픈 실패1\n");
        exit(1);
    }
    if((fp2=fopen("abc.txt","w"))==NULL)
    {
        printf("파일 오픈 실패2\n");
        exit(1);
    }
    for(i=0;i<SIZE;i++)
    {
        arr[i]=(double)rand()/RAND_MAX; //RAND_MAX는0xfff(32767) 이다. 
    } //c언어의 rand 함수는 0에서 32767을 반환한다. (double)rand();를사용하면 이진파일과 텍스트파일의 크기가 달라진다.
    fwrite(arr,sizeof(double),SIZE,fp1);
    for(i=0;i<SIZE;i++)
    {
        fprintf(fp2,"%lf",arr[i]);
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
 
}
cs





rand 함수를 다르게 다용하면 텍스트 파일과 바이너리 파일의 크기가 다르게 생성되는 경우가 있습니다. 그 이유는 바이너리 상의 특정 문자가

텍스트로 저장될 때 2byte로 저장되기 때문입니다. 줄바꿈 문자인데, 이것 때문에 몇바이트, 많으면 몇십바이트씩 차이가 생기게 됩니다.

따라서 데이터베이스를 저장할 때는 꼭 바이너리 형태로 저장을 하도록 합시다.

참고 블로그 주소 : http://snbosoft.tistory.com/entry/%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%ACBinary-%ED%85%8D%EC%8A%A4%ED%8A%B8Text-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4



반응형

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

단어 바꾸기  (0) 2017.02.18
특정 단어 찾기  (0) 2017.02.18
도서 관리 프로그램  (0) 2017.02.17
줄 번호 붙이기  (0) 2017.02.17
사용자 입력 텍스트 파일 저장  (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
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
반응형

텍스트 파일을 읽어서 각 줄의 앞에 줄 번호를 붙이는 프로그램을 작성하라. 줄 번호는 폭이 6이고 오른쪽 정렬되도록 하라.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
    FILE *fp = NULL;
    char arr[SIZE];
    char name[SIZE];
    int num = 1;
    printf("파일 이름: ");
    gets(name);
    if ((fp=fopen(name,"r"))==NULL)
    {
        printf("파일 오픈 실패\n");
        exit(1);
    }
    while (!feof(fp))
    {
        fgets(arr, SIZE, fp); //fgets함수는 개행문자까지 받는다.
        if (arr[strlen(arr) - 1== '\n')
            {
                arr[strlen(arr) - 1= '\0';
            }  //따라서 개행문자가 출력되므로 개행문자를 NUL문자로 바꿔준다.
        printf("%6d: ", num); //폭6 오른쪽정렬
        puts(arr);
        num++;
    }
    fclose(fp);
    return 0;
}
cs





반응형
반응형

먼저 아래의 소스코드를 보자.


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    char szStr[20];
    gets(szStr);
    printf("%d",*szStr);
    return 0;
}
cs

이 코드를 실행해서 아무것도 입력하지않고 enter를 쳐주면 아마 '\0' 이 szStr[0]에 저장될 것이고 이것이 정수 형식으로 출력되므로 0이 나올 것이다. (szStr[0] 과 *szStr 이 같은 것을 출력한다는 것을 모른다면 ... 복습하고 오세욧)

결과는 0이나옵니다. (아스키코드값) 아스키코드 0은 NUL 문자입니다. (문자열 끝을 나타낼 때 쓰는 것) ('\0' 의 아스키코드는 0)




하지만 이 것은 어떨까요?

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    char szStr[20];
    fgets(szStr,20,stdin);
    printf("%d",*szStr);
    return 0;
}
cs

fgets와 gets는 차이점이 있는데요 fgets는 개행문자 '\n' 을 문자열에 포함시킵니다. gets 는 개행문자를 문자열에 포함하지 않습니다.

결과는 10이나옵니다. (아스키코드값) 10은 LF(NL Line feed, new line) 을 의미합니다. 커서를 현재 행에서 다음 행으로 즉 아래로 내린다는 뜻입니다.


이번에는 7번 문제의 힌트를 읽어보겠습니다. 

fgets(...,stdin) 를 사용하면 사용자로부터 한 줄의 문장을 받을 수 있다. 만약 fgets()가 0을 반환하면 공백 문자열이 입력된 것이므로 반복 루프를 종료하고 출력 파일을 닫으면 된다.

라고 써있는데요. fgets는 오류가 발생할 때 null pointer를 반환합니다. 파일 끝에 도달하였는데 아무런 문자를 읽지 못하였을 때는 

문자열의 내용은 그대로 두고 null pointer를 반환합니다. (포인터 : NULL 이나 0      문자열 : 0이나 '\0' 이나 "")


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    char szStr[20];
    printf("%d",fgets(szStr,20,stdin));
    return 0;
}
cs

그렇다면 fgets 로 szStr을 받는데 아무것도 입력하지 않고 엔터를 쳤을 경우 NULL 포인터가 반환되니 값이 0이 나와야 하는데 그것을 확인해 보겠습니다. 


나오지 않습니다. 심지어 주소도 실행 할 때마다 계속 바뀝니다.  그렇다면 get는 어떨까요


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    char szStr[20];
    printf("%d",gets(szStr));
    return 0;
}
cs


똑같이 어떤 특정한 주소값이 나오고 할 때마다 계속 바뀝니다.


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    int *p=NULL;
    printf("%d",p);
    return 0;
}
cs

그리고 포인터를 NULL 로 초기화 (NULL 이랑 0은 같은것임 포인터에서) 하였을 때 주소값이 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
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int main(void)
{
    FILE *fp=NULL;
    char name[SIZE];
    char line[SIZE];
    int count1,count2,i;
    printf("파일 이름을 입력하세요: ");
    gets(name);
    if((fp=fopen(name,"w"))==NULL)
    {
        printf("파일 열기 오류\n");
        exit(1);
    }
    while(1)
    {
    line[0]='\0';
    count1=0;count2=0;
    fgets(line,SIZE,stdin);
    for(i=0;line[i]!='\0';i++)
    {
        count1++;
        if((line[i]==' ')||(line[i]=='\t')||(line[i]=='\n'))
        {count2++;}  //개행문자도 해주는 이유는 무조건 들어가는 문자이기 때문
    } //총 글자수와 공백 문자 수를 비교하여 같으면 프로그램 종료, 다르면 계속 실행
    if(count1==count2)
        break;
    fputs(line,fp);
    }
    fclose(fp);
    return 0;
}
cs



괜히 힌트 때문에 시간을 버렸네요.

문자열 내 모든 문자(\n포함 ) 수와 문자열 내 모든 공백문자 (\t, ' '를 세는데 \n 도 포함합니다. 왜냐하면 무조건 들어가는 문자이기 때문)

수를 비교하여 같으면 프로그램 종료, 다르면 계속 진행하게 코딩하였습니다.







반응형

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

도서 관리 프로그램  (0) 2017.02.17
줄 번호 붙이기  (0) 2017.02.17
인쇄 가능 문자 수 세기  (0) 2017.02.13
성적 평균 구하기  (0) 2017.02.12
텍스트 파일 비교  (0) 2017.02.11
반응형

사용자로부터 받은 파일 이름으로 텍스트 파일을 연 후에 파일 안에 들어 있는 인쇄 가능한 문자들의 개수를 계산하여 출력하라.


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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main(void)
{
    FILE *fp=NULL;
    char name[SIZE];
    char buf[SIZE];
    int count=0;
    int i=0;
    printf("파일 이름을 입력하세요: ");
    gets(name);
    if((fp=fopen(name,"r"))==NULL)
    {
        fprintf(stderr,"파일오픈오류\n");
        exit(1);
    }
    while(!feof(fp))
    {
        fgets(buf,SIZE,fp);
        for(i=0;buf[i]!='\0';i++)
        {
            if(isprint(buf[i])) //0이아니면프린트가능,0이면프린트불가 (아스키 32~126)
            count++//공백' '은 세어지고 탭(\t)은 안 세어지고 \n도 안 세어진다.
        }
    }
    printf("인쇄 가능한 문자의개수는 %d개입니다.\n", count);
    return 0;
}
cs


직접 세어보세요. 공백 (' ') 은 세어지고 탭 (\t)은 안 세어지고 줄바꿈(\n) 도 안 세어집니다.









반응형

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

줄 번호 붙이기  (0) 2017.02.17
사용자 입력 텍스트 파일 저장  (0) 2017.02.13
성적 평균 구하기  (0) 2017.02.12
텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11

+ Recent posts