2009년 10월 14일
Posted by 검지발가락♡

사용한 개발 툴 : MAX2
2009년 12월 14일

3. 동작설명

3.1 Clock 
sw3을 누르면 현재 시간(시간, 분)을 설정할 수 있습니다. 
sw0을 눌러서 현재 시간을 설정해 줍니다. sw0을 누를수록 시간이 증가합니다. 
시간은 LED가 껴지는 것을 보고 알 수 있습니다. (led0 가 켜지면 1시, led11이 켜지면 12시)
sw1을 누르면 count가 증가하면서 분의 십의 자리가 설정 됩니다.
sw2를 누르면 count가 증가하면서 분의 일의 자리가 설정 됩니다. 
다시 sw3을 누르면 현재 시간 설정이 완료 됩니다.

3.2 Alarm 
sw20을 1로 설정해 놓으면 ‘알람 모드’로 설정 됩니다. 
sw3을 누르면 알람 시각을 설정할 수 있습니다. 
sw0을 눌러서 알람 시각을 설정해 줍니다. sw0을 누를수록 시각이 증가합니다. 
시각은 LED가 껴지는 것을 보고 알 수 있습니다. (led0 가 켜지면 1시, led11이 켜지면 12시)
sw1을 누르면 count가 증가하면서 분의 십의 자리가 설정 됩니다.
sw2를 누르면 count가 증가하면서 분의 일의 자리가 설정 됩니다. 
다시 sw3을 누르면 알람 시각 설정이 완료 됩니다.
sw20을 0으로 설정하면 다시 시계로 돌아가고 맞춰놓은 시간에 알람이 울립니다.

Posted by 검지발가락♡

사용한 개발 툴 : MAX2, EMPOS2
2009년 9월 21일

modulo-8 UP/Down 카운터 설계

 

1) 상태도 (State Diagram)을 그린다.
생략

2) 입력변수, 상태변수 결정한다.

입력변수 = I (I=0 경우 Down, I=1 경우 Up 카운터로 동작)
상태변수 = S2, S1, S0

3) 사용할 플립플롭 종류 선택한다.

  사용 플립플롭 = JK Flip-Flop   

3) 다음 상태표 & 상태전이표

현재 상태

다음 상태

플립플롭 입력

I=1 I=0

S2

S1

S0

S2

S1

S0

S2 S1 S0

J2

K2

J1

K1

J0

K1

J2

K2

J1

K1

J0

K0

0

1

1

0

0

1

0

1

0

0

×

×

1

×

0

0

×

×

0

×

1

0

0

1

1

1

1

0

1

1

1

×

1

×

×

0

0

×

1

×

×

0

1

1

1

1

0

0

0

0

1

×

0

×

1

×

1

×

1

×

1

×

0

1

0

0

0

1

0

1

1

1

×

1

1

×

0

×

×

0

1

×

1

×

0

1

0

0

1

1

1

0

0

0

×

×

0

1

×

1

×

×

1

0

×

4) 3개의 플립플롭 입력 논리식을 구한다.

 

  5) GDF

  

 


Posted by 검지발가락♡

사용한 개발 툴 : SAFEModeler, MSSQL서버2000

2009년 12월 24일

 요구명세서

MJ 주유소는 self 주유소로 고객이 직접 주유를 하는 시스템이다. 고객은 원하는 정유사의 주유기에서 주유를 할 수 있다. 고객이 주유를 할 때 날짜와 주유한 시간, 주유 가격, 결제 방법이 등록된다. 고객은 회원 가입을 할 수 있다. 회원 가입 시 이름, 연락처만 입력하면 회원 가입을 할 수 있다. 고객번호는 자동으로 등록 된다. 만약 회원인 고객은 회원번호를 입력하면 포인트를 모을 수 있다. 포인트는 주유 금액의 1%가 적립된다. 포인트에 따라 상품을 수령 할 수 있다. 100p는 티슈를 2000p는 세차 권을 10000p는 3만 원짜리 주유티켓을 준다. 상품을 수령했을 경우 포인트는 차감 된다.

MJ 주유소의 주유기 소유자들은 좋은 기름을 공급 받을 수 있도록, 각 단말기의 공급자 목록을 관리해야 한다. 공급업자는 사원번호로 식별하고, 정유사, 이름, 연락처, 차량번호, 공급량, 계약기간을 가진다.

MJ 주유소의 주유기 소유자들은 고객들이 안심하고 거래 할 수 있도록 자신의 이름과 연락처를 기록해 놓아야 한다.

ER 다이어그램

 



ER 스키마

<주유기table>

단말기번호

잔여량

소유주이름

소유주연락처

공급자 사원번호

 

<공급자 table>

사원번호

회사

이름

연락처

차량번호

공급량

계약기간

 

<고객 table>

날짜

시간

주유 가격

결제방법

단말기번호

고객번호

 

<회원고객 table>

고객번호

이름

연락처

포인트

 

< 총 포인트 table>

총 포인트

100

2000

10000


DDL 적용사례

// 고객의 번호가 디비에 있는지 검색

create function dbo.sfn_IsSamePass  

@pass1 varchar(6), @pass2 varchar(6)

)

return bit

as

begin tran

declare @err int

declare @count tinyint

declare @asccii1 tinyint

declare @asccii2 tinyint

set @isSame = 0

set @count =1

while @count <= 6

begin

set @ascii1 = ascii(substring(@pass1, @count, 1)

set @ascii2 = ascii(substring(@pass2, @count, 1)

if (@ascii1 is null) or (@ascii2 is null) or (@ascii2 <> @ascii2)

break

else

set @count = @count +1

end

if (@ascii1 is null and @ascii2 is null)

or @count > 6

set @isSame = 1

else

set @isSame = 0

return @isSame

end

go

 

//가격으로 몇 리터를 주유 했는지 알 수 있도록......... 나중에 주유기 테이블의 잔여 량에 빼준다.

 

if object_id('dbo.sfn_cost') is not null

drop function dbo.sfn_cost

go

create function dbo.sfn_cost

(@cost tinyint)

returns tinyint

begin

if @cost is null

set @cost = 0

else

set @cost = @cost / 1500

return @cost

end

Posted by 검지발가락♡
사용한 개발 툴: MS SQL 서버2000
2009년 11월 3일

한학기 동안 배운거 정리

● convert(date_type, getdate(), style)

● IDENTITY 속성 : 주 키에 identity 속성을 부여하면 행을 삽입할 때마다 주 키의 값이 기존의 값과 중복되지 않는지 조사할 필요가 없고, 자동으로 관리되어 정확하고 편리하다.

● 유효성 검사란 삽입하거나 갱신할 때 열의 값이 정의된 규칙에 부합되는지를 검사하는 것이다 여기에는 제약 조건 체크(check)와 개체규칙(rules)이 있다.

● 인덱스 설정할 필요가 있는 것들

․ 주 키

․ 외래 키 또는 조인할 때 자주 사용되는 열

․ 값이 유일해야 하는 열

․ 키 값의 범위가 검색 대상이 되는 열

․ 정렬된 순서로 액세스 되는 열

 

● 조인에는 크로스 조인, 내부조인, 외부 조인, 자체 조인, 상호연관 하위 질의 등이 있다.

● Top N 은 결과 집합에서 처음 N개의 행만 돌려주도록 제약하는 것이다.

● COMPUTE 절은 SELECT문에 포함되어, 결과 집합 뒤에 단일 값으로 전체 행에 대한 요약 결과 집합을 만들어 주며, 두 번 이상 반복되어 나타날 수 있다.

● COMPUTE BY 절은 SELECT 문에 포함 되어, 그룹화 대상 열값이 바뀔 때마다 단일 값으로 중간 요약 결과 집합을 만들어 주고, 반드시 ORDER BY 절이 같이 사용되어야 하며, 역시 두 번 이상 반복되어 나타날 수 있다.

● SELECT INTO 문은 새로운 테이블을 만들고 조회 결과를 이 테이블에 행으로 삽입한다.

● INSERT SELECT 문은 조회 결과를 기존의 테이블에 누적하여 삽입시켜준다.

● 명시적 트랜잭션은 BEGIN TRAN 문으로 열리고 COMMIT TRAN 문으로 닫히는, 눈에 보이는 트랜잭션이다. 명시적 트랜잭션은 사용자 정의 트랜잭션이라고도 한다.

● 암호를 비교할 때는 LEN 함수를 사용할 수 없으며, 단순히 = 연산자로 비교할 수도 없고 sfn_IsSamePass 와 같은 사용자 정의 함수를 사용해야 한다.

● 저장 프로시저를 최초로 작성하고 호출할 때 내부적으로 처리되는 절차는 다음과 같다.

․ 생성 : 구문 분석을 수행하여 오류가 없을 경우, 저장 프로시저의 이름은 해당 데이터베이스 내의 sysobjects 테이블에, 인자는 syscolumns테이블에, 텍스트는 syscomments 테이블에 각각 저장된다.

․ 최적화 : 저장 프로시저를 최초로 호출하면 sql 서버의 질의 최적화기가 저장 프로시져 내의 Transact-SQL 문을 분석하여 가장 빨리 데이터를 액세스 할 수 있는 계획을 만든다.

․ 컴파일 : SQL 서버의 컴파일러가 저장 프로시저를 실행 계획으로 컴파일 하여 프로시저 캐시에 저장한다.

․ 실행 : 프로시저 캐시 내의 실행 계획을 실행한다.

● 트리거는 제약 조건 등에 비해 성능이 저하된다는 단점이 있기는 하지만, 저장 프로시저와 더불어 데이터베이스 내에서 업무 규칙을 구현한다고 할 수 있다는 더 큰 장점이 있다. 트리거는 체크나 규칙보다 훨씬 복잡한 데이터 무결성을 강화 할 수 있으며, 체크나 규칙에서는 불가능한 개인화된 오류 메시지를 발생시킬 수도 있다.


-도서관 ER

디비출력.hwp



-5장 기초SQL문 , 6장 Transact-SQL, 8장 데이터 형과 데이터 무결성

디비출력(5-6).hwp

디비출력(8).hwp

Posted by 검지발가락♡

사용한 개발 툴 : ERwin, SAFEModeler
2009년 10월 21일
요구명세서 

S대학은 전기 대학원생(석사과정) 을 모집하고 있다. 더 좋은 대학원생을 모집하기 위해 지원자들을 관리할 수 있는 DBMS를 구축하기로 하였다.

▣ 지원자는 지원번호가 부여된다.

▣ 지원자는 지원 양식에 지원일자 주민등록 번호 성명(한글), 성명(영문) , 성명(한자), 성별, 주소, 본적, 전화번호, 종교, 취미, 혈액형, 윌 수입을 작성해야 한다.

▣ 지원자는 학력에 학교명, 입학 년도, 졸업 년도, 상태(중퇴, 졸업)을 작성해야한다.

▣ 지원자는 군 필 여부 난에 군번, 징집 년도, 군별코드, 병과코트, 계급코드, 체격등위, 입대일, 전역일 을 작성해야 한다.

▣ 지원자는 가족 사항에 가족과의 관계, 성명, 나이, 생년월일, 출신학교, 직업, 근무처, 직위를 작성한다.

지원자는 회사에 근무한 경력이 있으면 입사일자, 퇴사일자, 직위, 담당업무를 작성한다.

▣ 지원자는 수상한 내역이 있으면 수상내역, 수상일, 수상종류를 작성한다.

▣ 지원자는 자격증이 있을 시 원서번호, 주관 사, 자격증명을 작성하고

외국어 능력일 경우 수험번호, 응시일, 취득점수를 작성해 준다.

개념적 모델 설계


논리적 설계


 

Posted by 검지발가락♡
2010. 12. 21. 03:32

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

공대생의 일기/2007年2010. 12. 21. 03:30

2007년 11월 23일

10 장 연습문제

A. 다음 빈칸에 적절한 용어를 채우시오.

1.( 부팅 )이란 시스템의 전원이 켜지고 난 후부터 시작해서 사용자가 시스템을 사용할 수 있는 정상 동작 상태에 이르는 과정을 말한다.

2.PC에서 ROM이나 플래쉬 메모리에 저장되어 있으면서 전원이 켜지면 첫 번째로 동작하는 프로그램은 ( BIOS ) 이다.

3.( MBR (Master Boot Record) )은 디스크의 첫 번째 섹터에 들어 있는데 보통( Bootloader )와 파티션 테이블로 구성되어있다.

4.한 시스템에 여러 운영체제가 설치되어 있는 경우에 운영체제를 선택적으로 부팅할 수 있는 멀티부팅에 사용되는 프로그램으로는 ( GRUB ), ( LILO )가 있다.

5.사용자 레벨의 초기화를 담당하며, 모든 사용자 레벨 프로세스의 조상이 되는 프로세스는 ( init )이며 이것의 프로세스 번호는 ( 1번 )이다.

6.inittab 파일의 action 필드를 ( sysinit )로 하면 inittab 파일 내의 각 라인 중에서 가장 먼저 처리된다.

7.mingetty 처럼 종료되면 다시 수행되어야 하는 프로세스의 경우에는 inittab의 action 필드를 ( respawn )로 해야 한다.

 

B.다음 물음에 답하시오.

1.리눅스가 설치되어 있는 시스템의 부팅 절차를 설명하시오.

시스템 시작 : Power On 혹은 Reset

BIOS 동작 : 메모리 검사

BIOS 동작 : 연결된 장치 검사 및 초기화

1단계 부팅 : BIOS에 의한 MBR 부팅

2단계 부팅 : MBR의 부트 로더에 의한 운영체제 커널 부팅

커널 초기화 : 커널 초기화와 inti 프로세스 생성

사용자 레벨 초기화 : init 에 의한 사용자 레벨 초기화

 

2.MBR은 어디에 있으며, 내부 구조는 어떻게 되어 있는지 설명하시오.

디스크의 첫 번째 섹터(head 0, cyclinder 0, sector 1)에 저장되어 있다.
MBR은 세 부분으로 구성되어 있고 전체 크기가 512byte이다.

3.리눅스 시스템의 실행 레벨에 대해 설명하시오.

시스템의 실행레벨(run level)이란 시스템의 상태를 숫자로 나타낸 것으로 init이 시스템의 상태를 숫자로 나타낸 것으로 init이 시스템을 초기화 할 때에 해야 할 일들을 그룹화하기 위해 사용하는 개념이다. 리눅스는 다음과 같은 7가지 실행레벨을 정의하고 있다.

0-시스템 종료

1- 단일 사용자 모드. 콘솔을 통해 root로만 사용할 수 있는 상태.

2- 네트워크 기능이 지원되지 않는 다중 사용자 모드.

4- 사용자 정의 모드. 특별한 용도가 지정되어 있지 않아 관리자가 임의로 정의해서 사용할 수 있는 모드.

5- GUI 모드. X윈도우가 동작하고 있어 그래픽 인터페이스를 사용하는 모드.

6- 재부팅 모드



4. /etc/rcN.d 디렉토리 아래에 있는 파일들의 이름 구조에 대해 설명하시오.

rcN.d 디렉토리들이 있는데 여기서 N은 0~6 사이의 실행레벨 번호와 같다.

5.시스템을 종료시키는 세 가지 방법을 쓰시오.

1)shutdown 명령을 이용하는 방법

기본적으로 시스템을 단일 사용자 모드로 전환하는 명령으로 수퍼 유저만 사용할 수 있다. 종료 전에 먼저 로그인 되어 있는 모든 사용자 들에게 시스템이 다운 될 것이라는 메시지가 전달되고, 더 이상의 로그인이 금지 된다.

2)halt, reboot, poweroff 명령을 이용하는 방법

이 명령들은 시스템을 종료하면서 /var/log/wtmp에 로그 기록을 남긴다.

① halt는 시스템을 즉시 종료시킨다.

② reboot는 시스템을 즉시 재부팅 시킨다.

③ poweroff는 시스템을 즉시 종료시키고, 전원을 차단한다.


3)init 명령을 이용하는 방법

init 명령에 실행레벨 번호를 주면 시스템은 현재 레벨에서 벗어나 그 레벨로 전환한다. 이러한 기능을 이용해서 인수로 0을 주면 시스템을 종료시킨다.

 

6. /etc/inittab 파일의 구조를 설명하시오.

id : runlevels : action : command

먼저 id 는 각 라인을 다른 라인과 구분하기 위한 식별자이다. 따라서 모든 라인은 각각 다른 id 값을 가진다. runlevels는 이 라인이 적용되는 실행레벨이다. command 필드는 init이 실행시킬 명령에 해당하는 실행 파일 이름과 인수가 들어가고 action 필드는 그 명령의 처리방법을 나타낸다.

 

7. init 프로세스의 기능을 설명하시오.

init프로세스는 프로세스 번호가 1번으로 모든 프로세스들의 조상이 된다. init이 수행하는 초기화 과정에는 파일 시스템 검사, 파일 시스템 마운트, 각종 서버 프로세스 생성, 로그인 준비를 하고 초기화를 마친 init은 정상 상태에서는 종료된 시스템 프로세스들 중에서 필요한 프로세스를 다시 살리는 기능을 수행한다.

 

8. 어떤 리눅스 시스템을 부팅하면 자동으로 GUI모드로 동작하게 하려고 한다. 어떻게 하면 되는가?

#cat /etc/inittab

.

.

.

.

id:5:initdefault:

runlevels를 5로 바꿔 준다.

 

9.하나의 하드 디스크를 가진 시스템에 다음과 같이 운영체제들이 설치되어 있다. 이들을 멀티 부팅하기 위한 grub.conf 파일과 lilo.conf 파일을 구성하시오. 운영체제를 선택학 시간은 10초를 주며, 선택하지 않으면 윈도우즈 XP가 자동으로 부팅된다. 리눅스는 하나의 파티션에 필요한 디렉토리들이 모두 설치된다.

첫 번째 파티션 : Windows XP

두 번째 파티션 : Redhat Linux

커널 :/boot/vmlinuz-9.1.1

램디스크 이미지 : innitrd-9.1.1

세 번째 파티션 : 한컴 리눅스

커널 : /boot/vmlinuz-2.6.19


C.다음 명령어의 기능을 설명하시오.

1.init : /etc/inittab 파일의 내용을 참조해서 시스템 초기화 기능을 수행한다.

2.shutdown : 시스템 종료 -r : 종료 후에 재부팅한다. -P : 종료후 전원을 차단 한다. -c: 진행중인 종료 동작을 정지 시킨다.

3.halt : 시스템을 즉시 재부팅 시킨다.

4.poweroff : 시스템을 즉시 종료시키고, 전원을 차단한다.

5.reboot : 시스템을 즉시 재부팅시킨다.



11장. 연습문제

A.다음 빈칸에 적절한 용어를 채우시오.

1.사용자는 문자열 형태의 로그인 이름으로 시스템에 로그인 하지만 시스템은 번호로 된 ( 식별자 )로 사용자를 구분한다. 이에 대한 매핑 정보는 ( 패스워드 )파일에 들어있다.

2.패스워드 파일에 계정정보는 가지고 있지만 실행할 쉘은 가지고 있지 않은 사용자를( 가상 사용자 )라 한다.

3.패스워드의 유효기간을 설정해서 패스워드가 유출되는 것을 방지하는 메카니즘을 (쉐도우 메카니즘)이라 한다.

4.사용자 계정을 등록할 때 사용되는 디폴트 값들은 ( /etc/login.defs )파일에 정의 되어있다.

5.사용자 계정 정보 중에서 반드시 필요한 것은 ( 로그인 이름 ) 이다.

6.슈퍼 유저의 uid는 반드시( 0 )으로 해야 한다.

7.패스워드 파일의 패스워드 필드에 ( X )표시가 있으면 쉐도우 메카니즘을 사용한다는 뜻이고, 쉐도우 파일의 패스워드 필드에 ( * ) 표시가 있으면 로그인이 금지된 사용자라는 뜻이다.

 

B.다음 물음에 답하시오.

1. /etc/passwd 파일의 구조를 설명하시오.

groupname:gpassword:gid:memberlist

groupname : 문자열 형태로 된 그룹의 이름이다.

gpassword : 그룹의 패스워드인데 사용되지 않는다.

gid : 숫자로 된 그룹 식별자이다.

memberlist : ‘,’로 구분된 그룹 구성원 리스트 이다.

 

2. 쉐도우 파일은 어떤 문제를 해결하기 위한 것이며, 그 문제를 어떻게 해결하는가?

해킹툴을 이용하면 암호화된 패스워드 문자열로부터 패스워드의 원본 문자열을 알아 낼 수 있는 문제를 해결하기 위해 암호화된 문자열 조차도 볼 수 없게 하는 쉐도우 메카니즘을 사용한다.

 

3. 쉐도우 파일의 구조를 설명하시오.

usermane:password:lastday:minday:maxday:warnday:expireday:disable:reserved

 

usermane : 사용자 이름으로 패스워드 파일에 있는 usename 필드와 같은 값들을 가진다.

password : 패스워드의 암호화된 문자열로 패스워드 파일에 있던 값을 여기에 옮겨 왔다. 이 필드가 ‘*’이면 로그인이 금지된 사용자이다.

lastday : 최근에 패스워드를 변경한 날짜로서, 1970년 1월 1일 이후 경과한 날짜 수로 표시된다.

minday: 최근에 패스워드를 변겨한 날 이후 패스워드를 변경할 수 있는 날까지 경과해야 하는 날 수 이다.

maxday: 최근에 패스워드를 변경한 날 이후 패스워드를 반드시 변경해야 하는 날 수

warnday: 패스워드 변경 만료일

expireday: 패스워드 유효기간이 경과한 날 수

disable: 계정이 사용 중지된 날로부터 경과한 날짜.

 

4.패스워드 에이징이란 어떤 문제를 해결하기 위한 것이며, 어떻게 문제를 해결하는가?

패스워드 에이징이란 패스워드의 유효기간을 설정해 주는 것을 말한다. 너무 오래 같은 패스워드를 사용해서 발생하는 패스워드 유출을 방지한다.

 

5.자신의 패스워드는 변경일로부터 10일이 되어야 변경할 수 있도록 하고, 15일이 될 때 까지는 반드시 변경해야 하게 하려고 한다. 또한 변경 만료일 3일 전부터 로그인 할 때에 경고 메시지가 나오도록 하려고 한다. 이때에 필요한 명령을 쓰시오.

#chage -m 10 -M 15 -W 3

 

6. 시스템에 사용자의 계정을 등록하는 방법은 세 가지가 있다. 각 방법을 설명하시오.

● 사용자 등록과 제거에 관련된 모든 과정을 관리자가 직접 해 주는 방법

● 사용자 관리용 명령들을 이용해서 계정을 등록하거나 제거하는 방법

● GUI 환경의 사용자 관리 도구를 활용하는 방법

 

7.사용자 gildong이 자신의 패스워드를 잊어 버렸다고 한다. 그래픽 툴을 사용하지 않고 그 사용자의 패스워드를 지우려고 한다. 어떻게 해야 하는가?

# userder -r gildong

 

C. 다음 명령어의 기능을 설명하시오.

1.passwd : 사용자의 계정 정보

2.chage : 패스워드 에이징 관리

3.useradd : 사용자 계정 등록

4.userdel : 사용자 계정 제거

5.groupadd : 그룹 등록

6.groupdel : 그룹 제거

'공대생의 일기 > 2007年' 카테고리의 다른 글

[이산수학]ACM 대지  (0) 2010.12.21
Posted by 검지발가락♡

사용한 개발 툴 : fedora core10 vi편집기
2009년 6월 4일

프로그램 작동 순서

a. 프로그램을 실행시키면 "mysh %% " 프롬프트가 출력된다.

b. 사용자로부터 명령어를 입력받고, 공백문자 “ ” 를 토큰으로 입력받은 명령을 명령어와 옵션으로 분리해낸다.

c. 자식 프로세스를 생성하고 명령어의 처리를 넘긴다.

- 자식 프로세스는 명령어가 실행될 절대경로를 설정하고 명령어와 합쳐 실행 가능 하도록 한다.

d. 부모 프로세스는 자식 프로세스가 명령어를 실행하고 종료되면 다시 프롬프트를 출력하여 다음 명령을 대기한다.


int main(int argc, char *argv[], char *envp[])
{
char cmd[80]; // variable to using input data from user
char *vecl[10]; // variable to using factor for function execve();
setbuf(stdout, NULL); 
printf("mysh %% ");
while(fgets(cmd, 80, stdin)!=NULL){
int i=0;
cmd[strlen(cmd)-1]='\0';
memset(vecl, 0x00, sizeof(vecl)); 
char *token; // divide input data string
token=strtok(cmd, " ");
while(token){ 
vecl[i]=token; 
token=strtok(NULL, " ");
i++;
}

if(fork()==0){
char path[100]="/bin/"; // concatenate path and vecl[0] variables to using command
strcat(path, vecl[0]); 
execve(path, vecl, envp);
exit(0);
}
wait(NULL);
printf("mysh %% ");
}
return 0;
}




Posted by 검지발가락♡
사용한 개발 툴 : fedora core10 vi편집기
2009년 4월 9일

문제] 프로그램3.4는 레코드를 입력 순서대로 저장하는데, 이 프로그램을 수정해서 각 레코드가 레코드 번호 위치에 저장되도록 하라. 프로그램은 다음 조건을 만족시킨다.

(1) 전체 레코드 수는 100 으로 하고, 초기화시에 전체 레코드의 used 필드를 0으로 한다.

(2) 추가되는 레코드 번호는 사용자로부터 입력받는다.

즉, add_record() 함수에서 (레코드 번호, 이름, 주소)를 입력받는다.

(3) 각 레코드는 파일의 레코드 번호 위치에 저장된다.

즉, 레코드1은 파일의 첫 번째에 저장되고, 레코드5는 파일의 다섯 번째에 저장된다.

(4) garb_collect() 함수는 더 이상 필요없으므로 제거한다.

<파일 생성>

if ((fd = open(DB_FILE, O_RDWR|O_CREAT, 0644)) < 0) {

printf("file (%s) creation failed\n", DB_FILE);
exit(0);//파일 생성
recode_init(fd);

}

else if ((fd = open(DB_FILE, O_RDWR, 0644)) < 0) {

printf("file (%s) file write failed\n", DB_FILE);
exit(0);// 파일이 있는 경우 쓰기;

}

void recode_init(int fd)//전체 레코드 만들기 
{

int i =0;
lseek(fd, 0L, SEEK_SET);
for(i=0; i<RECORD; i++){ //레코드 100개 생성
mb.used =0; // 초기화
write(fd, &mb, sizeof mb);

}

void add_record(int fd) {

int recno,i;
char cho; // y/n 여부 저장
get_no:
printf("recode no : ");
fscanf(stdin,"%d", &recno );
__fpurge(stdin);
if(recno<1 || recno>RECORD){ //예외처리 

error_message(); 
printf("(1~100)\n\n\n" );
goto get_no;

}

lseek(fd, 0L, SEEK_SET);
while(read(fd, &mb, sizeof mb)> 0){

i++;
if(recno == mb.used){

printf("%3d 레코드에는 이미 정보가 있습니다.\n", recno);
printf("덮어 쓰시겠습니까(y/n)?");
fscanf(stdin, "%c", &cho);
__fpurge(stdin);
if(cho == 'n'|| cho == 'N' ){ 

goto get_no; 

}

}



mb.used = recno; 
recno--; 
lseek(fd, recno*(sizeof mb), SEEK_SET);
get_name:
printf("name : ");
fgets(mb.name, LEN_NAME, stdin);
if(strlen(mb.name)>LEN_NAME){//예외처리

error_message(); 
__fpurge(stdin);
goto get_name;



mb.name[strlen(mb.name)-1] = '\0'; 
printf("address : ");
fgets(mb.address, LEN_ADDRESS, stdin);
mb.address[strlen(mb.address)-1] = '\0';
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}

void del_record(int fd) {

int recno;
printf("record no ");
fscanf(stdin, "%d", &recno);
recno--;
__fpurge(stdin);
lseek(fd, recno*(sizeof mb), SEEK_SET);
if (read(fd, &mb, sizeof mb) <= 0) {

printf("no such record\n");
return;

}
mb.used = 0;
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}


Posted by 검지발가락♡