[C/C++] C++ 수업내용 Pointer

Posted in 단체/ㄴ대학 전공 수업 by

#include <iostream>

using namespace std;

int main(){

  
 char s1[10];
 char *s2 = "Hello!";

 s1 = s2;                     // s1도 주소이고 s2도 주소인데 왜 Error가 날까?
                                     s1은 포인터가 아닌 배열자체 이므로 s2의 주소를 s1에
                                     넣는다고 하면 배열의 구조가 없어지게 되고 포인터가
                                     되므로 선언한 것과 모순되기 때문에 Error가 나는 것이다.
 

/*
char s1[10] = "Hello!";
 char *s2;

 s2 = s1;                     // s1의 구조는 배열이지만 s1자체로는 주소를 의미하므로 
                                     s2 포인터 자체에 입력이 가능하다.
*/

 //for(int i=0; (s1[i] = s2[i])!='\0'; i++);
                                 // s2 포인터의 배열은 * (s2 + i) 를 의미(대채가능)하므로
                                     선언가능하다.

 //for(; (*s1++ = *s2++)!='\0';);
                                 // *s1++ 이 안되는 이유는 배열의 이름(s1)는 Constant이기
                                     떄문이다. 즉 참조만 가능하고 수정은 불가능하다.
                                     위의 *s1++은 s1++이 먼저 실행되기 떄문에 주소값 자체를
                                     수정하는 것이라서 Error가 난다.
 
 cout<<"s1 = "<<s1<<endl;
 cout<<"s2 = "<<s2<<endl;

 return 0;
}

-------------------------------------------------------------------------------
#include <iostream>

using namespace std;

int main(){

 char s1[10] = "Hello!";
 char *s2;

 s2 = s1;
 
 cout<<"s2 = "<<s2<<endl;
 cout<<"s2 = "<<*s2<<endl;
 cout<<"s2 = "<<&s2<<endl;

 return 0;
}

결과값 :
s2 = Hello!
s2 = H
s2 = 0012FF70
Press any key to continue

[C/C++] C++ 수업내용 10/2

Posted in 단체/ㄴ대학 전공 수업 by

const 변수로 선언된 students, exams을 2차원 배열로 동적 할당을 하여 입력한 시점에서 2차원 배열이 설정하도록 하였다.    

   #include <iostream>
     
    using std::cout;
    using std::endl;
    using std::cin;
    using std::fixed;
    using std::left;
     
    #include <iomanip>
   
    using std::setw;
    using std::setprecision;
   
    // function prototypes
    int minimum( int **, int, int );
    int maximum( int **, int, int );
    double average( int [], int );
    void printArray( int **, int, int );

    int main()
    {
       int students;   // number of students
       int exams;      // number of exams
       int i=0, j=0;

       cin>>students;
       cin>>exams;

       // initialize student grades for three students (rows)
       int ** studentGrades = new int* [students];

       for(i=0; i<students; i++)
            studentGrades[i] = new int [exams];
      
       for(i=0; i<students; i++)
           for(j=0; j<exams; j++)
               cin>>studentGrades[i][j];
   
       // output array studentGrades
       cout << "The array is:\n";
       printArray( studentGrades, students, exams );
   
       // determine smallest and largest grade values
       cout << "\n\nLowest grade: "
            << minimum( studentGrades, students, exams )
            << "\nHighest grade: "
            << maximum( studentGrades, students, exams ) << '\n';
   
       cout << fixed << setprecision( 2 );
   
       // calculate average grade for each student
       for ( int person = 0; person < students; person++ )
          cout << "The average grade for student " << person
               << " is "
               << average( studentGrades[ person ], exams )
               << endl;

       if(studentGrades){
           for(i=0; i<students; i++)
               delete[] studentGrades[i];
           delete[] studentGrades;
       }
   
       return 0;  // indicates successful termination
   
    } // end main
   
    // find minimum grade
    int minimum( int ** grades, int pupils, int tests )
    {
       int lowGrade = 100; // initialize to highest possible grade
   
       for ( int i = 0; i < pupils; i++ )
   
          for ( int j = 0; j < tests; j++ )
   
             if ( grades[ i ][ j ] < lowGrade )
                lowGrade = grades[ i ][ j ];
   
       return lowGrade;
   
    } // end function minimum
   
    // find maximum grade
    int maximum( int ** grades, int pupils, int tests )
    {
       int highGrade = 0;  // initialize to lowest possible grade
   
       for ( int i = 0; i < pupils; i++ )
   
          for ( int j = 0; j < tests; j++ )
   
             if ( grades[ i ][ j ] > highGrade )
                highGrade = grades[ i ][ j ];
   
       return highGrade;
   
    } // end function maximum
   
    // determine average grade for particular student           
    double average( int setOfGrades[], int tests )              
    {                                                           
       int total = 0;                                           
                                                                
       // total all grades for one student                      
       for ( int i = 0; i < tests; i++ )                        
          total += setOfGrades[ i ];                            
                                                                
       return static_cast< double >( total ) / tests;  // average
                                                                
    } // end function maximum
        
  // Print the array
  void printArray( int ** grades, int pupils, int tests )
  {
     // set left justification and output column heads
     cout << left << "                 [0]  [1]  [2] ";
 
     // output grades in tabular format
     for ( int i = 0; i < pupils; i++ ) {
 
        // output label for row
        cout << "\nstudentGrades[" << i << "] ";
 
        // output one grades for one student
        for ( int j = 0; j < tests; j++ )
           cout << setw( 5 ) << grades[ i ][ j ];
 
     } // end outer for
 
  } // end function printArray

-------------------------------------------------------------------------------
원본

    #include <iostream>
    
    using std::cout;
    using std::endl;
    using std::fixed;
    using std::left;
     
    #include <iomanip>
   
    using std::setw;
    using std::setprecision;
   
    const int students = 5;   // number of students
    const int exams = 3;      // number of exams
   
    // function prototypes
    int minimum( int [][ exams ], int, int );
    int maximum( int [][ exams ], int, int );
    double average( int [], int );
    void printArray( int [][ exams ], int, int );

    int main()
    {
       // initialize student grades for three students (rows)
       int studentGrades[ students ][ exams ];
      
       for(int i=0; i<students; i++)
           for(int j=0; j<exams; j++)
               cin>>studentGrades[i][j];
   
       // output array studentGrades
       cout << "The array is:\n";
       printArray( studentGrades, students, exams );
   
       // determine smallest and largest grade values
       cout << "\n\nLowest grade: "
            << minimum( studentGrades, students, exams )
            << "\nHighest grade: "
            << maximum( studentGrades, students, exams ) << '\n';
   
       cout << fixed << setprecision( 2 );
   
       // calculate average grade for each student
       for ( int person = 0; person < students; person++ )
          cout << "The average grade for student " << person
               << " is "
               << average( studentGrades[ person ], exams )
               << endl;
   
       return 0;  // indicates successful termination
   
    } // end main
   
    // find minimum grade
    int minimum( int grades[][ exams ], int pupils, int tests )
    {
       int lowGrade = 100; // initialize to highest possible grade
   
       for ( int i = 0; i < pupils; i++ )
   
          for ( int j = 0; j < tests; j++ )
   
             if ( grades[ i ][ j ] < lowGrade )
                lowGrade = grades[ i ][ j ];
   
       return lowGrade;
   
    } // end function minimum
   
    // find maximum grade
    int maximum( int grades[][ exams ], int pupils, int tests )
    {
       int highGrade = 0;  // initialize to lowest possible grade
   
       for ( int i = 0; i < pupils; i++ )
   
          for ( int j = 0; j < tests; j++ )
   
             if ( grades[ i ][ j ] > highGrade )
                highGrade = grades[ i ][ j ];
   
       return highGrade;
   
    } // end function maximum
   
    // determine average grade for particular student           
    double average( int setOfGrades[], int tests )              
    {                                                           
       int total = 0;                                           
                                                                
       // total all grades for one student                      
       for ( int i = 0; i < tests; i++ )                        
          total += setOfGrades[ i ];                            
                                                                
       return static_cast< double >( total ) / tests;  // average
                                                                
    } // end function maximum
        
  // Print the array
  void printArray( int grades[][ exams ], int pupils, int tests )
  {
     // set left justification and output column heads
     cout << left << "                 [0]  [1]  [2] ";
 
     // output grades in tabular format
     for ( int i = 0; i < pupils; i++ ) {
 
        // output label for row
        cout << "\nstudentGrades[" << i << "] ";
 
        // output one grades for one student
        for ( int j = 0; j < tests; j++ )
           cout << setw( 5 ) << grades[ i ][ j ];
 
     } // end outer for
 
  } // end function printArray

[C/C++] c++ 2차원 배열 동적 할당

Posted in 단체/ㄴ대학 전공 수업 by

#include <iostream>

using namespace std;

int main(){
    int i=0, j=0;
    int students, exams;

    cin>>students;
    cin>>exams;

    int **std = new int* [students];
    for(i=0; i<students; i++)
        std[i] = new int[exams];

    for(i=0; i<students; i++)
        for(j=0; j<exams; j++)
            std[i][j] = j;

    for(i=0; i<students; i++){
        for(j=0; j<exams; j++)
            cout<<std[i][j];
        cout<<endl;
    }

    if(std){
        for(i=0; i<students; i++)
            delete[] std[i];
        delete[] std;
    }

    return 0;
}

결과값 :

5 3                   // 입력 값 : 5 3
012                  // 출력값들
012
012
012
012
Press any key to continue

[C/C++] 랜덤(random) 값의 발생과 초기화

Posted in 단체/ㄴ대학 전공 수업 by

1. VC++ 컴파일러 환경에서 랜덤 값을 발생시키기 위한 함수로 rand()를 제공한다.
   rand()함수는 0부터 RAND_MAX(32767로 정의)까지의 숫자 중에서 임의의 숫자를
   돌려준다.

2. RAND_MAX는 헤더 파일 <stdlib.h>에 아래와 같이 상수로 정의되어 있다.
            #define RAND_MAX 0x7FFF

3. rand() 함수를 초기화해주지 않으면 매번 실행할 때마다 똑같은 순서의 숫자들이
   생성된다. 따라서 rnad() 함수를 사용하기 전에 srand() 함수를 이용해서 초기화를
   해야 한다. srand() 함수는 seed로 임의의 정수를 지정할 수 있는데, time() 함수로
   시스템의 시간을 구한 후 이를 seed 값으로 사용하면 항상 seed가 달라지기
   때문에 일반적으로 아래와 같이 사용한다.
            seed = time(NULL);
            srand(seed);
            == srand(time(NULL)); 위의 2개를 이와 같이 써도 무방하다.

4. rand(), srand() 함수를 사용하기 위해서는 반드시 <stdlib.h> 파일을 헤더 파일로
   삽입해야 한다. 또한 time() 함수를 사용하기 위해서는 반드시 <time.h> 파일을
   헤더 파일로 삽입해야 한다.

5. 특정 범위의 랜덤 값을 발생시키기 위해서는 나머지 연산자와 덧셈을 이용한다.
  - 0부터 9까지의 숫자를 발생  : rand() % 10                     // 0~9
  - 1부터 10까지의 숫자를 발생 : (rand() % 10) + 1             // (0~9)+1 => 1~10
  - a부터 b까지의 숫자를 발생  : (rand() % (b-a+1)) + a     // (0~b-a)+a => a~b

[C/C++] delay, Sleep, toupper, tolower 함수

Posted in 단체/ㄴ대학 전공 수업 by

Ⅰ. Delay 함수 & Sleep 함수

1. delay()

 - 원형 void delay(unsigned milliseconds); // milliseconds 는 1/1000초

 - ex) delay(1000);         // 1초 동안 지연

2. Sleep()

 - 원형 void sleep(unsigned seconds); // seconds 는 1초

 - ex) sleep(10);         // 10초 동안 지연

#include<windows.h> 해야한다...


Ⅱ. toupper 함수 & tolower 함수

1. toupper() - 소문자를 대문자로 변환
2. tolower() - 대문자를 소문자로 변환

[과제] Automatic Photo Pop-up

Posted in 단체/ㄴ대학 전공 수업 by

컴퓨터 그래픽스 첫번째 과제...
컴퓨터 그래픽에 관한 최신기술을 조사하여 ppt로 작성하는 것인데요.
검색하면서 찾아보는데, 그래픽 카드가 어쩌구... 이런 내부적인 기술만 나오고
외적으로 머머가 발전했다~ 이런건 교수님이 말한것 빼곤(말한건 안된다해서),
아무리 찾아봐도 안나오는것 같네요... ㅡㅡ;
찾다찾다, 신기한 기술 2D 이미지를 3D화 시켜주는 기술을 찾았습니다. lol
기술이 좀 어설픈 감이 없지않아 있지만 그래도 할게없으니... 이걸로 선택해서 검색하며 자료를 모아보는데, 다 내용이 영어야!!
내용 해석이 안되서 ppt와 내용을 고x대학 어느분이 Automatic Photo Pop-up에 대한 ppt 하신걸 가지고와 인용해서 사용좀 했습니다. JungLee님 사랑해요♡~


이 파일에 모든내용이 다들어있는거 같은데 읽질 못해서...ㅜ




Ⅰ. 알고리즘 개요 및 효과

 ⑴ 한 장의 이미지로부터 3차원 모델을 자동생성
     → 여러 개의 빌보드(Billboard) 이용
     → 아동용 Pop-up Book Illustration 효과
 ⑵ 장면 내의 방향으로부터 판단되는 기하 클래스를 모델링
     → 입력 이미지의 각 부분을 Labeling
       cf) 바닥면, 하늘, 수직면, ...
 ⑶ 광범위한 장면에 대하여 매우 잘 동작함
 ⑷ 모든 이미지에 대하여 잘 동작하는 것은 아님

     → 접근방식의 내재적인 모호함과 통계적인 속성 떄문


Ⅱ. 발생되는 문제

 ⑴ 복잡한 장면
     ex) 수많은 나무나 사람이 포함된 장면
          → 일일이 레이블하기 어려움
 
⑵ 경사진 면에 대한 고려 부재
 ⑶ 다중의 Ground-Parallel 면에 대응하기 어려움

      ex) 계단
 ⑷ 레이블 오류
 ⑸ 수직 영역으로 표기된 부분의 중복
 ⑹ 수평선 추청 오류
 
 

Ⅲ. 결론 및 향후연구
 
 ⑴ 실외의 2차원 이미지에서 보기에 그럴듯한 3차원 물체를 자동 생성
 ⑵ 아직 자동 Single-View 복원에서 풀어야 할 문제가 많음

     → Segmentation 기법 향상
     → 이미지로부터 수직영역의 회전 방향 추정
     → 실내의 장면에까지 확장