작업중지뜨는 소스 다시올립니다.

rbqjalrbqjal의 이미지

소스 올린거 곳곳에서 빠진게 있어서 첨부파일이랑 같이올립니다.

문제는 직원추가시 작업중지가 뜨는건데

'소스를 새로짜지않고 어디가 잘못됐고 이걸 어떻게하면 된다.' 라고 적어주시면 감사하겠습니다.

그리고 데이터의 종속성을 나타내려고 하는데 어떻게하면좋을까요...?

#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
void ShowMenu(void);
void MakeEmployee(void);
void ShowEmployeeInfo(void);

class ID
{
private:
char * employeeName; // 직원이름
int idnum=0;
char * department;
int pay_step = 0;
int work_time = 0;

public:
ID(char * name, int idnum, char * department, int pay_step, int work_time)
{
employeeName,department = new char[strlen(name) + 1];
strcpy(employeeName, name);
}

void ShowEmployeeInfo()
{
cout << "이름" << setw(13) << "주민 번호" << setw(8)<< "부서" << setw(13) << "근무시간" << endl;
cout << employeeName << setw(3) << idnum << setw(3) << department << setw(3) << pay_step << setw(3) << work_time << endl;
}

};
ID * employee[100]; //직원 저장을 위한 배열

int IDNum = 0;
int main(void)
{

int choice;

while (1){
ShowMenu();
cout << "선택: ";
cin >> choice;
cout << endl;
switch (choice)
{
case 1:
MakeEmployee();
break;
case 2:
ShowEmployeeInfo();
break;
case 5:
return 0;

}
}
for (int i = 0; i //delete employee[i];
return 0;
}

void ShowMenu(void)//메뉴출력
{
cout << "-----Menu------" << endl;
cout << "1. 직원입력" << endl;
cout << "2. 직원정보 전체 출력" << endl;
cout << "3. 프로그램 종료" << endl;
}

void MakeEmployee(void)//직원 기입
{
char name[20];
int idnum = 0;
char department[20];
int pay_step = 0, work_time = 0;
cout << "이름" << endl;
cin >> name;
cout << "주민번호" < cin >> idnum;
cout << "부서" << endl;
cin >> department;
cout << "호봉" << endl;
cin >> pay_step;
cout << "근무시간" << endl;
cin >> work_time;
cout << endl;
employee[IDNum++] = new ID(name, idnum, department, pay_step, work_time);
}

void ShowEmployeeInfo(void)//입력된 데이터 보여주기
{
for (int i = 0; i {
employee[i]->ShowEmployeeInfo();
cout << endl;
}
}

File attachments: 
첨부파일 크기
Package icon DB과제9월30일.zip521바이트
neutronizer의 이미지

알집이 문제인건지는 잘 모르겠지만

비주얼 스튜디오용 솔루션 파일만 하나 딸랑 들어있는데

저걸로는 아무것도 못합니다..

해당 소스코드가 들어있는 cpp 파일을 올리시던지,

MakeEmployee 함수 부분만 따로 올리셔야 할것 같습니다.

rbqjalrbqjal의 이미지

글쓰는거, 다른곳에 올리는게처음이다보니 실수를했네요

다시작성했습니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon Project1.zip4.84 MB
neutronizer의 이미지

ID 클래스의

ID(char * name, int idnum, char * department, int pay_step, int work_time)
{
employeeName,department = new char[strlen(name) + 1];
strcpy(employeeName, name);
}

여기서 strcpy에서 에러가 발생하네요.

char*로 employeeName을 선언해놓고

메모리 할당조차 하지 않은 상태에서 strcpy를 하려 하니 당연히 에러를 뿜을 수 밖에 없죠

일단 메모리 할당 하실거 아니면 char* 대신에 char employeeName[20] 과 같이 사용하셔야 문제가 안 일어날것 같습니다.

그리고 직원 입력 받는 부분에서도 버퍼 관련 문제가 있는거 같은데

이 부분은 제가 잘 모르겠네요

HDNua의 이미지

1. 페이지에 소스를 올리실 때 코드 태그를 이용하시면 편리합니다.
"포럼 주제 작성" 페이지 바로 밑에 부등호로 code를 감싸면 된다고 나와있습니다.

2. 반점
예를 들어 다음과 같은 식이 있다고 칩시다.

int a, b;
a = 1, b = 2;

이 경우 식 (a = 1)과 식 (b = 2)가 별도로 계산됩니다.
그런데 이는 다음의 경우와도 다르지 않아요.
int a = 10, b = 20;
a, b = 20; // 식 (a)와 식 (b = 20)가 별도로 수행됨

지금 올리신 코드에는 이런 부분이 있는데, 더 생각해보시기 바랍니다.
employeeName, department = new char[strlen(name) + 1];

3. this
다음과 같은 클래스가 있다고 칩시다.

class Object {
    int value;
public:
    void function(int value) {
        value = 10; // value는 Object의 value? function의 parameter인 value?
    }
};

이 경우 value = 10; 문장은 function의 parameter인 value를 수정하게 되고,
Object의 value 값은 변경하지 않습니다.
Object의 value를 변경하려면 다음과 같이 this 포인터를 이용해야 합니다.
class Object {
    int value;
public:
    void function(int value) {
        this->value = value; // function의 parameter인 value의 값을 Object의 value 멤버 변수에 대입
    }
};

지금 님이 올리신 소스의 생성자가 이렇습니다.
ID(char * name, int idnum, char * department, int pay_step, int work_time)
{
    ...
    department = new char[strlen(name) + 1];
    ...
}

department는 ID의 멤버로도 있고 ID 생성자 함수의 멤버로도 있는데, 둘 중 어느 것을 가리키는지 생각해보세요.

더 해드리고 싶은 말이 많지만, 과제인 것 같으니 이 정도로 하겠습니다.

저는 이렇게 생각했습니다.

rbqjalrbqjal의 이미지

덕분에 작업중지오류랑 이상한 값이 출력되던걸 고쳤습니다.

하나더 궁금한게있는데

종속성의 뜻은 잘 알겠습니다. 하지만 소스로 어떻게표현해야 맞는지 모르겠네요;

위 소스에서

매 달의 월급에 세금을 때려서 값을 출력하고자한다면

월급과 세금에 종속성이 들어가있나요?(어떻게해야 종속성이 들어가나요?)

없다면 어떻게 추가해야하는건가요?

HDNua의 이미지

1. 올리신 파일을 보니 데이터베이스? 그쪽인 것 같은데,
제가 아직 학부생이라 많이 배우지 않아서 종속성이 무엇인지를 모릅니다.

종속성의 정의랑, 종속성에 대한 예시가 과제가 출제될 때 같이 주어졌을텐데
그것을 보여주시면 한 번 생각해볼게요.
종속성 관련해서 검색해봤는데 무슨 말인지 쉽게 알아듣기는 어렵네요.

저는 이렇게 생각했습니다.

rbqjalrbqjal의 이미지

A라는 테이블에 [가], [나], [다] 라는 컬럼이 3개가 있고
B라는 테이블에 [라], [마], [바] 라는 컬럼이 3개있다고 칩니다.

A테이블의 [가]컬럼의 외래키로 B테이블의 [마]컬럼을 잡게되면, [마]컬럼의 데이터들은 [가]컬럼의 데이터들에 종속됩니다.

즉A테이블에는 자유로운 입력이 가능하지만 삭제가 [마]컬럼에 종속되고요, B테이블은 자유로운 삭제가 가능하지만 입력이[가]컬럼에 종속됩니다.

예를 들어 [가]컬럼에 숫자형 데이터 1 2 3 이 각각 등록되어있다고 칩니다.

[마]에는 1또는 2또는 3 이외의 어떤 값도 들어갈 수 없습니다. 하지만 B테이블의 각row는 삭제는 가능합니다.

만약 [마]컬럼에 3이라는 값이 있다면 그것은 [가]컬럼에도 3이라는 값이 존재한다는 의미이고요, 만약 A테이블의 한 행을 삭제하려할때 그 삭제하려는 행의 [가]값이 B테이블의 [마]컬럼에 존재한다면 삭제할 수 없습니다. 자식이 있으면 죽지 못한다는 의미랄까요.. 자식은 아빠가 있어야만 존재할 수 있고요.. 아빠는 자식이 있으면 죽지못합니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

저걸 보고 클래스로 나타내려고했는데 맞는건지모르겠네요....

부모클래스에 직원의 정보넣어두고

자식클래스로 월급계산할거 넣어둠.

새 부모클래스에 세금에관한 정보 만들어놓고

이 부모클래스를 상속받은 자식클래스에 세금계산할거 넣어둔다음

월급계산과 세금계산 자식클래스 둘이 계산해서 출력할생각입니다.

이렇게하면 종속성이 되는거아닌가 하는 것이 제 질문입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

데이터베이스 공부하는거맞아요 ㄷㄷ 소스짠거에서 그렇게 티가 나나요..?

초보라서 허덕거리는데 소스보고 견적나오는 분들보면 신기합니다.

코딩하는거에 관심이조금있지만 언제 나도 저렇게될지...

HDNua의 이미지

1. 올리신 파일의 이름이 "DB과제9월30일.zip"인 걸 보고 짐작한 것 뿐이에요.

2. 제 생각엔 "종속성"의 의미가 질문자분이 생각하시는 것과 다른 것 같습니다.
지금 질문자분이 생각하는 종속성은
상속을 이용하여 부모 클래스와 자식 클래스 간의 관계를 만든다는 것으로 보입니다.
그런데 주어진 문제의 종속성은 그런 종속성이 아니라,
테이블을 A, B 각각 두 개를 생성했을 때 이러한 테이블들간의 관계를 말하는 것입니다.

이해한 글에 입력과 삭제에 관한 이야기가 나오는 것을 보니
프로그램 내에도 입력과 삭제 루틴은 모두 들어가는 것 같습니다. 그렇죠?

그러면 아마 이런 식으로 프로그램을 구성하게 될 겁니다.

=================
A   | PRIMARY_KEY
-----------------
    | PK_1
    | PK_2
    | PK_3
 
=================
B   | FOREIGN_KEY
-----------------
    | PK_1
    | PK_2
    | PK_1
    | PK_3
    | PK_1
    | PK_3
    | PK_2

그러면 입력 시에는 A 테이블의 기본 키가 중복되는지 검사한 후 문제가 없다면 입력을 수행할 겁니다.
외래 키는 중복되어도 좋으니 상관 없지만요.

그런데 말씀하신 것과 같이, 삭제는 A 테이블만으로는 수행할 수 없습니다.
왜냐하면 B 테이블에, A 테이블의 키가 사용되고 있는지를 판정해야 하기 때문입니다.
바로 여기서 A 테이블과 B 테이블의 종속 관계가 생깁니다.
"삭제" 행위에 대해서는 A 테이블이 B 테이블에 종속적입니다. B의 상태에 따라 A에서 삭제 수행 가능 여부가 결정되거든요.

입력은 B 테이블만으로는 수행될 수 없습니다.
A 테이블에서 중복되지 않는 키 값을 새로 생성하여야 가능합니다.
따라서 "입력" 행위에 대해서는 B 테이블이 A 테이블에 종속적입니다.

이로써 A 테이블과 B 테이블 간에 "상호 종속성"을 만들어낼 수 있습니다.

3. 아마 여기서는 A 테이블은 새 직원에 할당할 ID Number 정도만 가지고,
실질적으로 고용된 직원 전체에 대한 정보는 B 테이블이 가지게 될 것 같네요.
월급 계산, 세금 계산은 테이블 간 종속성과 관계 없이, ID class의 멤버 함수로 적당히 만들어 넣으시면 됩니다.

정리하면 다음과 같습니다.
3.1) 테이블을 두 개 생성합니다. 하나는 입력을 위한 키를 보관하는 A 테이블이고, 하나는 직원 정보를 보관하는 B 테이블입니다.
3.2) "입력" 시에 A 테이블에 적당한 키를 생성하고, 이렇게 생성된 키를 바탕으로 B 테이블에 새로운 직원 정보를 넣습니다.
3.3) 다시 생각해보니 "삭제"가 "A 테이블의 키 삭제"와 "B 테이블의 직원 삭제"의 두 가지로 나뉘겠네요.
3.3.1) B: 문제 될 것 없습니다. 그냥 지우면 됩니다.
3.3.2) A: B 테이블에 삭제하려는 키를 사용하는 직원이 있는지를 먼저 검사해야 합니다. 없다면 삭제합니다.

프로그래밍에 익숙하지 않으시면 좀 어려운 요구사항일텐데, 고민해보시기 바랍니다.
애초에 저도 이제 막 배운대로 말하는거라 맞다는 보장도 없구요.

4. 저도 그냥 커뮤니티에 질문 올리고 받고 답변 달아주면서 배우고 있습니다.
며칠 전에 어떤 분한테 잘못된 답변을 달아드렸던 기억이 나네요.

5. 이 글 보시는 다른 분들의 피드백 환영합니다.

저는 이렇게 생각했습니다.

rbqjalrbqjal의 이미지

정말어렵네요....

친절한 답변 감사합니다.

rbqjalrbqjal의 이미지

첨부파일 보시면 ID클래스를 상속받아 Esalary라는 자식클래스를 만들었습니다.

직원정보 입력시에 호봉을 입력하는데

그 호봉의 입력값을 Esalary의 calculation(void) 함수에 대입하여 for문을 이용해 자동으로 ID클래스의 salary에 넣어서 출력토록 하려고 하는게 목적입니다.

위의 소스에서 여기저기 건드려봐도 도통 salary에 값이 들어가질 않네요;;

아직 개념이 잡히지않았나봅니다.. 혹시 어디가 문제인지 알려주실수있나요?

제 실력이 완전 초보수준이라 아무리 건드려봐도 변하질않네요;;

ㅡㅡㅡㅡㅡㅡ

죄송합니다. 위 알려주신 글 잘 읽어보았으나 실력이 부족한 저에겐 어떻게 만들어야할지 감이안오더라구요...그래서 급한대로 위처럼 상속클래스로 해서

제출하고 따로 시간될때마다 찾아볼 생각입니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon Project1.zip5.35 MB
HDNua의 이미지

1. 원시 디버깅이라는 방법이 있습니다.
어려운 말이 아니고, 각 문장이 제대로 실행되는지를 검사하기 위해
문장 근처에 적당히 문자열을 출력하는 거에요.
이를테면 이런 겁니다.

void function();
 
int main(void) {
    std::cout << "함수 실행 전" << std::endl;
    function();
    std::cout << "함수 실행 후" << std::endl;
 
    return 0;
}
 
void function() {
    std::cout << "FUNCTION" << std::endl;
}

function 함수 실행 전후로 확인 문장을 넣는 거지요.

salary가 바뀌지 않은 상황입니다.
그러면 salary를 바꾸는 함수를 주목해야 합니다.
salary를 변경하는 코드는 Esalary::calculation이 유일합니다.

int Esalary::calculation(void)
{
    ID::salary = 0;
    ...
}

그러면 이 함수는 정말 수행되고 있는 것이 맞는지도 확인해봐야지요?
이렇게 말입니다.
int Esalary::calculation(void)
{
    std::cout<<"Esalary::calculation() inside"<<std::endl;
    ID::salary = 0;
    ...
}

이 과정을 수행해보시면, calculation이 수행되지 않는다는 것을 확인할 수 있습니다.
그러면 calculation은 왜 수행되지 않았을까요?

2. 다음 코드의 출력 결과는 무엇일까요?

void function();
 
int main(void) {
    void function();
 
    return 0;
}
 
void function() {
    std::cout << "FUNCTION" << std::endl;
}

정답은 아무것도 출력되지 않는다는 겁니다.
함수 호출은 function()만 사용해야 하지요.
위와 같이 자료형도 앞에 써버리면 function 함수에 대한 선언이 됩니다.
님 코드에 이런 부분이 있지요.
...
case 3:
    void calculation();
    ShowSalary();
    break;
...

같은 이유입니다.

3. 이건 좀 어려우실 수도 있는데, 다음과 같은 코드가 있다고 칩시다.

#include <iostream>
 
class Object {
    int value;
public:
    void function() {
        std::cout << "Object::function() called" << std::endl; // 원시 디버깅
        value = 10;
    }
};
class DerivedObject: public Object {
    int value;
 
public:
    void function() {
        std::cout << "DerivedObject::function() called" << std::endl; // 원시 디버깅
        value = 20;
    }
};
 
int main(void) {
    DerivedObject derived;
    Object *object_ptr;
 
    // object_ptr가 derived 객체를 가리킵니다.
    object_ptr = &derived;
 
    // (1) function 멤버 함수의 실행 결과는 무엇일까요? 
    // (2) DerivedObject::function을 실행하려면 어떻게 해야 할까요?
    object_ptr->function();
 
    return 0;
}

이 문제는 "상속과 다형성" 부분에서 virtual 키워드와 연관해서 나옵니다.
이건 정말 잘 이해하고 있으셔야 해요. 별도로 더 설명하지 않겠습니다.

4. 저도 과제로 바빠서 앞으로는 답변 달기 힘들겠네요.
사실 지금 님의 코드는 손댈 곳이 여러모로 많지만 문법적인 부분만 체크해드렸습니다.

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.