반응형

7.9> 통계를 내는 Statistics 클래스를 만들려고 한다. 데이터는 Statistics 클래스 내부에 int 배열을 동적으로 할당받아 유지한다. 다음과 같은 연산이 잘 이루어지도록 Statistics 클래스와 !, >>, <<, ~ 연산자 함수를 작성하라.

<코드>

#include <iostream>

 

using namespace std;

 

class Statistics{

private:

        int size; //동적 배열의 사이즈

        int index; //마지막 원소의 인덱스

        int *p; //동적 배열을 가리킬 포인터

public:

        Statistics(int size=5,int index=-1); //기본 사이즈 5, 인덱스 -1(nothing)

        friend bool operator!(Statistics op);

        void operator>>(int &op);

        Statistics& operator<<(int op);

        void operator~();

       

};

Statistics::Statistics(int size,int index){

        this->size=size;

        this->index=index;

        p=new int[size]; //size 크기만큼의 int 동적 배열 할당

}

 

bool operator!(Statistics op){

        if(op.index==-1) //index -1이면 true 반환

               return true;

        else

               return false;

}

void Statistics::operator>>(int &op){ //평균구하는 함수

        int sum=0;

        for(int i=0;i<index+1;i++){sum+=p[i];} //실제 원소 개수는 index+1 (0부터시작하니까)

        op= sum/(index+1); //op 평균값 넣어줌(참조라서 원본 바뀜)

}

Statistics& Statistics::operator<<(int op){

        index++; //인덱스 증가

        if(size<=index){ //인덱스를 하나키웠는데 size 크기 같으면 배열 크기보다 원소가 많은 경우

               int *tmp=new int[size+5]; //하나씩 키우면 자주 없앴다 만들었다 해야하니 5개씩 늘린다.

               for(int i=0;i<size;i++){ //(size+5 하면 p크기가 size라서 오류날 있음)

                       tmp[i]=p[i]; //p 원소를 전부 tmp 복사

               }

               delete []p; //p 가리키는 동적배열 힙에 반환

               p=tmp; //tmp 가리키는 배열을 p 가리키게 (어차피 tmp 사라지므로 깊은 복사 필요 없음)

               size+=5; //size 5 추가

        }

        p[index]=op; //index 오퍼랜드 대입

        return *this; //현재 객체의 참조 리턴(이름)

}

void Statistics::operator~(){ //전부 출력하는 함수

        for(int i=0;i<index+1;i++){ //원소 개수 = index+1

               cout<<p[i]<<" ";

        }

        cout<<endl;

}

 

int main(void){

        Statistics stat;

        if(!stat) cout<<"현재 통계 데이타가 없습니다."<<endl;

        int x[5];

        cout <<"5 개의 정수를 입력하라>>";

        for(int i=0;i<5;i++) cin >> x[i]; //x[i] 정수 입력

        for(int i=0;i<5;i++) stat << x[i]; //x[i] 값을 통계 객체에 삽입한다.

        stat << 100 << 200; //100, 200 통계 객체에 삽입한다.

        ~stat; //통계 데이타를 모두 출력한다.

 

        int avg;

        stat>>avg; //통계 객체로부터 평균을 받는다.

        cout<<"avg="<<avg<<endl; //평균을 출력한다.

        return 0;

}

 

<결과창>

               

                    


반응형

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

MyQueue Class  (0) 2017.12.31
Stack class  (0) 2017.12.25
Circle class 오퍼레이터 오버로딩  (0) 2017.12.25
Circle class  (0) 2017.12.25
Matrix class 활용, 연산자 오버로딩  (0) 2017.12.25
반응형

6.6> 동일한 크기의 배열을 변환하는 다음 2개의 static 멤버 함수를 가진 ArrayUtility2 클래스를 만들고 이 클래스를 이용하여 아래 결과와 같이 출력하도록 프로그램을 완성하라.

<코드>

#include <iostream>

 

using namespace std;

 

class ArrayUtility2{

public:

        static int* concat(int s1[], int s2[], int size);

        //s1 s2 연결한 새로운 배열을 동적 생성하고 포인터 리턴

        static int* remove(int s1[], int s2[], int size, int& retSize);

        //s1에서 s2 있는 숫자를 모두 삭제한 새로운 배열을 동적 생성하여 리턴, 리턴하는

        //배열의 크기는 retSize 전달. retSize 0 경우 NULL 리턴

};

int* ArrayUtility2::concat(int s1[], int s2[], int size){

        int *p=new int[size*2]; //동일한 크기의 배열이므로 size *2 배열을 동적 생성

        for(int i=0;i<size;i++){

               p[i]=s1[i]; //0~4 인덱스는 s1 초기화

               p[i+size]=s2[i]; //5~9 인덱스는 s2 초기화

        }

        return p; //동적배열을 가리키는 주소 리턴

}

int* ArrayUtility2::remove(int s1[], int s2[], int size, int& retSize){

        int i; int j; int count=0; //빼기 배열 만들 사용할 카운터

        for(i=0;i<size;i++){

               for(j=0;j<size;j++){

                       if(s1[i]==s2[j]){

                              s1[i]=NULL; //s2 원소를 s1 일일이 비교하여 같으면 NULL 교체

                              break; //어차피 1번겹치든 2번겹치든 빼는 것은 한번이기 때문에 break 가능

                       }

               }

        }

        for(i=0;i<size;i++){

               if(s1[i]!=NULL)

                       retSize++; //원소값이 NULL 아니면 retSize 증가

        }

        if(retSize==0) return NULL; //retSize 0이면 NULL포인터 리턴

        int *p=new int[retSize]; //retSize 크기의 인트형 배열 동적 할당

        for(i=0;i<size;i++){

               if(s1[i]!=NULL){ //s1[i] NULL 아니면

                       p[count]=s1[i]; //p[count] 대입

                       count++;

               }

        }

        return p; //동적배열을 가리키는 주소 리턴

}

int main(void){

        int x[5];

        int y[5];

        int i;

        int *conc; //합친 배열 주소 받음

        int *del; // 배열 주소 받음

        int size=sizeof(x)/sizeof(x[0]); //(4*5)/4=5

        int retSize=0; //초기화 안하고 참조에 쓰면 오류생김

        cout<<"정수를 5 입력하라. 배열 x 삽입한다>>";

        for(i=0;i<5;i++){cin>>x[i];} //배열 입력

        cout<<"정수를 5 입력하라. 배열 y 삽입한다>>";

        for(i=0;i<5;i++){cin>>y[i];}

        conc=ArrayUtility2::concat(x,y,size); //합친 배열

        for(i=0;i<size*2;i++){cout<<conc[i]<<" ";} //출력

        cout<<endl;

        del=ArrayUtility2::remove(x,y,size,retSize); // 배열

        cout<<"배열 x[]에서 y[] 결과를 출력한다. 개수는 "<<retSize <<endl;

        for(i=0;i<retSize;i++){cout<<del[i]<<" ";} //출력

        cout<<endl;

        return 0;

}

 

<결과창>




반응형
반응형

6.5> 동일한 크기로 배열을 변환하는 다음 2개의 static 멤버 함수를 가진 ArrayUtility 클래스를 만들어라.

<코드>

#include <iostream>

 

using namespace std;

 

class ArrayUtility{

public:

        static void intToDouble(int source[], double dest[], int size);

        //int[] double[] 변환

        static void doubleToInt(double source[], int dest[], int size);

        //double[] int[] 변환

};

void ArrayUtility::intToDouble(int source[], double dest[], int size){

        for(int i=0;i<size;i++){

               dest[i]=(double)source[i]; //강제 형변환

        }

}

void ArrayUtility::doubleToInt(double source[], int dest[], int size){

        for(int i=0;i<size;i++){

               dest[i]=(int)source[i]; //강제 형변환, 소수점은 날아간다.

        }

}

int main(void){

        int x[]={1,2,3,4,5};

        double y[5];

        double z[]={9.9,8.8,7.7,6.6,5.6};

 

        ArrayUtility::intToDouble(x,y,5); // x[]-> y[]

        for(int i=0;i<5;i++) cout << y[i] << ' ';

        cout << endl;

        ArrayUtility::doubleToInt(z,x,5); //z[]->x[]

        for(int i=0;i<5;i++) cout << x[i] << ' ';

        cout << endl;

        return 0;

}


<결과창>



}


반응형

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

Random 클래스  (0) 2017.12.25
배열 빼기  (0) 2017.12.25
생성자 오버로딩의 디폴트 매개변수로의 변환  (0) 2017.12.25
생성자 중복 디폴트 매개 변수  (0) 2017.12.25
virtual 함수  (0) 2017.11.23
반응형

Open Challenge> 아래< 5-1>을 참고하여 영문 텍스트, 숫자, 몇 개의 특수 문자로 구성되는 텍스트를 모스 부호로 변환하는 프로그램을 작성하라. 모스 부호는 전보를 쳐서 통신하는 시절에 사용된 유명한 코딩 시스템이다. 각 모스 코드들은 하나의 빈칸으로 분리되고, 영문 한 워드가 모스 워드로 변환되면 워드들은 3개의 빈칸으로 분리된다. 실행 예는 다음과 같다. 영문 텍스트를 입력받아 모스 부호로 변환하여 출력하고, 변환이 잘 되었는지 확인하기 위해 다시 모스 부호를 영문 텍스트로 변환하여 원문을 출력한 사례이다.


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
#include <iostream>
#include <algorithm>
#include <string>
 
using namespace std;
 
class Morse{
private:
    string alphabet[26]; //알파벳의 모스 부호 저장
    string digit[10]; //숫자의 모스 부호 저장
    string slash, question, comma, period, plus, equal; //특수 문자의 모스 부호 저장
public:
    Morse(); //alphabet[], digit[] 배열 및 특수 문자의 모스 부호 초기화
    void text2Morse(string text, string& morse); //영문 텍스트를 모스 부호로 변환
    bool morse2Text(string morse, string& text); //모스 부호를 영문텍스트로 변환
};
Morse::Morse(){
    string Malphabet[26]=".-""-...""-.-.""-.."".","..-.""--.""...."".."".---",
                   "-.-"".-..""--""-.""---",".--.""--.-"".-.""...""-",
                   "..-""...-"".--""-..-""-.--""--.."};
    string Mdigit[10]={"-----"".----""..---""...--""....-"".....""-....""--...""---..""----." };
    slash= "-..-.";    question= "..--..";    comma= "--..--";
    period= ".-.-.-";  plus= ".-.-.";     equal= "-...-"//모스 특수문자 초기화
    int i;
    for(i=0;i<26;i++){alphabet[i]=Malphabet[i];} //모스 알파벳 초기화
    for(i=0;i<10;i++){digit[i]=Mdigit[i];} //모스 숫자 초기화
}
void Morse::text2Morse(string text, string& morse){
    transform(text.begin(),text.end(),text.begin(),tolower); // 입력한 문자열을 전부 소문자로 바꾼다.
    for(int i=0;i<text.length();i++){
        if(text[i]>=97&&text[i]<=122){morse=morse+alphabet[text[i]-97]+" ";} //해당 인덱스가 알파벳일 경우 해당 모스 부호 삽입
        else if(text[i]==' '){morse+="   ";} //해당 인덱스가 공백문자 일경우 공백문자 3개 입력
        else if(text[i]>=48&&text[i]<=57){morse=morse+digit[text[i]-48]+" ";} //해당 인덱스가 숫자 일경우 해당 모스 부호 삽입
        else if(text[i]=='/'){morse=morse+slash+" ";}
        else if(text[i]=='?'){morse=morse+question+" ";}
        else if(text[i]==','){morse=morse+comma+" ";}
        else if(text[i]=='.'){morse=morse+period+" ";}
        else if(text[i]=='+'){morse=morse+plus+" ";}
        else if(text[i]=='='){morse=morse+equal+" ";} //해당 인덱스가 특수문자 일경우 해당 모스 부호 삽입
    }
}
bool Morse::morse2Text(string morse, string& text){
    string regen; //다시 읽을 수 있게 복원한 것을 넣을 스트링
    string sub; // 공백 문자 단위로 자름
    int i;
    int startindex=0//문자를 찾기 시작할 첫번째 index
    int blankindex=-1//공백문자의 index
    int swch=1//모스부호가 무엇인지 검사하는데 사용할 플래그
    while(1){
        swch=1//플래그는 루프 돌때마다 1로 ON
        startindex=blankindex+1//찾기 시작할 인덱스는 공백 인덱스 더하기 1
        blankindex=morse.find(" ",blankindex+1); //전에 찾았던 것을 또 찾으면 안되니 더하기 1을해서 공백문자를 찾는다.
        sub=morse.substr(startindex,blankindex-startindex); // 공백 문자를 제외한 무언가를 나타내는 모스부호 부분만 자른다.
        for(i=0;i<26;i++){
            if(alphabet[i]==sub)
                {regen+=(char)(97+i);
            swch=0;break;}    //알파벳일 경우 변환하여 regen에 더하고 플래그 OFF 후 루프 탈출
        }
        if(swch==1){
            for(i=0;i<10;i++){
                if(digit[i]==sub)
                {regen+=(char)(48+i);
                swch=0;break;}
            } //숫자일 경우 변환하여 regen에 더하고 플래그 OFF 후 루프 탈출
        }
        if(swch==1){
            if(sub==slash){regen+="/";}
            else if(sub==question){regen+="?";}
            else if(sub==comma){regen+=",";}
            else if(sub==period){regen+=".";}
            else if(sub==plus){regen+="+";}
            else if(sub==equal){regen+="=";}
        } //특수문자일 경우 regen에 더한다. 
 
        if(blankindex==morse.length()-1){break;} //여기서 검사하는 이유는 인덱스가 맨 마지막일때 +1,+2,+3 을 검사하면 오류가 나기 때문이다.
        if((morse[blankindex+1]==' ')&&(morse[blankindex+2]==' ')&&(morse[blankindex+3]==' ')){
            regen+=" ";     cout<<regen<<endl//제대로 이어졌나 확인.
            blankindex+=3//공백문자가 연달아 3개 있으면 실제에서는 공백문자 하나를 뜻한다. 이를 검사하기 위함.
        }
        }
    if(regen==text) return true//새로 만든 문자열과 원래 문자열이 같으면 true리턴
    else return false//아니면 false 리턴
}
int main(void){
    Morse m;
    string english;
    string morse;
    cout<<"아래에 영문 텍스트를 입력하세요. 모스 부호로 바꿉니다."<<endl;
    getline(cin,english,'\n'); //개행문자 나올 때까지 문자열 받는다
    m.text2Morse(english,morse); //모스부호로 전환
    cout<<morse<<endl;
    cout<<"모스 부호를 다시 영문 텍스트로 바꿉니다."<<endl;
    if(m.morse2Text(morse,english)) //다시 읽을 수 있는 텍스트로 전환
        cout<<english<<endl//만약 같으면 원래 문자열 출력
    else
        cout<<"오류 발생"<<endl//다르면 오류발생 출력
    return 0;
}
 
cs




반응형

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

virtual 함수  (0) 2017.11.23
operator overloading  (0) 2017.11.14
Book 클래스  (1) 2017.11.09
Accumulator 클래스  (0) 2017.11.09
MyIntStack 클래스  (0) 2017.11.09
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main(void){
 
    int a[2]={6,10};
    int *p=a; //포인터 p는 배열a의 첫번째 원소를 가리키는 포인터
    int &r=*a; //r은 a의 첫번째 원소의 참조
    int &r2=r; //r2는 r의 참조 (참조의 참조)
 
    cout<<a[0]<<endl//6
    cout<<*p<<endl//6
    cout<<r<<endl//6
    cout<<r+1<<endl//6+1=7
    cout<<a<<endl//주소
    cout<<&r<<endl//첫번째 원소의 주소 =a
    cout<<*(&r)<<endl//레퍼런스 주소의 역참조 = 6
    cout<<*(&r+1)<<endl//레퍼런스 주소에 1을 더한것의 역참조 = 10(2번째 원소)
    cout<<r2<<endl//r2는 r을 가리키므로 6
}
cs


포인터는 주소가 담기는 메모리가 할당 된다.

레퍼런스는 메모리 상의 특정 공간을 차지하는 것이 아니라 컴파일 시에

원래 레퍼런스가 참조하던 변수의 *(주소값)으로 대체되는 것이다.







반응형

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

MyIntStack 클래스  (0) 2017.11.09
포인터의 증감  (0) 2017.11.09
float와 double  (0) 2017.11.05
히스토그램  (0) 2017.11.03
Circle, CircleManager 클래스  (0) 2017.11.03
반응형

인하대학교 전자공학과 데이터 구조 포인터, 어레이 과제 (pointer, array)


인하대학교 전자공학과 데이터 구조 하노이의 탑, 이진 탐색(binary search, tir, recursive)


인하대학교 전자공학과 데이터 구조 시스템 스택, 선형 리스트 (system stack, linear list)


인하대학교 전자공학과 데이터 구조 preorder, postorder, max heap


인하대학교 전자공학과 데이터 구조 dfs, bfs, 프림, 크루스칼 (prim, kruskal)


소스코드, 수도코드, 플로우차트(순서도), 분석 및 고찰, 결과창 등이 들어있는 보고서입니다.


전부 만점받은 보고서입니다. 

반응형
반응형

1. Array : Let’s assume that we have the following declaration:

1.1. Please store the above data using scanf() function in two 2-dimension array, respectively. You can show the result.

 

1.2. Please create a new array ‘element[2][3]’ to obtain the sum of the value of First array and Second array. For example,

element[1][2] = First[1][2]+Second[1][2].

element[2][1] = First[2][1]+Second[2][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
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
/*
    {{16,18,23},{54,91,11}}          {{24,52,77},{16,19,59}}
    1-1)Please store the above data using  function in two  2-dimension array, respectively. You can show the result.
    1-2)Please create a new array ‘Element[2][3]’ to obtain the sum of the value of First array and Second array. For example,
        Element[1][2] = First[1][2]+Second[1][2]. 
        Element[2][1] = First[2][1]+Second[2][1].
    ROW : 행 수 COL : 열 수
    array_input : 배열에 원소 값을 사용자가 입력할 수 있게 하는 함수
    array_print : 배열을 원소별로 출력해주는 함수
    array_sum   : 배열의 합을 구해주는 함수
    First[ROW][COL] : 2*3 사이즈의 2차원 배열1
    Second[ROW][COL] : 2*3 사이즈의 2차원 배열2
    Element[ROW][COL] : 2*3 사이즈의 2차원 배열, 동일한 위치의 First와 Second 의 원소의 합이 들어갈 배열
*/
#include <stdio.h>
#define ROW 2
#define COL 3
void array_input(int num,int array[][COL]);
void array_print(int num,int array[][COL]);
void array_sum(int array1[][COL],int array2[][COL],int array3[][COL]);
int main(void)
{
    int First[ROW][COL];
    int Second[ROW][COL];
    int Element[ROW][COL];
    array_input(1,First);
    array_input(2,Second);
    array_sum(First,Second,Element);
    printf("\n");
    array_print(1,First);
    printf("\n");
    array_print(2,Second);
    printf("\n");
    array_print(3,Element);
    return 0;
}
void array_input(int num,int array[][COL])
{
    int i;int j;
    printf("<%d번째 배열 입력>\n",num);
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
        printf("%d번배열[%d][%d] 값 입력 : ",num,i,j);
        scanf("%d",&array[i][j]);
        }
    }
}
void array_print(int num,int array[][COL])
{
    int i;int j;
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
        printf("%d번배열[%d][%d] : %d\n",num,i,j,array[i][j]);
        }
    }
}
void array_sum(int array1[][COL],int array2[][COL],int array3[][COL])
{
    int i;int j;
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
        array3[i][j]=array1[i][j]+array2[i][j];
        }
    }
}
cs

 

 


2. Pointer : Let’s assume the next arrangement was declared. Calculate the final value of the following expression:

2.1. *(**p+3), *(**p+1), p[0], **(p[1]+1), *(p[1] +1)

2.2. *text, *(text+3), *(text+7)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void)
{
    char *p[3][2]={"abcd","efgh","ijklm","nop","qrstuv","wxyz"};
    char *text;
    char more[]="Happy Holidays";
    text=&more[4]; //'y'의 주소
    printf("*(**p+3)=%c\n",*(**p+3));
    printf("*(**p+1)=%c\n",*(**p+1));
    printf("p[0]=%x\n",p[0]);
    printf("**(p[1]+1)=%c\n",**(p[1]+1));
    printf("*(p[1]+1)=%x\n",*(p[1]+1));
    printf("\n");
    printf("*text=%c\n",*text);
    printf("*(text+3)=%c\n",*(text+3));
    printf("*(text+7)=%c\n",*(text+7));
}
cs







반응형
반응형

4.4 다음 두 개의 static 메소드를 가진 ArrayUtility2 클래스를 만들어보자. ArrayUtility2 클래스를 이용하는 테스트용 프로그램도 함께 작성하라.


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
package HW1_JAVA;
class ArrayUtility2{//s1과 s2를 연결한 새로운 배열 리턴
    static int[] concat(int s1[], int s2[]){ //int형배열을 리턴으로하는 메소드 concat(인자 int형배열 2개)
        int conc[]=new int[s1.length+s2.length]; //s1과 s2 길이를 더한 길이를 갖는 인트형 배열 conc
        int i; //int 형 변수 i 선언
        for(i=0;i<conc.length;i++//i=0부터 conc의 길이보다 작을 때까지 반복
        {
            if(i<=4//i가  4 이하이면 conc[i]에 s1[i] 대입
            conc[i]=s1[i];
            else    //i가 5이상이면 conc[i]에 s2[i-5] 대입
            conc[i]=s2[i-5];
        }
        return conc;}  //conc 배열 리턴
    static int[] remove(int s1[], int s2[]){ //s1에서 s2 배열의 숫자를 모두 삭제한 새로운 배열 리턴
        int i; int j; //인트형 변수 i,j 선언
        int s3[]=new int[s1.length]; //s1.length의 길이를 갖는 배열 s3 선언
        LABEL : for(i=0;i<s1.length;i++//i는 0부터 s1.length 미만까지 반복
        {
            for(j=0;j<s2.length;j++//j는 0부터 s2.length 미만까지 반복
            {
                if(s1[i]==s2[j])  //s1[i]와 s2[j]가 같으면 루프 중단 후 LABEL로 점프(증가식은 진행됨)
                    continue LABEL;
            }
            s3[i]=s1[i]; //s3[i]에 s1[i] 대입
        }
        return s3;} } //배열 s3 리턴
public class ArrUse {
    public static void main(String[] args) {
        ArrayUtility2 ut=new ArrayUtility2(); //ArrayUtility2 class의 객체와 레퍼런스 변수 선언
        int a[]={1,2,3,4,5}; //int형 배열 a 선언 및 초기화
        int b[]={3,4,5,6,7}; //int형 배열 b 선언 및 초기화
        int c[]=new int[a.length+b.length]; //int형 배열 c 선언
        int d[]=new int[a.length]; //int형 배열 d 선언
        int i; //int형 변수 i 선언
        c=ut.concat(a, b); //배열 c에 concat 메소드의 리턴값 대입
        d=ut.remove(a, b); //배열 d에 remove 메소드의 리턴값 대입
        for(i=0;i<c.length;i++//i=0부터 c.length 미만까지 반복
        {
            System.out.print(c[i]+" "); //c[i]와 띄어쓰기 출력
        }
        System.out.println(); // 개행문자 출력
        for(i=0;i<d.length;i++//i=0부터 d.length 미만까지
        {
            if(d[i]!=0//int형 배열은 0으로 자동초기화 되기 때문에 출력안하려면 논리판별
            System.out.print(d[i]+" "); //d[i]와 띄어쓰기 출력
        }}}
 
cs






반응형

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

추상 클래스  (0) 2017.06.18
상속 클래스  (0) 2017.06.18
직사각형 클래스  (0) 2017.06.18
돈 단위 나누기  (0) 2017.06.18
2차원 배열  (0) 2017.06.18
반응형

3.11>배열과 반복문을 이용하여 프로그램을 작성해보자. 키보드에서 정수로 된 돈의 액수를 입력 받아 오만 원권, 만 원권, 천 원권, 500원짜리 동전, 100원짜리 동전, 50원짜리 동전, 10원짜리 동전, 1원짜리 동전이 각 몇 개로 변환되는지 출력하라. 예를 들어 65370이 입력되면 오만 원권 1, 만 원권 1, 천 원권 5, 100원짜리 동전 3, 50원짜리 동전 1, 10짜리 동전 2개이다. 이때 반드시 다음의 배열을 이용하고 반복문으로 작성하라.


int []unit={50000,10000,1000,500,100,50,10,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
package HW1_JAVA;
import java.util.Scanner//Scanner 클래스의 위치
class Sort{ //Sort 클래스 선언
    void sorting(int arr[], int gold){ //sorting 메소드 선언 인자 int형 배열 arr, int형 변수 gold
        int i;  int d;  //int형 변수 i, d 선언
        for(i=0;i<arr.length;i++//isms 0부터 배열 arr의 길이보다 작을 때까지
        {d=gold/arr[i]; //d는 gold를 arr[i]로 나눈 것의 몫
            if(d==0//d가 0이면 루프를 완전히 돌지 않고 i를 증가시킨 후 다시 돌게 만든다.
                continue;
            if(i<=2//i가 2 이하이면 원과 매로 출력
                System.out.println(arr[i]+"원권 "+d+"매");
            else  //i가 2초과이면 동전과 개로 출력
                System.out.println(arr[i]+"원짜리 동전 "+d+"개");
        gold%=arr[i];  // gold = gold % arr[i] 와 같다. (나머지)
        }    
    }
}
public class MoneyDivison { //class MoneyDivison 선언
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in); //Scanner 클래스 객체와 레퍼런스 변수 선언
        Sort so = new Sort(); //Sort 클래스 객체와 레퍼런스 변수 선언
        int []unit={50000,10000,1000,500,100,50,10,1}; // int형 배열 unit 선언과 초기화
        System.out.print("금액을 입력하세요>>");
        int gold=s.nextInt(); // int형 변수 gold 선언과 정수형 입력
        so.sorting(unit, gold); //sorting 메소드를 unit배열과 gold변수를 넣어 호출
    }
}
 
cs




반응형

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

ArrayUtility class  (0) 2017.06.18
직사각형 클래스  (0) 2017.06.18
2차원 배열  (0) 2017.06.18
정수 오름차순 정렬기  (0) 2017.06.18
하위 문자 모두 출력하기  (0) 2017.06.18
반응형

2.5>Scanner를 이용하여 정수를 3개 입력 받고 이 3개의 수로 삼각형을 만들 수 있는지를 판별하라. 삼각형이 가능하려면 두 변의 합이 다른 한 변의 합보다 반드시 커야 한다.


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
package HW1_JAVA; //패키지 이름
import java.util.Scanner// 스캐너 클래스의 위치
class triangle{    //triangle class 선언
    void make(int a, int b, int c){ //make 메소드, argument int형 변수 a,b,c
        int ar[]=new int[3]; int temp=0//int형 변수 ar[]선언(크기3), int형 변수 temp 선언및 초기화
        ar[0]=a;ar[1]=b;ar[2]=c; //배열 ar의 각 원소 초기화
        for(int i=0;i<3;i++)  //선택 정렬 알고리즘
        {
            for(int j=i+1;j<3;j++// 배열의 첫번째 원소부터 시작해 각각 한번씩 전부 비교한 후
            {// 뒤에 원소 크기가 피비교되는 원소보다 크면 둘의 자리를 바꿔준다
                if(ar[i]<ar[j])//다만 바로 바꿔주면 변수의 값 하나가 사라져 버리므로
                {            // 빈 물컵(temp)을 이용해 값을 교환해준다.
                    temp=ar[i];
                    ar[i]=ar[j];
                    ar[j]=temp;}}}
        if((ar[0]==0)||(ar[1]==0)||(ar[2]==0)) //변의 길이에 0을 입력한 경우 처리
            System.out.println("변의 길이는 0이 될 수 없습니다.");
        else if(ar[0]<ar[1]+ar[2]) // 삼각형의 형성 조건에 부합한 경우
            System.out.println("삼각형 세 변의 길이가 될 수 있습니다.");
        else //삼각형을 만들지 못한 경우
            System.out.println("삼각형 생성 불가능!!");
    }}
public class MakeTriangle {
    public static void main(String[] args) {
        int x=0int y=0int z=0;  //int 형 변수 x,y,z 선언 및 초기화
        Scanner s=new Scanner(System.in); // 레퍼런스 변수 s 와 Scanner 클래스의 오브젝트 생성
        triangle m=new triangle();//레퍼런스 변수 m과 triangle 클래스의 오브젝트 생성
        while(true){ // 무한 반복
        System.out.println("정수 3개를 입력하세요(-1 -1 -1은 종료)>>");
        x=s.nextInt(); y=s.nextInt(); z=s.nextInt(); //x,y,z를 int형으로 입력해준다.
        if((x==-1)||(y==-1)||(z==-1)) break// x,y,z가 -1일 경우 while문 탈출
        m.make(x, y, z);} //m이가리키는 오브젝트 내의 make 메소드 호출
    }}
 
cs




반응형

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

정수 오름차순 정렬기  (0) 2017.06.18
하위 문자 모두 출력하기  (0) 2017.06.18
직사각형 충돌  (0) 2017.06.18
윤년 판별기  (0) 2017.06.18
369 게임  (0) 2017.06.18
반응형

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
반응형

생명 게임(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
반응형

2차원 배열을 다른 2차원 배열로 복사하는 array_copy(char array1[], char array2[], int size) 함수를 구현하고 테스트하여 보라. 수행 속도를 위하여 배열 첨자 방법 대신에 포인터를 사용하라.


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 HEIGHT 5
#define WIDTH 10
void print(int array[][WIDTH]);
void copy(int array1[][WIDTH],int array2[][WIDTH]);
int main(void)
{    
    int image1[HEIGHT][WIDTH]={{0,0,0,0,9,0,0,0,0,0},
    {1,0,0,9,9,0,0,0,0,0},
    {5,0,9,0,9,0,0,0,0,4},
    {4,0,0,0,8,0,0,2,0,0},
    {3,0,0,0,9,0,0,0,0,8}};
    int image2[HEIGHT][WIDTH]={{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}};
    printf("이미지1 : \n");
    print(image1);
    printf("이미지2 : \n");
    print(image2);
    copy(image1,image2);
    printf("복사된이미지2 : \n");
    print(image2);
return 0;    
}
void print(int array[][WIDTH])
{
int i,j;
for(i=0;i<HEIGHT;i++)
        {for(j=0;j<WIDTH;j++)
        {
            printf("%3d ", array[i][j]);
        }
        printf("\n");
    }
}
void copy(int array1[][WIDTH],int array2[][WIDTH])
{
    int *p1, *endp1;
    int *p2;
    p1=&array1[0][0];
    p2=&array2[0][0];
    endp1=&array1[HEIGHT-1][WIDTH-1];
    while(p1<=endp1)
    {
        *p2=*p1;
        p1++;p2++;
    }
}
cs




반응형

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

소스에 대한 질문 답하기  (0) 2017.01.13
생명 게임(game of life - John H. Conway)  (0) 2017.01.13
디지털 영상  (0) 2017.01.06
학생 성적 평균 구하기  (0) 2017.01.06
내림차순 정렬  (0) 2017.01.06
반응형

디지털 영상은 보통 2차원 배열로 표현된다. 각 배열 원소는 픽셀이라고 불린다. 흑백 영상의 경우, 하나의 픽셀은 보통 0에서 255의 값을 가지며 0은 검정색을, 255는 흰색을 나타낸다. 영상이 unsigned char image[ROWS][COLS]에 저장되어 있다고 가정하고 몇가지의 간단한 영상 처리 연산들을 포인터를 이용하여 구현하여 보자. 영상 처리된 겨로가는 화면에 각 픽셀의 값을 숫자로 표시한다.

(a) : 이진화 : 각 픽셀의 값이 임계값보다 낮으면 0으로 만들고 임계값보다 높으면 255로 만든다. (나는 5이상이면 255,  5미만이면 0으로 하였음)

(b) : 반전 : 영상의 흑백을 반전시킨다.


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
#include <stdio.h>
#define HEIGHT 5
#define WIDTH 10
void print(int array[][WIDTH]);
void binarization(int array[][WIDTH]);
void reverse(int array[][WIDTH]);
int main(void)
{    
    int image[HEIGHT][WIDTH]={{0,0,0,0,9,0,0,0,0,0},
    {1,0,0,9,9,0,0,0,0,0},
    {5,0,9,0,9,0,0,0,0,4},
    {4,0,0,0,8,0,0,2,0,0},
    {3,0,0,0,9,0,0,0,0,8}};
    printf("원본 : \n");
    print(image);
    printf("이진화 : \n");
    binarization(image);
    print(image);
    printf("반전 : \n");
    reverse(image);
    print(image);
return 0;    
}
void print(int array[][WIDTH])
{
int i,j;
for(i=0;i<HEIGHT;i++)
        {for(j=0;j<WIDTH;j++)
        {
            printf("%3d ", array[i][j]);
        }
        printf("\n");
    }
}
void binarization(int array[][WIDTH])
{
    int *p, *endp;
    p=&array[0][0];
    endp=&array[HEIGHT-1][WIDTH-1];
    while(p<=endp)
    {
        if(*p>=5)
            {*p=255;}
        else if(*p<5)
            {*p=0;}
        p++;
    }
}
void reverse(int array[][WIDTH])
{
    int *p, *endp;
    p=&array[0][0];
    endp=&array[HEIGHT-1][WIDTH-1];
    while(p<=endp)
    {
        if(*p==0)
            {*p=255;}
        else if(*p==255)
            {*p=0;}
        p++;
    }
}
cs




반응형

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

생명 게임(game of life - John H. Conway)  (0) 2017.01.13
2차원 배열 복사  (0) 2017.01.06
학생 성적 평균 구하기  (0) 2017.01.06
내림차순 정렬  (0) 2017.01.06
가장 큰 값  (0) 2017.01.05
반응형

학생들의 성적이 scores라는 2차원 배열에 저장되어 있다고 가정하자. scores의 행은 한 학생에 대한 여러 번의 시험 성적을 나타낸다. scores의 열은 한 시험에 대한 여러 학생들의 성적이다. 학생별로 성적의 평균을 구하려고 한다. 2차원 배열의 각 행이 1차원 배열임을 이용하여 다음과 같이 1차원 배열의 평균을 구하는 함수 get_average()를 호출하여 각 학생에 대한 평균 성적을 계산하여 보라.


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 ROW 3
#define COL 4
double get_average(int list[], int n);
int main(void)
{
    int scores[ROW][COL]={{90,90,90,90},{80,80,80,80},{70,70,70,70}};
    int i;
    double value;
    value=0;
    for(i=0;i<ROW;i++)
    {
    value=get_average(scores[i],COL); //2차원배열이라서 scores[i]는 포인터, scores도 포인터
    printf("%d번째 학생의 평균 : %lf\n", i,value);
    }
    return 0;
}
double get_average(int list[], int n)
{
int average=0;
int i;
for(i=0;i<n;i++)
{
average+=*(list+i);  //list[i]
}
average/=n;
return average;
}
cs




반응형

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

2차원 배열 복사  (0) 2017.01.06
디지털 영상  (0) 2017.01.06
내림차순 정렬  (0) 2017.01.06
가장 큰 값  (0) 2017.01.05
문자열의 배열 출력  (0) 2017.01.05
반응형

문자열을 가리키고 있는 포인터의 배열을 인수로 받아서 문자열을 알파벳 순으로 정렬시키는 함수 sort_strings()를 작성하고 테스트하여 보라. 다음과 같은 원형을 가진다.


진짜 오래걸렸네요.. 괄호 안쳐서 2시간동안 해맸네요 짜증... ㅜ,ㅜ

각 포인터가 배열이니까 첫글자만 비교해서 서로 교환해주면 됩니다.. (교환하기 위해선 빈 물 컵이 있어야 한다는 것.. 잊지 않으셨죠??)

string[0] 은 포인터 string 은 이중포인터 tmp는 포인터 .. 점점 더 헷갈리는 느낌입니다.

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
#include <stdio.h>
#define SIZE 3
void sort_strings(char *s[], int size);
int main(void)
{
    char *string[SIZE]={"mycopy","src","dst"};
    int i;
    sort_strings(string,SIZE);
    for(i=0;i<SIZE;i++)
    {
    printf("%d번째 문자열 : %s\n", i, string[i]);
    }
    return 0;
}
void sort_strings(char *s[], int size)
{
    int i, j;
    char *tmp=NULL;
    for(i=0;i<size;i++){
    for(j=i+1;j<size;j++)
    {
    if(*s[i]>*s[j])
        {tmp=s[i];
    s[i]=s[j];
    s[j]=tmp;}
    }}
}
cs





반응형

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

디지털 영상  (0) 2017.01.06
학생 성적 평균 구하기  (0) 2017.01.06
가장 큰 값  (0) 2017.01.05
문자열의 배열 출력  (0) 2017.01.05
2차원 배열 합  (0) 2017.01.04
반응형

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
반응형

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