'분류 전체보기'에 해당되는 글 84건

  1. 2010.06.12 구조체
  2. 2010.06.12 vim 사용법
  3. 2010.06.10 Qt Creator Manual
  4. 2010.06.10 c++ 0610
  5. 2010.06.09 버블 정렬 c 0609
  6. 2010.06.08 다중포인터
  7. 2010.06.08 c++0608
  8. 2010.06.06 Qt Compile
  9. 2010.06.06 16진수 0xffffffff의 값 (signed and unsigned)
  10. 2010.06.06 형식 지정자

구조체

|
#사용자 정의 자료형 (typedef)
새로운 자료형을 정의하는데 사용한다.
긴 이름의 자료형을 짧게 정의할 수 있다. 

정의 예)
typedef unsigned char BYTE;
typedef unsigned WORD;
typedef int VECTOR[3];
크기가 3인 int형 배열을 VECTOR라는 자료형으로 정의
typedef char* STRNIG;
문자를 가리키는 포인터형을 STRING이라는 자료형으로 정의

선언 예)
BYTE ch;
WORD aword;
VECTOR matrix3;
크기가 3인 int형 배열 matrix3을 선언하였다. 총 12바이트의 메모리 공간을 차지한다.
STRING aString;
char형 포인터 변수 aString을 선언하였다. 포인터 변수이므로 4바이트의 메모리 공간을 차지한다.


#구조체
배열 :
의미상 서로 연관된 자료형이 동일한 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 배열이름[index]를 사용한다.

구조체 :
의미상 서로 연관이 되지만 자료형이 서로 다른 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 구조체 변수이름.멤버이름를 사용한다.

구조체와 배열을 서로 중첩하여 정의할 수 있어 복잡한 구조의 자료를 효울적으로 구성할 수 있다.

1) 구조체의 원형을 정의한 후, 변수를 선언하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
};

struct student st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

2) 구조체의 원형과 변수의 선언을 동시에 하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
} st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

3) 구조체의 원형을 정의한 후, 단 한 번만 변수로 사용하는 방법 (태그 없음)
struct {
    char name[20];
    int english;
    int math;
} st1;
구조체 변수 st1은 만들어졌으나 struct 뒤에 태그가 없어 Noname Type이 되어 st2를 만들 수 없다.
만드려면 아래와 같은 방법이 있다.
struct {
    char name[20];
    int english;
    int math;
} st1, st2;

struct {
    char name[20];
    int english;
    int math;
} st1;
struct {
    char name[20];
    int english;
    int math;
} st2;


4) typedef을 이용하여 구조체의 자료형을 새로운 자료형으로 정의하는 방법 (struct를 생략할 수 있음, 가장 많이 사용)
typedef struct _student {
    char name[20];
    int english;
    int math;
} student;
student st1;


#구조체의 초기화
typedef struct {
    int x;
    int y;
} POINTER;
POINTER p1 = { 0, 0 };
POINTER p2 = { 0, 0 };
초기값이 구조체 멤버의 자료형과 일치해야 한다.

배열은 복사가 불가능하지만 구조체는 복사가 가능하다. 따라서 다음과 같이 할 수 있다.
POINTER p1 = { 0, 0 };
p2 = p1;


#구조체 배열
일반적으로 구조체는 구조체 배열이나 연결리스트의 노드로 많이 사용된다.
typedef struct {
    char name[15];
    char countryp20];
    int age;
} STUDENT;

STUDENT st[5];


#구조체 포인터
구조체 변수의 시작주소를 값으로 저장한다. 
typedef struct {
    char name[15];
    char country[20];
    int age;
} STUDENT;

STUDENT *sp;

구조체 멤버 접근 방법
1) (*sp).name = "Jack";
2) sp->name = "Jack";
2)의 방법을 많이 쓴다.


#구조체와 함수
1) 구조체 변수의 멤버를 함수의 인수로 전달하는 경우
인수의 갯수가 많아진다.

2) 구조체 변수를 함수의 인수로 전달하는 경우
구조체 변수 전체의 값이 전달되므로 구조체의 용량이 큰 경우 좋지 않다.

3) 구조체 변수의 주소를 인수로 전달하는 경우
인수의 갯수도 많지 않으며, 값이 아닌 시작주소만 전달되므로 인수 1개당 4바이트만 차지한다.


#구조체 변수는 복사가 가능하고 배열은 복사가 불가능한 이유
구조체는 변수이므로 메모리 공간을 의미한다. 따라서 '메모리 공간 = 메모리 공간'이 되어 대입이 가능하다.
반면에 배열은 이름 자체가 배열의 시작주소를 의미한다. 따라서 '주소 = 주소'가 되어 대입이 불가능하다.
따라서 for문을 이용하여 복사한다. 단, 문자 배열인 경우는 strcpy()를 사용할 수 있다.


#구조체 사이즈 출력
구조체에 멤버를 선언하면 4바이트보다 작은 멤버는 같이 묶여 4바이트 내에 할당된다.
char, char, short --> 4바이트
short, char, char --> 4바이트
char, short, char --> 8바이트



구조체 자체는 새로 정의한 타입 자체이므로 구조체 타입으로 만든 변수가 아닌 구조체 자체는 메모리에 할당되지도 않으며, 따라서 값 자체를 가지지 못한다.





















'C' 카테고리의 다른 글

포인터 상수  (0) 2010.06.24
문자열  (0) 2010.06.13
버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
And

vim 사용법

|




#설치
우분투 : 
$ sudo apt-get install vim

윈도우 : 
Download path : 



'VIM 강좌' 카테고리의 다른 글

용어 tabstop shiftwidth  (0) 2010.08.23
folding  (0) 2010.08.15
ctags & cscope  (0) 2010.08.15
And

Qt Creator Manual

|
[File] - New File or Project... Ctrl+N

Projects
Qt4 Gui Application

Introduction and project location
Name: test
Create in: Project
Next click!

Select required modules
Next click!

Class Information
Class name: MyTest
Base class: QWidget
Header file: mytest.h
Source file: mytest.cpp
Generate form: non-checked
Form file: Inactive
Next click!

Project management
Finish click!

Projects
├test.pro ---------- 프로젝트 정보를 담고 있는 파일. Qt Creator에서 컴파일하려면 반드시 프로젝트를 생성해야 함.
├Headers ----------- 헤더 파일 폴더
│  └mytest.h -------- mytest 클래스의 헤더 파일
└Sources ----------- 소스 파일 폴더 ├main.cpp -------- main() 함수가 구현된 소스 파일
└mytest.cpp ------ mytest 클래스 소스 파일


─ │├ 

'Qt' 카테고리의 다른 글

qt 메뉴 등록  (0) 2010.09.23
[Qt Designer] 확장 다이얼로그  (0) 2010.09.22
Qt Designer  (0) 2010.09.18
Qt Compile  (0) 2010.06.06
And

c++ 0610

|


#함수 오버로딩
같은 이름의 함수를 여러 개 쓸 수 있다.
C는 함수의 이름으로만 심볼을 생성하기 때문에 동일한 이름의 함수를 사용할 수 없다.
C++는 함수의 이름에 시그니처(매개변수의 타입과 갯수, 리턴 타입은 포함되지 않음)에 대한 정보를 추가하여 심볼을 생성하기 때문에 동일한 이름의 함수를 사용할 수 있다.

오버로딩이 가능한 경우
1. 매개변수 갯수는 같지만 타입이 다른 경우
2. 매개변수 타입은 같지만 갯수가 다른 경우

오버로딩이 불가능한 경우
1. 두 함수의 매개변수가 각각 일반 자료형, 레퍼런스형인 경우 이 둘의 실인자의 구별이 불가능하다.
2. 두 함수의 리턴 타입만 다른 경우 이 둘의 실인자의 구별이 불가능하다.

함수 찾는 순서
1. Exact Match
2. Promotion
3. Standard Conversions
4. User-defined Conversions

#디폴트 인자
디폴트 인자는 항상 오른쪽부터 설정한다. 그래야만 함수의 인자들을 왼쪽부터 넣어도 문제가 없다.

오버로딩과 디폴트 인자의 충돌
void Ambiguous(int a, int b = 100);
void Ambiguous(int a);
void Ambiguous(10);

#동적 메모리 할당
컴파일 타임에는 크기를 알 수 없으며, 런 타임에 할당할 메모리의 크기가 결정되어 할당하는 방식
할당과 해제의 시점이 자유롭다.
함수 내에서 할당한 경우, 함수가 종료되더라도 Heap 영역에 남아있다.

Data 영역 - 전역 변수, Static 변수가 할당된다. 프로그램 시작시 할당, 프로그램 종료시 해제.
BBS 영역 - Data 영역에 포함된 영역. 초기화하지 않은 전역 변수가 할당된다.
Heap 영역 - 동적 할당에 사용되는 메모리
Stack 영역 - 지역변수가 할당된다. 함수 시작시 할당, 함수 종료시 해제.

main() 함수가 아닌 다른 함수에서 동적메모리를 할당하고 해제하지 않은 경우에는 반드시 그 포인터 변수를 main() 함수로 넘겨주어야 메모리 해제가 가능하다??















'C++' 카테고리의 다른 글

C++ 생성자  (0) 2010.08.13
생성자와 소멸자  (0) 2010.08.13
c++ 오버라이딩  (0) 2010.07.03
동적 할당 0614  (0) 2010.06.14
c++0608  (0) 2010.06.08
And

버블 정렬 c 0609

|
ㄹㄹ
ㄹㄹ
버블 정렬
#include <stdio.h>

void bubble_sort(int array[], int count);
void swap(int *px, int *py);
void printVector(int V[], int n);

int main()
{
	int vector[5] = {5, 4, 3, 2, 1};
	bubble_sort(vector, 5);

	return 0;
}

void bubble_sort(int array[], int count)
{
	int i;
	int j;

	for (i = 0; i < count - 1; ++i)
	{
		for (j = 0; j < count - 1 - i; ++j)
		{
			if (array[j] > array[j+1])
			{
				swap(&array[j], &array[j+1]);
				printVector(array, 5);
			}
		}
		printf("\n");
	}
}

void swap(int *px, int *py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}

void printVector(int V[], int n)
{
	int i;
	for (i = 0; i < n; ++i)
	{
		printf("%5d", V[i]);
	}
	printf("\n");
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    4    5    3    2    1
    4    3    5    2    1
    4    3    2    5    1
    4    3    2    1    5

    3    4    2    1    5
    3    2    4    1    5
    3    2    1    4    5

    2    3    1    4    5
    2    1    3    4    5

    1    2    3    4    5









#include <stdio.h>

int main()
{
    int i, j;
    int array[3][4] = {
    	{15, 23, 45, 56},
    	{34, 53, 76, 23},
    	{98, 29, 48, 43}};

    int *p = *array;

    for (i = 0; i < 12; ++i)
    {
    	printf("%d ", *(p+i));
    }
    printf("\n");

    return 0;
}





배열과 포인터 값과 주소 관계
#include <stdio.h>

int main()
{
	int i, j;
	int array[3][4] = {
		{15, 23, 45, 56},
		{34, 53, 76, 23},
		{98, 29, 48, 43}};

	int *p = *array;

	for (i = 0; i < 12; ++i)
	{
		printf("%d ", *(p+i));
	}
	printf("\n");

	printf("%p\n", &array[4]);
	printf("%p\n", array+4);
	printf("\n");

	printf("%p\n", array);
	printf("%p\n", array[0]);
	printf("%p\n", &array[0][0]);
	printf("\n");

	printf("%p\n", &array[0][0]);
	printf("%p\n", &array[1][0]);
	printf("%p\n", &array[2][0]);
	printf("\n");

	printf("%p\n", array[0]);
	printf("%p\n", array[1]);
	printf("%p\n", array[2]);
	printf("\n");

	printf("%p\n", array+0);
	printf("%p\n", array+1);
	printf("%p\n", array+2);
	printf("\n");

	printf("%p\n", &array+0);
	printf("%p\n", &array+1);
	printf("%p\n", &array+2);
	return 0;
}


Output:
15 23 45 56 34 53 76 23 98 29 48 43 
0xbf560034
0xbf560034

0xbf55fff4
0xbf55fff4
0xbf55fff4

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560024
0xbf560054



'C' 카테고리의 다른 글

문자열  (0) 2010.06.13
구조체  (0) 2010.06.12
다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
형식 지정자  (0) 2010.06.06
And

다중포인터

|




다중포인터
#include <stdio.h>

int main()
{
    int i = 100;
    int *p = &i;
    int **pp = &p;
    int ***ppp = &pp;

    printf("     i = 100; --> i = %d\n", i);

    *p = 90;
    printf("    *p =  90; --> i =  %d\n", i);

    **pp = 80;
    printf("  **pp =  80; --> i =  %d\n", i);

    ***ppp = 70;
    printf("***ppp =  70; --> i =  %d\n", i);

    return 0;
}

Result--------------------------------------------------------------------------------------------------------------

     i = 100; --> i = 100
    *p =  90; --> i =  90
  **pp =  80; --> i =  80
***ppp =  70; --> i =  70

Result--------------------------------------------------------------------------------------------------------------















'C' 카테고리의 다른 글

구조체  (0) 2010.06.12
버블 정렬 c 0609  (0) 2010.06.09
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
형식 지정자  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
And

c++0608

|


#namespace

하나의 프로그램에 같은 이름의 변수, 함수, 클래스 등이 있으면 안된다.

이러한 것을 막기 위해 namespace를 사용한다.

main() 함수 위에 선언되어 있어야 한다.

정의
namespace NAME
{
변수, 함수, 클래스 정의
...
}

namespace를 정의한 후 그 안에 포함된 것을 사용하기 위해서는
NAME::변수, NAME::함수, NAME::클래스 등과 같이 사용한다.

1) 개별적으로 줄여서 사용하는 방법
using NAME::myfunc;
2) 네임스페이스 자체를 기본으로 설정
using namespace NAME;




#include <iostream>

using namespace std;

namespace A
{
    void showTest()
    {
        cout << "namespace A test" << endl;
    }
}

namespace B
{
    void showTest()
    {
        cout << "namespace B test" << endl;
    }
}

using B::showTest;

int main()
{
    A::showTest();
    showTest();

    return 0;
}

Result--------------------------------------------------------------------------------------------------------------

namespace A test
namespace B test

Result--------------------------------------------------------------------------------------------------------------




레퍼런스

변수의 별명, 변수처럼 사용

포인터는 메모리가 할당되나 레퍼런스는 메모리가 할당되지 않고 해당변수의 별명으로만 추가될 뿐이다.

반드시 초기화해야 하며, 초기화 시에 상수를 대입할 수 없다.

한 번 초기화하면 초기화 시에 대입했던 변수 이외의 변수의 별명으로 바뀌지 않는다.









'C++' 카테고리의 다른 글

C++ 생성자  (0) 2010.08.13
생성자와 소멸자  (0) 2010.08.13
c++ 오버라이딩  (0) 2010.07.03
동적 할당 0614  (0) 2010.06.14
c++ 0610  (0) 2010.06.10
And

Qt Compile

|
Qt Compile (Windows)

>qmake -project
>qmake main.pro
>mingw32-make

예제1) Hello Qt!
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton hello("Hello world!");
    hello.resize(100, 30);

    hello.show();
    return app.exec();
}

예제2) Quit
#include <QApplication>
#include <QFont>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton quit("Quit");
    quit.resize(75, 30);
    quit.setFont(QFont("Times", 18, QFont::Bold));

    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

    quit.show();
    return app.exec();
}

예제3) QWidget
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;
    window.resize(200, 120);

    QPushButton quit("Quit", &window);
    quit.setFont(QFont("Times", 18, QFont::Bold));
    quit.setGeometry(10, 40, 180, 40);
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

    window.show();
    return app.exec();
}

예제4) MyWidget
#include <QApplication>
#include <QFont>
#include <QPushButton>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(200, 120);

    QPushButton *quit = new QPushButton("Quit", this);
    quit->setGeometry(62, 40, 75, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

예제5) LCD display
#include <QApplication>
#include <QFont>
#include <QLCDNumber>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton("Quit");
    quit->setFont(QFont("Times", 18, QFont::Bold));

    QLCDNumber *lcd = new QLCDNumber(2);

    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 99);
    slider->setValue(0);

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addWidget(lcd);
    layout->addWidget(slider);
    setLayout(layout);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

예제6) Layout
#include <QApplication>
#include <QFont>
#include <QGridLayout>
#include <QLCDNumber>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QWidget>

class LCDRange : public QWidget
{
public:
    LCDRange(QWidget *parent = 0);
};

LCDRange::LCDRange(QWidget *parent)
    : QWidget(parent)
{
    QLCDNumber *lcd = new QLCDNumber(2);
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 99);
    slider->setValue(0);
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(lcd);
    layout->addWidget(slider);
    setLayout(layout);
}

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton("Quit");
    quit->setFont(QFont("Times", 18, QFont::Bold));
    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

    QGridLayout *grid = new QGridLayout;
    for (int row = 0; row < 4; ++row) {
    	for (int column = 0; column < 4; ++column) {
    		grid->addWidget(new LCDRange, row, column);
    	}
    }

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addLayout(grid);
    setLayout(layout);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}











'Qt' 카테고리의 다른 글

qt 메뉴 등록  (0) 2010.09.23
[Qt Designer] 확장 다이얼로그  (0) 2010.09.22
Qt Designer  (0) 2010.09.18
Qt Creator Manual  (0) 2010.06.10
And

16진수 0xffffffff의 값 (signed and unsigned)

|

#include <stdio.h>

int main()
{
    int inum;

    inum = 0xffffffff;

    printf("%8s   %8s %10s\n", "hexa", "type", "decimal");
    printf("%8x : %8s %10d\n", inum, "signed", inum);
    printf("%8x : %8s %10u\n", inum, "unsigned", inum);

    return 0;
}

RESULT-------------------------------------------------------------------------------------------------------------

    hexa       type    decimal
ffffffff :   signed         -1
ffffffff : unsigned 4294967295

RESULT-------------------------------------------------------------------------------------------------------------

'C' 카테고리의 다른 글

버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
형식 지정자  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
And

형식 지정자

|

 printf()  scanf()  형식
 %c  %c  단일 문자
 %s  %s  문자열
 %d  %d  부호있는 정수
 %i    부호있는 정수
   %i  10진수, 8진수, 16진수
 %f  %f  실수 (십진 표기)
 %e  %e  실수 (지수 표기)
 %g    실수
 %u  %u  부호없는 정수
 %x  %x  부호없는 16진수
 %o  %o  부호없는 8진수
 %p    16진수 메모리 주소

 printf()    형식
 %ld    long int
 %hd    short int
 %lo    long int 8진수
 %lx    long int 16진수
 %u    unsigned int
 %lu    unsigned long int
 %lf    double
 %Lf    long double


'C' 카테고리의 다른 글

다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
And
prev | 1 | ··· | 4 | 5 | 6 | 7 | 8 | 9 | next