필요한 JDBC파일들은 올려놓았다.

//------------------------------------------------------------
// Name : ConnectionDB.java
// Desc : Mysql DB와 연결을 담당 하는 클래스
//------------------------------------------------------------

package edu1;

import java.sql.*;

import sun.misc.*;
public class ConnectionDB
{
 
 private Connection conn = null;
 private Statement stmt = null;
 private ResultSet rs = null;
 
 
 //MS-SQL JDBC드라이버 로드
 static final String msjdbc_driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

 static final String msjdbc_url = "jdbc:microsoft:sqlserver://203.247.166.172;databasename=project";//DB이름
 
 
 //MSSQL ID, PASSWORD
 private static String msid  = "admin"; //mssql ID
 private static String mspassword = "abc12345"; //mssql password
 
 
 String url = msjdbc_url; //MSSQLJDBC URL
 
 
 //-------------------------------------------------------
 // Name : ConnectionDB
 // Desc : 생성자
 //-------------------------------------------------------
 public ConnectionDB()
 {
 
 
 }
    //-------------------------------------------------------
  // Name : getPublicKey
  // Desc : 데이타베이스와 연결해서 공개키를 가져온다.
 //-------------------------------------------------------
    //통합사이트에서만 키를 가져오면 된다.
    public void getDB() throws Exception
    {
     
     String sql="select *from lathe where id='1'";
     
     //MS-SQL에 연결
     Class.forName(msjdbc_driver).newInstance();
  conn = DriverManager.getConnection(url,msid,mspassword);
  stmt = conn.createStatement();
  rs = stmt.executeQuery(sql);
  while(rs.next()){
   System.out.println(rs.getString(1));
  }
  disconnectDB(); //DB와 연결을 끊는다.
     
    }
   
       
    //-------------------------------------------------------
 // Name : disconnectDB
 // Desc : 데이타베이스와 연결을 끊는다. 
 //-------------------------------------------------------
 public void disconnectDB() throws Exception
 {
  conn.close();
  stmt.close();
  rs.close();
    }
    //main
    public static void main(String[] args)
    {
     ConnectionDB db = new ConnectionDB();
     db.getDB();
     
    }
}

Posted by 나비:D
:
위키피디아의 정의에 따르면, DAO (Data Access Objects)는 객체 지향적 설계 패턴의 일종이다. DAO는 애플리케이션에 대하여 하나 이상의 데이터 저장 장치 혹은 관련 소프트웨어에 대한 공통적인 인터페이스를 제공하는 컴포넌트를 의미한다. 즉, 애플리케이션에 대해서는 일관성 있는 데이터 접근을 확보해주는 것이다.

a component which provides a common interface between the application and one or more data storage devices,
such as a database or file. The term is most frequently applied to the Object design pattern.

DAO를 활용하면 물리적인 저장 장치가 파일에서 관계형 데이터페이스로 변화하더라도 애플리케이션이 영향을 덜 받
도록 해준다. 물리적인 저장은 모두 관계형 데이터베이스를 활용하는 경우에도 제품의 종류나 데이터 접근 오퍼레이션(CRUD 작업)을 돕는 솔루션을 활용에 따라서 실제 구현은 많이 달라지게 된다. DAO와 같은 공통적인 접근 인터페이스를 두지 않는다면, RDBMS 제품이나 활용 솔루션에 변화가 생길 때마다 애플리케이션에도 변경이 필요하게 된다.

DAO는 Core J2EE 패턴으로 소개되었다.
Figure 9.1
Core J2EE 패턴 카타로그에 소개된 클래스 다이어그램과 시퀀스 다이어그램을 참조하면 대략을 이해하는데 도움이 된다.
Figure 9.2
 
BusinessObject
BusinessObject 객체는 데이터를 요구하는 클라이언트를 나타낸다. BusinessObject 객체는 데이터 원본에 접근하여 데이터를 얻거나 저장하기를 요구한다. 일반적으로 서비스 레이어의 객체로 구현하거나, 도메인 객체로 구현한다.

DataAccessObject
DataAccessObject 객체는 DAO 패턴의 중심이다. 기반을 이루는 데이터 접근 구현을 추상화시켜서  BusinessObject 객체가 구체적인 데이터 원본을 고려하지 않고도 접근할 수 있게 한다. 또한, BusinessObject 객체는 DataAccessObject 객체에게 데이터의 로딩 및 저장을 위임한다.

DataSource
데이터 원본에 대한 구현을 나타낸다. 데이터 원본은 RDBMS, OODBMS, XML 저장소, 일반 파일 시스템 등의 데이터베이스이다. 이들 외에 레거시나 메인프레임과 같은 기존의 다른 시스템이나 B2B 기반의 연계 서비스 혹은 LDAP과 같은 류의 저장소가 데이터 원본이 될 수도 있다.

TransferObject
데이터를 운반하는 객체를 나타낸다. DataAccessObject 객체는 BusinessObject 객체에게 데이터를 전달하거나 수정을 위해 데이터를 받기 위해 TransferObject 객체를 사용한다. 서비스 레이어 중심으로 구현을 하는 경우는 대부분의 도메인 객체가 TransferObject 역할을 한다.
아래 다이어그램은 DAO 패턴에 Factory Method를 추가로 적용하여 다수의 RDBMS나 기차 저장장치를 일관성 있게 활용하기 위한 전략을 보여준다.
Figure 9.3
Figure 9.4
Figure 9.5
 
출처:http://younghoe.info/227
Posted by 나비:D
:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6d483869-816a-44cb-9787-a866235efc7c&DisplayLang=ko


* 설치환경 *

- Windows XP

- JAVA 1.3

JAVA가 설치 돼 있는 환경을 기본으로 한다.


1. 마이크로소프트사 홈페이지에 다운로드 센터에서 JDBC 드라이버를 다운받는다.

MSSQL 2000버젼은 현재 SP3 버젼까지 나와있다.





2. setup.exe 파일을 다운받는다.

요즘 귀차니즘병이 많아 첨부파일로 올려놓겠다.


3. 다운받은 setup.exe파일을 실행해서 설치한다.

설치 방법은 긍정적인 대답만 눌러주면서 넘어가면 된다.


4. 설치가 완료 되면 C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC 폴더가 생긴다.



5. C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib 폴더에 들어가면 3가지 파일이 나오는데 모두 복사한다.


6. JAVA설치 폴더 아래 jre\lib\ext 폴더에 5. 에서 복사한 파일을 붙여넣는다.

ext폴더가 없을경우 새로 생성하면 된다.




여기까지 왔으면 JDBC를 사용하기 위한 준비는 끝났다.


다음 소스코드를 실행해서 정상적으로 아무 출력없이 종료 된다면 설치완료!


MSSQL이외에 Oracle과 같은 다른 DBMS를 연결하고 싶다면


각 사이트에서 드라이버를 받아 위와 비슷한 절차를 통해 설치하면 된다.

==================================================================================

import java.sql.*;
public class TestJDBC{
 public static void main(String[] args){
  Connection connect=null;    
  Statement st=null;          
  ResultSet rset=null;    
 
  try{
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");  
  }catch(ClassNotFoundException ce){
   System.out.println(ce);
  }

  try{     
   //"jdbc:microsoft:sqlserver://서버ip주소:1433;DatabaseName=db명","사용자명","비밀번호"
   connect = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DBNAME","sa","password");        
   st = connect.createStatement();
   rset= st.executeQuery("Select * from table1");
  }catch(SQLException se){
   System.out.println(se);
  }finally{
   try{
    if(rset!=null)rset.close();
    if(st!=null)st.close();
    if(connect!=null)connect.close();
   }catch(SQLException se){}
  }
 }
}


Posted by 나비:D
:

Java 생성자

2007. 12. 12. 09:31

생성자의 역할

생성자란 ? 객체를 생성할 때 객체의 초기화 작업을 위한 명령 구문

객체가 생성될 때 최초로 실행되는 메서드의 형태로서 생성 시에만 호출하여 수행

특징

생성자의 이름은 클래스명과 같아야함

생성자의 접근 제어자는 private, protected, public 올수 있으며, 생략가능

메서드 아님

리턴 타입표기 않함, 'void' 표기안함

생성자는 상속되지 않음

중복정의 가능

기본 생성자

기본생성자란? 클래스 정의 시 생성자 정의를 하지 않을 경우, JVM에서 자동으로 제공되는 생성자

public 클래스 이름() {}

특징

인자가 없음

생성자 코드 블록의 본문이 비어있음

'new 클래스이름();' 형태로 객체 생성

클래스 정의 시 최소 1개 이상의 생성자가 정의되면 기본 생성자는 제공되지 않음

기본 생성자가 없는 경우, 'new 클래스 기본생성자();'를 이용해 객체 생성할 수 없음

특별한 목적이 없는 경우, 클래스 정의 시에 기본 생성자도 함께 정의함

생성자 정의

생성자 정의 방법

메서드와 비슷

생성자 이름은 메서드 이름과 반드시 같아야 하고 리턴 타입을 표기 하지 않음

생성자 코드 블록의 본문은 객체 생성 시 초기화를 위한 수행 구문으로 구현

      예)     [접근제어자] 클래스이름 ([인자(Argument)리스트]} {초기화 수행구문}

생성자 중복 정의

클래스는 여러 개의 생성자를 정의할 수 있음

생성자의 이름은 같고, 인자를 다르게 하여 여러 개 정의 가능

인자의 개수, 순서, 데이터 타입을 다르게 하여 정의

생성자의 사용

클래스 정의 시, 생성자를 정의한 경우 해당 생성자를 지정하여 객체 생성이 가능

생성자를 호출할 때 인자의 데이터 타입, 순서, 개수 검사해서 해당 생성자 수행

기본 생성자를 이용한 객체 생성 방법

          클래스이름 참조변수 = new 클래스생성자();

생성자를 지정하여 객체 생성 방법

         클래스 이름 참조변수 = new 클래스생성자(초기화1, 초기화2,);


Posted by 나비:D
:

EDIT(편집)

Content Assist(컨텐트 지원)                              Ctil + Space


Context Information (매개변수 힌트)                    Ctil + Shift + Space


Find and Repalce (찾기/바꾸기)                        Ctrl + F


Find Next (다음 찾기)                                       Ctrl + K


Find Previous (이전 찾기)                                 Ctrl + Shift + K


Incremental Find (다음 증분 찾기)                      Ctrl + J


Incremental Find Reverse (이전 증분 찾기)          Ctrl + Shift + J


Quict Diff Toggle                                              Ctrl + Shift + Q


Quick Fix (빠른 수정)                                        Ctrl + 1


Redo (다시 실행)                                             Ctrl + Y


Restore Last Selection (마지막 선택사항 복원)     Alt + Shift + Down


Select Enclosing Element (엔클로징 요소)           Alt + Shift + UP


Select Next Element (다음 요소)                         Alt + Shift + Right


Select Previous Element (이전 요소)                   Alt + Shift + Left


Show Tooltip Description (도구 팁 설명 표시)       F2


Toggle Insert Mode(스마트 삽입 모드)                 Ctrl + Shift + Insert




File(파일)

Close (닫기)                                                     Ctrl+W or Ctrl + F4


Close All (모두 닫기)                                         Ctrl + Shift + W or Ctrl + Shift +F4


Exit (종료)                                                        Alt + F4


New (신규(기타))                                              Ctrl + N


New menu (신규)                                              Alt + Shift + N


print (인쇄)                                                       Ctrl + P


Properties (특성)                                               Alt + Enter


Refresh (새로 고치기)                                         F5


Rename (이름 바꾸기)                                         F2


Save All (모두 저장)                                           Ctrl + Shift + S




Navigate (탐색)
Backward History (뒤로)                                      Alt + Left


Forward History (앞으로)                                      Alt + Right


Go to Line (행으로 이동)                                      Ctrl + L


Go to Matching Bracket (일치하는 대괄호)              Ctrl + Shift + P


Go to Next Member (이전 구성원)                          Ctrl + Shift + Down


Go to Previous Member (일치하는 대괄호)              Ctrl + Shift + Up


Last Edit Location (마지막 편집 위치)                     Ctrl + Q


Next (다음 어노테이션)                                         Ctrl + .


Open Call Hierarchy (호출 계층 구조 열기)              Ctrl + Alt + H


Open Declaration (선언 열기)                                F3


Open External Javadoc (외부 Javadoc 열기)           Shift + F2


Open Resource (자원 열기)                                  Ctrl + Shift + R


Open Structure (상위구현 열기)                             Ctrl + F3


Open Type (유형 계층 구조 열기)                           F4


Open Type Hierarchy                                           Ctrl + Shift + H


Previous (이전 어노테이션)                                   Ctrl + ,


Quick Hierarchy (빠른 유형 계층 구조)                    Ctrl + T


Quick Outline (빠른 아웃 라인)                               Ctrl + O


Project (프로젝트)


Build All (모두 빌드)                                             Ctrl + B




Refactor - Java(리펙터)
Change Method Signature (메소드 서명 변경)           Alt + Shift + C


Convert Local Variable to Field (이동)                      Alt + Shift + F


Extract Local Variable (로컬 변수 추출)                    Alt + Shift + L


Extract Method (메소드 추출)                                  Alt + Shift + M


Inline (인라인)                                                      Alt + Shift + I


Move - Refactoring (이동)                                     Alt + Shift + V


Redo - Refactoring (다시 실행)                               Alt + Shift + Y


Refactor Quick Menu                                            Alt + Shift + T


Rename - Refactoring (이름 바꾸기)                       Alt + Shift + R


Undo - Refactoring (실행 취소)                              Alt + Shift + Z




Run (실행)
Debug Last Launched (마지막 실행 디버그)            F11


Display (표시)                                                     Ctrl + Shift + D


Execute (실행)                                                    Ctrl + U


Inspect (검사)                                                     Ctrl + Shift + I


Resume                                                              F8


Run Last Launched (마지막 실행 재실행)                Ctrl + F11


Run to Line                                                         Ctrl + R


Step Into                                                             F5


Step Into Selection                                               Ctrl + F5


Step Over                                                            F6


Step Return                                                          F7


Toggle Breakpoint                                                 Ctrl + Shift + B


Toggle Step Filters                                                Shift + F5




Search (검색)
Declatation in Workspace (선언 > 작업공간)             Ctrl + G


Occurrences in File (파일에서 발생)                        Ctrl + Shift + U


Open Search Dialog (검색)                                     Ctrl + H


References in Workspace  (참조 > 작업공간)            Ctrl + Shift + G




Source
Toggle Comment (주석 토글)                                   Ctrl + Shift + C or Ctrl + /


Add Block Comment (블록 주석 추가)                       Ctrl + Shift + /


Remove Block Comment (블록 주석 제거)                  Ctrl + Shift + \


Add Import (가져오기 추가)                                      Ctrl + Shift + M


Add Javadoc Comment (Javadoc 주석 추가)              Alt + Shift + J


Format (형식화)                                                      Ctrl + Shift + F


Indent Line (들어쓰기 정정)                                      Ctrl + I


Mark Occurences                                                   Alt + Shift + O


Organize Imports (가져오기 체계화)                           Ctrl + Shift + O


Remove Occurrence Annotations                               Alt + Shift + U


Source Quick Menu                                                 Alt + Shift + S




Text Editing
Collapse                                                                 Ctrl + Numpad -


Copy Lines                                                              Ctrl + Alt + Down


Delete Line                                                              Ctrl + D


Delete Next Word                                                      Ctrl + Delete


Delete Previous Word                                                Ctrl + Backspace


Duplicate Lines                                                        Ctrl + Alt + Up


Expand                                                                   Ctrl + Numpad +


Expand All                                                               Ctrl + Numpad *


Insert Line Below Current Line                                   Ctrl + Shift + Enter


Insert Line Below Current Line                                   Shift + Enter


Move Lines Down                                                    Alt + Down


Move Lines Up                                                         Alt + UP


Next Word                                                                Ctrl + Right


Previous Word                                                          Ctrl + Left


Scroll Line Down                                                      Ctrl + Down


Scroll Line Up                                                          Ctrl + Up


Select Next Word                                                      Ctrl + Shift + Right


Select Previous Word                                                Ctrl + Shift + Left


Toggle Folding                                                         Ctrl + Numpad /


Toggle Overwrite                                                       Insert


To Lower Case                                                        Ctrl + Shift + Y


To Upper Case                                                         Ctrl + Shift + X




Views
Java Package Explorer                                              Alt + Shift + Q, P


java Type Hierarchy                                                   Alt + Shift + Q, T


Outline                                                                     Alt + Shift + Q, O


Problems                                                                  Alt + Shift + Q, X


Search                                                                     Alt + Shift + Q, S


Synchronize                                                              Alt + Shift + Q, Y




Window
Activate Editor (탐색 > 편집기 활성화)                            F12


Maximize Active View or Editor (탐색 > 활성화된 보기 또는 편집기 최대화)           Ctrl + M


Next Editor (탐색 > 다음 편집기)                                    Ctrl + F6


Next Perspective (탐색 > 다음 Perspective)                    Ctrl + F8


Next View (탐색 > 다음 보기)                                        Ctrl + F7


Open Editor Drop Down (탐색 > 편집기로 전환)               Ctrl + E


Previous Editor (탐색 > 이전 편집기)                              Ctrl + Shift + F6


Previous Perspective (탐색 > 이전 perspective)              Ctrl + Shift + F8


Previous View (탐색 > 이전 보기)                                  Ctrl + Shift + F7


Show Ruler Context Menu                                            Ctrl + F10


Show System Menu (탐색 > 시스템 메뉴 표시)                 Alt + -


Show View Menu                                                        Ctrl + F10


Switch to Editor                                                           Ctrl + Shift + E

Posted by 나비:D
:

▩ 포인터(Pointer)


   - Pointer는 지시자의 뜻

   - 기억장치의 주소를 변수의 값으로 사용 하는것이 목적

   - 포인터 변수의 선언: 데이터 타입 *포인터변수명
     . int* pk; int * pk; int *pk;

   - & 연산자: 변수의 메모리상에 데이터가있는 주소를 알려줌
     . int k=10; 이라고 선언했다면 &k라고하는 것은 k라는 변수의 값 10이 있는 메모리의 주소를 가

       져옵니다.
     . k변수의 주소입니다.

   - 출력은 주소는 양수만 있음으로 %u로 출력함

   - * 표시는 포인터 변수 선언문이 아닌 곳 즉 수식문에서는 그 포인터 변수가 가지고 있는 주소의

       값을 가지고 옴

   - 포인터 변수는 Borland C에서는 2바이트, Visual C++에서는 4바이트임

   - 포인터를 사용하면 함수로 인자의 주소를 전달할 수 있어 매우 편리하다.
     scanf("%d", &kuk);의 경우를 이해할 것. 


#include <stdio.h>

void main( void )
{
   int   i, result;
   float fp;
   char  c, s[81], d;


   //printf("%d", d);
   //exit(0);
  
   printf( "\n\n정수, 실수, 문자, 문자열을 입력하세요.\n");

   result = scanf( "%d %f %c %s %d", &i, &fp, &c, s, d);
   printf( "\n입력받은 데이터의 수 %d\n", result );
   printf( "The contents are: %d %f %c %s %c\n", i, fp, c, s, d);

}


   - 포인터 변수는 더하거나 빼는 연산을 할 수 있다.
    . 포인터 변수 + 1: 포인터 변수가 가리키는 곳의 주소가 포인터 변수의 데이터형 만큼 증가한다.
    . *포인터 변수 + 1: 포인터 변수가 값으로 가지고있는 주소가 가르키는 값을 1 증가 시킨다.
    . *(포인터 변수 + 1): 포인터 변수가 가리키는 곳의 주소를 포인터 변수의 데이터형 만큼 증가시

      킨 후 그 값을 1 증가시킨다.



1. 포인터 변수의 선언
     int k=10;
     int *kp = &k;
     printf("%d\n", *kp);  라고 선언하면
     . int *kp는 포인터 변수를 의미한다.
     . &k는 k변수의 주소를 의미한다.
     . 포인터 변수 kp는 k의 주소를 저장한다.
     . kp는 int형 포인터 변수임으로 int형 변수의 주소만 저장할 수 있다.
     . 수식문에서 *kp라고하면 kp가 값으로 가지고있는 주소의 값을 가져온다.



>>>>> 포인터 변수의 선언


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i;

   printf("i의 값은 %d입니다.\n", i);
   printf("i의 주소는 %X입니다.\n", &i);

   printf("\ni의 값을 입력하세요 : ");
   scanf("%d",&i);
  
   printf("i의 값은 %d입니다.\n", i);
   printf("i의 주소는 %X입니다.\n", &i);
   getch();
 }




>>>>> 정수형 변수의 주소 출력, 주소 할당의 진행 방향의 이해


 #include <conio.h>
 #include <stdio.h>

 void main() {
   int i = 10;
   int j = 20;
   int k = 30;
 
   printf("정수형 변수 i의 값은 %d입니다.\n", i);
   printf("정수형 변수 i의 주소는 %u입니다.\n", &i);

   printf("정수형 변수 j의 값은 %d입니다.\n", j);
   printf("정수형 변수 j의 주소는 %u입니다.\n", &j);

   printf("정수형 변수 k의 값은 %d입니다.\n", k);
   printf("정수형 변수 k의 주소는 %u입니다.\n", &k);
   getch();
 }




>>>>> 다양한 데이터형의 주소 출력


   char c = 'A';
   int i = 10;

 변수의 선언 형태가 위와 같을 경우 Borland C는 int변수는 2바이트를 사용하고 1바이트는 버린다.
   VisualC++은 char는 무조건 4바이트를 사용합니다.


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c = 'A';
   int i = 10;
   float f = 2.1;
   char c1 = 'A';
   char c2 = 'B';
 
   printf("문자형 변수 c의 값은 %c입니다.\n", c);
   printf("문자형 변수 c의 주소는 %u입니다.\n", &c);

   printf("정수형 변수 i의 값은 %d입니다.\n", i);
   printf("정수형 변수 i의 주소는 %u입니다.\n", &i);

   printf("실수형 변수 f의 값은 %f입니다.\n", f);
   printf("실수형 변수 f의 주소는 %u입니다.\n", &f);

   printf("문자형 변수 c1의 값은 %c입니다.\n", c1);
   printf("문자형 변수 c1의 주소는 %u입니다.\n", &c1);

   printf("문자형 변수 c2의 값은 %c입니다.\n", c2);
   printf("문자형 변수 c2의 주소는 %u입니다.\n", &c2);

   getch();
 }




2. 포인터 변수의 작동

   메모리 할당 모델                               대응하는 소스코드
   =========================================================
       Mapping 변수명    주소    값
   ----------------------------------
              int k             1000    10                int k = 10;      
   ----------------------------------
              int m             996     20                int m = 20;
   ----------------------------------
              int* pk          992     1000              int* pk = &k;
   ----------------------------------
              int* pm          988     996               int* pm = &m;
   ----------------------------------



>>>>> 다양한 데이터형의 포인터 변수의 출력


  #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1f;

   char *cp;  //char형 변수의 주소를 저장합니다.
   int *ip;   //int형 변수의 주소를 저장합니다.
   float *fp; //float형 변수의 주소를 저장합니다.

   //각종 타입의 변수의 주소를 포인터 변수에 저장
   cp=&c;
   ip=&i;
   fp=&f;

   printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);

   printf("char형 변수 c의 주소:%d \n", &c);
  
   getch();
 }



변수   주소   값
-----------------
c      5052   A     <--- c='A'
i      5048   10
f      5044   2.1f
cp     5040   5052  <--- cp = &c;
ip     5036   5048  <--- ip = &i;
fp     5032   5044  <--- fp = &f;

- c: 'A'
- &c: 5052

- cp: 5052
- &cp: 5040
- *cp: 'A'




>>>>> 포인터 변수의 초기화


   char *cp=&c;
   은 char *cp;    cp=&c;로 분리 실행된다.


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1;

   char *cp=&c;
   int *ip=&i;
   float *fp=&f;

   printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);
   getch();
 }




UP!!!▷ 'k'라는 변수를 선언해 100을 대입하고, 'kp'라는 포인터 변수를 선언하고,
        'kp'란 포인터 변수를 이용해 'k'의 값을 출력하는 프로그램을 작성하세요.




>>>>> 포인터 변수 자신의 주소 출력하기 1


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i=10;
   int *ip=&i;  //i 변수의 주소를 ip포인터 변수에 할당합니다.

   printf("==================================================\n");

   printf("i의 값은 %d입니다.\n\n", i);

   printf("i의 자신의 주소는 %u입니다.\n", &i);
   printf("ip의 값은 %u입니다.\n\n", ip);

   printf("ip가 가지고 있는 주소의 값은 %d입니다.\n", *ip);
   printf("ip의 자신의 주소는 %u입니다.\n", &ip);

   printf("==================================================\n");
   getch();
}





3. 아래와 같이 선언된 경우 c 변수는 1바이트를 버린다., Visual C는 무조건 4바이트씩 사용


>>>>> 포인터 변수 자체의 주소 출력


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1;

   char *cp=&c;
   int *ip=&i;
   float *fp=&f;

   printf("==================================================\n");
   printf("①문자형 변수 c의 값은 %c입니다.\n", c);
   printf("②문자형 변수 c의 주소는 %u입니다.\n", &c);
   printf("③문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("④문자형 포인터 cp의 실제 주소는 %u입니다.\n", &cp);
   printf("⑤문자형 포인터 cp의 참조 주소는 %u입니다.\n", cp);
   printf("==================================================\n");
   printf("⑥정수형 변수 i의 값은 %d입니다.\n", i);
   printf("⑦정수형 변수 i의 주소는 %u입니다.\n", &i);
   printf("⑧정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("⑨정수형 포인터 ip의 실제 주소는 %u입니다.\n", &ip);
   printf("⑩정수형 포인터 ip의 참조 주소는 %u입니다.\n", ip);
   printf("==================================================\n");
   printf("⑪실수형 변수 f의 값은 %f입니다.\n", f);
   printf("⑫실수형 변수 f의 주소는 %u입니다.\n", &f);
   printf("⑬실수형 포인터 fp의 값은 %f입니다.\n", *fp);
   printf("⑭실수형 포인터 fp의 실제 주소는 %u입니다.\n", &fp);
   printf("⑮실수형 포인터 fp의 참조 주소는 %u입니다.\n", fp);
   printf("==================================================\n");
   getch();
}


--출력 결과
==================================================
①문자형 변수 c의 값은 A입니다.
②문자형 변수 c의 주소는 1245052입니다.
③문자형 포인터 cp의 값은 A입니다.
④문자형 포인터 cp의 실제 주소는 1245040입니다.
⑤문자형 포인터 cp의 참조 주소는 1245052입니다.
==================================================
⑥정수형 변수 i의 값은 10입니다.
⑦정수형 변수 i의 주소는 1245048입니다.
⑧정수형 포인터 ip의 값은 10입니다.
⑨정수형 포인터 ip의 실제 주소는 1245036입니다.
⑩정수형 포인터 ip의 참조 주소는 1245048입니다.
==================================================
⑪실수형 변수 f의 값은 2.100000입니다.
⑫실수형 변수 f의 주소는 1245044입니다.
⑬실수형 포인터 fp의 값은 2.100000입니다.
⑭실수형 포인터 fp의 실제 주소는 1245032입니다.
⑮실수형 포인터 fp의 참조 주소는 1245044입니다.
==================================================




4. 포인터 변수의 이용
 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i=20;
   int *ip;
   int *ip2;

   ip = &i;

   printf("ip       : %u\n", ip);  //1245052
   printf("*ip      : %d\n", *ip); //20
   printf("i의 주소 : %u\n\n", &i); //5052


   *ip = 50;

   printf("*ip      : %d\n", *ip);  //50
   printf("i의 주소 : %u\n", &i);    //5052
   printf("ip 포인터 변수 자체의 주소 : %u\n\n", &ip); //5048

   ip2 = &i;  //
   *ip = 100;

   printf("i의 값 : %d\n", i);    //100
   printf("ip2    : %u\n", ip2);  //5052
   printf("*ip    : %d\n", *ip);  //100
   printf("*ip2   : %d\n", *ip2); //100
   printf("ip2 포인터 변수 자체의 주소 : %u\n\n", &ip2); //5044
   getch();

 }

Posted by 나비:D
:

▩ 다차원 배열


   - 1차원배열의 연속적인 형태
   - 논리적으로 테이블의 구조를 가지고 있으나 메모리상으로는 1차원배열의 연속임
   - 배열 처리시 일반적으로 for문이 2개이상 사용되는 경우가 많음
   - 배열명은 배열의 첫 요소의 주소를 가지고 있으나 상수형태임으로 포인터 변수처럼 배열의 주

     소를 증감할 수 없음


1. 2차원 배열
   - 자료형  배열 이름[첨자1, 행][첨자2, 열]
   - 2차원 배열의 선언
     . int arr[3][3];
     . char arr[3][3] =
       {
         {'A', 'B', 'C'},
         {'D', 'E', 'F'},
         {'G', 'H', 'I'},
       };


2. 3차원 배열
   - 자료형  배열 이름[첨자1, 면][첨자2, 행][첨자3, 열]
   - 3차원 배열의 선언
   int arr[2][3][4] =
   {
     {
       {1, 2, 3, 4},
       {5, 6, 7, 8},
       {9, 10, 11, 12}
     },
     {
       {51, 52, 53, 54},
       {55, 56, 57, 58},
       {59, 60, 61, 62}
     }
   };





▩ 다차원 배열 예제



>>>>> 2차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[3][4];
   int k, m;

   for(k=0; k<3; k++) {
      for(m=0; m<4; m++){
        arr[k][m]=k+m;
//        printf("arr[%d][%d]=%d  ", k, m, k+m);
        printf("k=%d m=%d  k+m=%d / ", k, m, k+m);
      }
      printf("\n");
   }

   printf("\n");

   for(k=0; k<3; k++) {
      for(m=0; m<4; m++){
        printf("arr[%d][%d] = %d  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }


UP!!!▷ 배열에 2의 배수로 입력되어 출력되도록 수정하세요.



>>>>> 2차원 배열에 값을 입력받아 역순으로 출력하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[2][3];
   int k, m;

   for(k=0; k<2; k++) {
      for(m=0; m<3; m++) {
        printf("arr[%d][%d]의 값을 입력하세요 : ", k, m);
        scanf("%d", &arr[k][m]);
      }
   }

   for(k=1; k>=0; k--) {
      for(m=2; m>=0; m--){
        printf("arr[%d][%d] = %d  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   printf("\n");
   printf("for문이 끝난 후의 k, m값:k=%d m=%d\n", k, m);
   getch();
 }



>>>>> 2차원 배열의 초기화 1


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char arr[3][3] =
   {
     {'A', 'B', 'C'},
     {'D', 'E', 'F'},
     {'G', 'H', 'I'},
   };
   int k, m;

   for(k=0; k<3; k++) {
      for(m=0; m<3; m++){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }



>>>>> 2차원 배열의 초기화 2


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char arr[3][3] =
   {
     {'A', 'B', 'C'},
     {'D', 'E', 'F'},
     {'G', 'H', 'I'},
   };
   int k, m;

   printf("* 원래의 값 * ===============================\n");
   for(k=0; k<3; k++) {
      for(m=0; m<3; m++){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }

   printf("* 변경된 값 * ===============================\n");
   for(k=0; k<3; k++) {
      for(m=2; m>=0; m--){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }



>>>>> 3차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[2][3][4] =
   {
     {
       {1, 2, 3, 4},
       {5, 6, 7, 8},
       {9, 10, 11, 12}
     },
     {
       {51, 52, 53, 54},
       {55, 56, 57, 58},
       {59, 60, 61, 62}
     }
   };
   int k, m, n;

   for(k=0; k<2; k++) {
      for(m=0; m<3; m++) {
  for(n=0; n<4; n++){
     printf("arr[%d][%d][%d] = %d  ", k, m, n, arr[k][m][n]);
  }
            printf("\n");
      }
   printf("\n");
   }
   getch();
 }

Posted by 나비:D
:

▩ 배열의 개념과 1차원 배열


   - 같은 데이터형을 가진 데이터들의 집합
   - 데이터의 형태가 집합적인 형태를 가지면서 같은 처리 방식을 가질 경우 사용
   - 배열은 인덱스를 이용하여 각 요소가 구분됨
   - 배열의 인덱스는 0부터 n-1까지 사용함
   - 배열 처리시 일반적으로 for문을 1개 정도 동반함
   - 배열의 선언:
     . int arr[5]; - 5개의 정수를 저장할 수 있는 배열을 선언합니다.
     . int arr[5] = {1,2,3,4,5};
       5개의 정수를 저장할 수 있는 배열을 선언하면서 5개의 정수를 배열에 저장합니다.

1. 배열에 값을 저장한 다음 출력하는 일반적인 프로그램

 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i;
   int arr[10];

   for(i=0; i<10; i++)
      arr[i]=i;

   for(i=0; i<10; i++)
      printf("arr[%d] = %d\n", i, arr[i]);
   getch();
 } 




▩ 1차원 배열, 2차원 배열 예제



>>>>> 1차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   int arr[10];

   for(k=0; k<10; k++)
      arr[k]=k;

   for(k=0; k<10; k++)
      printf("arr[%d] = %d\n", k, arr[k]);
   getch();
 }


UP!!!▷ 배열에 들어가는 값이 1부터 10이 되도록 수정하세요.


UP!!!▷ tot란 변수에 배열의 모든 값의 합을 구해서 출력해 보세요.


UP!!!▷ 배열에 들어가 있는 값중에 짝수인 수들의 합을 구해서 출력해 보세요.



>>>>> 영어 대문자를 배열에 저장하고, 역순으로 출력하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   char alpha[26];

   for(k=65; k<=90; k++){
      alpha[k-65]=k;
   }

   for(k=90; k>=65; k--){
      printf("alpha[%d] = %c\n", k-65, alpha[k-65]);
   }
   getch();
 }


UP!!!▷ 알파벳이 Z부터 역으로 5개씩 출력되는 프로그램으로 수정하세요.


UP!!!▷ 알파벳이 A부터 5개씩 출력되는 프로그램으로 수정하세요.




▩ 최대/최소값 추출의 원리


   - MAX변수에는 최소값을 초기값으로 준다.
   - MIN변수에는 최대값을 초기값으로 준다.
     0 ~ 3000 사이의 데이터를 기준으로 한다면 max=0, min=3000으로 주어야 한다.

   - if문을 이용하여 최대값보다 큰 값이 나타나면 최대값에 새로운 값을 대입한다.
     if (max < readData) max = readData;

   - if문을 이용하여 최소값보다 작은 값이 나타나면 최소값에 새로운 값을 대입한다.
     if (min > readData) min = readData;



>>>>> 배열의 이용(입력 수의 범위:0~3000)


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i, mx_cn=1, mn_cn=1;
   int max=0, min=3000;
   int jum[5];

   for(i=0; i<5; i++) {
      printf("%d번째 수를 입력하세요 : ", i+1);
      scanf("%d", &jum[i]);
   }

   for(i=0; i<5; i++) {
      if(jum[i]>max) {
  max=jum[i];
  mx_cn=i+1;
      }
      if(jum[i]<min) {
  min=jum[i];
  mn_cn=i+1;
      }
   }
   printf("\n");
   printf("최대값 : %d, 입력번호 : %d\n", max, mx_cn);
   printf("최소값 : %d, 입력번호 : %d\n", min, mn_cn);
   getch();
 }



>>>>> 배열의 크기


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   int num[] = {25, 36, 45, 45};
   char alpha[] = {'A', 'B', 'E'};

   for(k=0; k<4; k++)
      printf("배열 num[%d]의 크기 : %d\n", k, sizeof num[k]);
      printf("배열 num의 크기 : %d\n", sizeof(num));

   for(k=0;k<3;k++)
      printf("배열 alpha[%d]의 크기 : %d\n", k, sizeof alpha[k]);
      printf("배열 alpha의 크기 : %d\n", sizeof(alpha));
   getch();
 }




>>>>> 문자열의 초기화


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char alpha1[] = {'A', 'B', 'C', 'D', 'E'};
   char alpha2[] = {'A', 'B', 'C', 'D', 'E', '\0'};
   char alpha3[] = "ABCDE";

   printf("배열 alpha1의 내용 : %s\n", alpha1);
   printf("배열 alpha1의 크기 : %d\n", sizeof(alpha1));
   printf("\n");
   printf("배열 alpha2의 내용 : %s\n", alpha2);
   printf("배열 alpha2의 크기 : %d\n", sizeof(alpha2));
   printf("\n");
   printf("배열 alpha3의 내용 : %s\n", alpha3);
   printf("배열 alpha4의 크기 : %d\n", sizeof(alpha3));
   getch();
 }




>>>>>  문자 배열의 이용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char fm[]= "File MENU";
   char em[]= "Edit MENU";
   char hm[]= "Help MENU";
   char wm[]= "Wrong Input";
   char c;

   printf("메뉴 코드를 입력하세요 : ");
   if((c=getch()) >= 97) c -= 32;

   while(c!='X') {
     switch(c) {
     case 'F' :
  printf("\n%s\n", fm);
  break;
     case 'E' :
  printf("\n%s\n", em);
  break;
     case 'H' :
  printf("\n%s\n", hm);
  break;
     default :
  printf("\n%s\n", wm);
     }
     printf("계속하려면 메뉴 코드를, 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }





[참고] 데이터 정렬의 원리
   - swap 알고리즘
     a[0]=100, a[1]=200의 값을 바꾸는 경우, temp는 임시변수

     temp=a[0];
         ↙
     a[0]=a[1];
         ↙
     a[1]=temp;


           temp
       ①↗    ↘ ③
     a[0]   ←   a[1]  
            ② 

       기준수 a[0], 총 비교횟수 4회
       ↓
 비교1 500      400 300 100 200
 비교2 400      500 300 100 200 a[0], a[1] 비교후의 수
 비교3 300      500 400 100 200 a[0], a[2] 비교후의 수
 비교4 100      500 400 300 200 a[0], a[3] 비교후의 수
          100      500 400 300 200 a[0], a[4] 비교후의 수


            기준수 a[1], 총 비교횟수 3회
           ↓
 비교1 100 500      400 300 200
 비교2 100 400      500 300 200 a[1], a[2] 비교후의 수
 비교3 100 300      500 400 200 a[1], a[3] 비교후의 수
          100 200      500 400 300 a[1], a[4] 비교후의 수


                     기준수 a[2], 총 비교횟수 2회
                    ↓
 비교1 100 200      500 400 300
 비교2 100 200      400 500 300 a[2], a[3] 비교후의 수
          100 200      300 500 400 a[2], a[4] 비교후의 수


                        기준수 a[3], 총 비교횟수 1회
                       ↓
 비교1 100 200 300      500 400
          100 200 300      400 500 a[3], a[4] 비교후의 수


for (i=0; i<=3; i++)  <-- 기준수
   for(j=i+1; j<=4; j++)  <-- 대응수



>>>>> 5개의 정수를 입력받아 정렬하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i, j, t;
   int jum[5];

   for(i=0; i<5; i++) {
   printf("%d번째 수를 입력하세요 : ", i+1);
   scanf("%d", &jum[i]);
   }
   printf("\n");
   printf("입력된 자료\n");

   for(i=0; i<5; i++) {
   printf("%d ", jum[i]);
   }

   for(i=0; i<=3; i++) {
      for(j=i+1; j<=4; j++) {
         if(jum[i]>jum[j]) {
           t=jum[i];
           jum[i]=jum[i];
           jum[j]=t;
  }
      }
   }
   printf("\n정렬된 자료\n");

   for(i=0; i<5; i++) {
      printf("%d ", jum[i]);
   }
   getch();
 }

Posted by 나비:D
:

▩ Call By Value를 이용한 함수로의 데이터 전달 방법


   - Call By Value로 사용되는 데이터타입은 원시데이터 타입인 char, short int, int, float... 수

     치 형태의 데이터 전부 해당
     ※ 문자열이나 주소 형태의 데이터는 Call By Reference입니다.

1. EXE 프로그램의 Memory 사용영역(System Memory Model)
   - 기본적으로 64Kb의 조각 메모리를 5가지 단계의 방법으로 사용하는 모델을 가지고 있습

     니다.
┌────────────┐CS: Code Segment
│[코드 영역]                   │
│C의 Source가 등록되는  │
│영역, 각종 함수             │
├────────────┤DS: Data Segment
│[Data 영역]                   │
│static변수,                     │
│static 메소드 저장          │
│한번 초기화가 진행되면  │
│재 초기화가 발생안됨     │
├────────────┤SS: Stack Segment
│[Stack 영역]                  │
│함수가 사용하는 영역     │
│함수 안에서 선언되는     │
│지역변수가 선언,           │
│함수 처리가 끝나면        │
│메모리가 자동으로         │
│회수됨, 지역변수 삭제    │
├────────────┤
│[Heap 영역]                  │
│malloc() 함수를 이용해   │
│동적으로 메모리를 할당 │
│하는 영역                      │
│개발자 필이 메모리        │
│해야만 함                      │
└────────────┘

 

2. Call By Value 방식을 이용한 데이터의 전달, 메뉴 코드를 입력받아 메뉴 문자열을 출력하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 void print_menu(char m) {
   switch(m) {
      case 'F' :
        printf("\nFile MENU\n");
        break;
      case 'E' :
        printf("\nEdit MENU\n");
        break;
      case 'H' :
        printf("\nHelp MENU\n");
        break;
      default :
        printf("\n잘못된 입력입니다.\n");
   }
 }

 main() {
   char c;
   printf("메뉴 코드를 입력하세요 : ");
   if((c=getch()) >= 97) c -= 32;

   while(c!='X') {
     print_menu(c);
     printf("메뉴코드를 입력하세요. 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }


3. 입력된 값의 제곱값을 구하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 long int sqr(int i) {
   long int res;

   if(i>0) {
     res=(long)i *(long)i;
     return res;
   }
   else if(i==0)
     return 0;
   else
     return -1;
 }

 main() {
   int a;
   char c;

   printf("시작하려면 ENTER를 누르세요.\n");
   c=getch();
   while(c!='X') {
     printf("\n계산하려는 숫자를 입력하세요 : ");
     scanf("%d", &a);
     printf("%d의 제곱은 %ld입니다.\n", a, sqr(a));
     printf("계속하려면 아무키나 누루세요, 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }




4. 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아 총점은 tot(kor, eng, mat) 함수에

   서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서 출력하는 프로그램을 만들어 보

  시오.

 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}

/*
소스영역    Stack영역
--------    ---------
main()      int kor   90 -┐
               int eng   90 │
               int mat   90  │
---------   ---------  │
tot()         int kor ←-─┘90 복사    
               int eng
               int mat
               int tot
---------   ---------
ave()       int kor
              int eng
              int mat
              float ave
*/



▷ 아래처럼 학점이 출력되는 프로그램으로 수정하세요. (90~100: A, 80~89: B, 70~79:C, 60~69: D, 59이하:F)

국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

과목: 국어    영어    수학    총점    평균
-------------------------------------------
점수: 85      90      90      265      88.3
학점: B       A       A     



▩ 함수의 설계


1. 지하철 승차권 판매 함수 설계
#include <stdio.h>
#include <conio.h>

//처리 로직 시작 함수 void sale(점검중|판매중)
void sale(int k);

//목적지 입력 함수
int target(); 

//동전 금액 입력 void coin(목적지 금액)
void coin(int kum);

//승차권 인쇄
//void print_ticket(목적지 금액,입력 금액);
void print_ticket(int kum, int tot);

void main(){
    int k;  //1:판매중, 2:점검중 구분

    sale(1);  
    getch();
}

void sale(int k){
    int sw=1;
    if (k == 0){
        printf("판매기 점검중\n");   
        return;
    }

    if (k == 1){
        printf("판매기 작동중\n");
        while(sw){
            sw=target();
        }
    }

}

int target(){
    int kum;  //금액 입력
    int sw=1; //0: 정상 금액, 1: 비정상 금액
   
    printf("                  승차권                      \n");
    printf("----------------------------------------------\n");   
    printf("승차권: 700 750 800 850 900 950 1000 1050 1100\n\n");

    while(sw){
        printf("목적지에 해당하는 금액을 눌러 주세요. ");
        scanf("%d", &kum);

        if (kum==9999) {
            printf("\n점검중입니다.\n");
            return 0;
        }else if (kum < 700){
            printf("700원 이하 승차권은 없습니다.\n");
        }else if (kum > 1100) {
            printf("1100원을 초과하는 승차권은 없습니다.\n");
        }else if (kum % 50) {
            printf("승차권은 50원 단위입니다.\n");
        }else{
            sw=0;
        }
    }
    coin(kum);
    return 1;
}

void coin(int kum){
    int sw=1;  //0: 정상 금액, 1: 비정상 금액
    int tot=0; //입력한 금액의 합계
    int in;    //금액을 입력 받는 변수
   
    printf("\n\n");
    printf("입력 가능 화폐(동전/지폐 가능)\n");
    printf("------------------------------\n");   
    printf("종 류: 10 50 100 500 1000\n\n");

    while(sw){
        printf("금액 투입!!!. ");
        scanf("%d", &in);

        if (in < 10){
            printf("10원 이하 금액은 사용할 수 없습니다.\n");
        }else if (in > 1000) {
            printf("1000원을 초과하는 지폐는 사용할 수 없습니다.\n");
        }else if (in % 10) {
            printf("입력 금액은 10원 단위까지 가능합니다.\n");
        }else{
            tot = tot+in;
            if( tot >= kum) sw=0;
            printf("\n현재 입금한 금액:%5d\n", tot);
        }
    }
    print_ticket(kum, tot);
}

void print_ticket(int kum, int tot){
    printf("\n\n");
    printf("%5d원 금액의 승차권이 발매 되었습니다.\n", kum);
    printf("남은 잔액은 %5d원 입니다.\n", tot-kum);
    printf("지하철을 이용해 주셔서 감사합니다.!!!\n\n");
}

Posted by 나비:D
:

▩ 함수(function)


1. 일반적인 프로그램의 구성
   ┌----- 메인 루틴
   │
   ├----- 프로시저(Procedure) : Return 값이 없음
   │
   └----- 함수(Function) : Return 값이 있음
    


2. C언어의 함수 구성 : main() 함수와 일반 함수로 구성됨
   ┌----- 메인 함수 main()
   │
   │
   └----- 함수(Function) : Return 값이 있음, Return 값이 있음


3. 함수의 기본 구성
   return 형 함수명(인수형과 가인수의 나열...){
       함수내 변수 선언;
       실행문;
   }

☞ 함수의 작성 규칙
   1) main() 함수는 기능을 정의 하는 함수가 아니라 다른 함수를 이용하는 통제소의 역활을 한다.
      따라서 처리 로직을 main()안에 두면 안된다.
   2) 가인수와 실인수의 데이터 타입과 갯수는 반드시 일치 시킨다.
   3) 함수안에 선언되는 변수는 모두 지역변수이다. 따라서 메인에서는 사용할 수 없다.
   4) 함수를 처리한 후 함수의 리턴값의 데이터형은 함수의 원형에 선언된 타입과 일치해야한다.
   5) 변수명과 함수명이 같으면 함수의 인식이 안된다.


4. 프로토타입을 선언하는 이유
   - main() 함수로 하여금 어떤 함수가 이 프로그램에 선언되어 있는 지 알려주는 역활을 함
   - 사용자 정의 함수가 main()앞에 있으면 프로토타입이 필요 없고, main()뒤에 선언되면 반드시 프로토타입을 선언해야 한다.


5. 실인수와 가인수의 의미
   - 실인수 : 실제로 값을 가지고 있는 함수를 호출하는 측의 변수
   - 가인수 : 임시로 함수에서 지역 변수로 사용되는 변수


6. 값의 return 유형
   - 상황에 따라 1개이상의 return문이 올 수 있다.
   - return a;
   - return (a);
   - return 1;
   - return a+b;

☞ return을 사용하는 이유
   1) 함수에서 처리 값을 돌려줄 경우  
   2) 함수의 실행을 종료하는 역활을 한다.


7. void 형 함수 : 값을 return 하지 않는 함수, 주로 출력을 하는데 사용
   - void main(){}


8. void 형 인수 : 인수를 받지 않는 함수
   - void kkk(void){ } == void kkk(){ }




▩ 함수응용 예제


1. 함수 원형(Prototype) 정의의 이해
//함수는 한번 재작하면 반복해서 호출할 수 있습니다.
//따라서 소스를 매우 구조적으로 만들어 줍니다.

 #include <stdio.h>
 #include <conio.h>

//함수 선언, 함수 원형 선언, 함수 프로토 타입
 void print_line();

 void main() {
   int x, y;
   char c;

     //1회는 무조건 실행됨으로 do~while()사용
     do {
       print_line();
       printf("\n 첫번째 수를 입력하세요 : "); scanf("%d", &x);
       print_line();
       printf("\n 두번째 수를 입력하세요 : "); scanf("%d", &y);
       print_line();
       printf("\n %d 곱하기 %d는 %d입니다.\n", x, y, x*y);
       print_line();
       printf("\n 계속=>Enter, 종료=>Q");
       c=(getch());
     } while(c!='Q');
     getch();
 }

 //함수 정의
 void print_line() {
   int i;
   for(i=1; i<=30; i++){
      printf("-");
   }
 }




2. 기본적인 함수의 사용

▷ 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아
   총점은 tot(kor, eng, mat) 함수에서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서
   출력하는 프로그램을 만들어 보시오.



>>>>> 처리 형태 1


 #include <stdio.h>
 #include <conio.h>

 //              ┌---- 가인수
 //함수 선언  ↓
 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);
 //↑
 //└---- return 되는 데이터의 타입

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch(); //                                                                  │
 }//                                                                               │
 //                                                                                │
 //             ┌-------------------------------------------┘
 //함수정의  ↓실인수, 값 복사가 발생함, 실인수 <=== 가인수
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot; //정수형 합계 리턴
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>> 출력결과:


국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

국어    영어    수학    총점    평균
--------------------------------------
85       90       90       265     88.3



>>>>> 처리 형태 2


 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat, total;
   float average;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   total = tot(kor, eng, mat);
   average = ave(kor, eng, mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>>> 처리형태 3(권장 아님, 전역변수 사용은 최대한 피해야 합니다.)


 #include <stdio.h>
 #include <conio.h>

 void tot();
 void ave();

 int kor, eng, mat, total;
 float average;

 void main() {
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   tot();
   ave();

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 void tot(){
    total = kor+eng+mat;
 }

 void ave(){
    average = (kor+eng+mat)/3.0;
}



▩ 함수의 반복 호출


#include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++){
      printf("*");
   }
   printf("\n");
 }

 void print_short(void) {
   int i;

   printf("*");
   for(i=0; i<=28; i++){
      printf(" ");
   }
   printf("*");
   printf("\n");
 }

 void main() {
   int x;

   print_long();
   for(x=0; x<=5; x++)
      print_short();
   print_long();
   getch();
 }



▩ 함수의 중첩 예제 : main()함수안에서 호출한 함수안에 함수가 있는 경우


 #include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


☞ 함수원형을 추가한 후의 소스 (권장 유형)

 #include <stdio.h>
 #include <conio.h>

 void print_one(void);   //print_long() 호출
 void print_two(void);   //print_short() 호출
 void print_long(void);  //특수 문자를 30개 출력
 void print_short(void); //공백을 10개 출력, 특수문자 10개 출력
 

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
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
Total :
Today : Yesterday :