프로그래밍실습 제 18 강.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

C 프로그래밍 기초.
2007 1학기 12 배열.
데이터의 표현과 연산 (1) (Chapter 3)
제12장 표준 입출력과 파일 입출력.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
배열(Array) 선린인터넷고등학교 정보통신과 유 순 옥.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express.
-Part3- 제3장 콘솔 입출력과 파일 입출력.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Chapter 10– 표준 함수(1) Outline 10.1 스트림과 파일 10.2 입출력 표준 함수
제1장 코드와라이브러리 Page 1 ~ 30 ■■■■■ ■ ■.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
제5장 제어명령
C언어: 배열 (Arrays).
6장. printf와 scanf 함수에 대한 고찰
HW#1 Source 파일 제출 3.20(수)까지 제출 학번_이름_01.c
Part 14 파일 입출력 ©우균, 창병모 ©우균, 창병모.
Chapter 13 문자 데이터와 문자열 문자 데이터 문자열.
7. while 문의 흐름 제어.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
C 프로그래밍.
21장. 문자와 문자열 처리 함수.
9장 파일 입출력.
표준 출력 함수 printf 출력 데이터 서식화(formatting) 표준 입력 함수 scanf 입력 데이터 서식화
처음으로 배우는 C 프로그래밍 제5부 추가적인 화제들 제 11 장 파일 처리.
Part 04 입출력과 전처리 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
Chapter 4. 보조자료 - 파일 입출력 파일의 기본 개념과 특징을 이해한다. 파일 처리 과정을 이해한다.
C언어 프로그래밍의 이해 Ch14. 파일 입출력.
14주차.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
4장 제어문 선택문: if 문, if – else 문, switch 문
17강 파일처리함수(1) 강 의 내 용 파일 입출력의 개념 파일포인터를 이용한 입출력 파일 입출력 과정
18강 파일처리함수(2) 강 의 내 용 순차파일 만들기와 읽기 순차파일 입출력함수 랜덤파일 처리
13. 포인터와 배열! 함께 이해하기.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
제2장 데이터형과 표준 입출력문 문봉근.
2019년 2월 24일 오후 4시 59분 제2장 표준 입출력 함수
Chapter 10 Strings and Pointers
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 11. 1차원 배열.
CGI (Common Gateway Interface)
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제어문 & 반복문 C스터디 2주차.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
문자열과 배열 문자열 입출력 문자열 처리 함수 문자 처리 함수 문자열의 배열
Chapter 05. 입출력 함수.
제 3장 데이터형과 연산자 Hello!! C 언어 강성호 김학배 최우영.
-Part2- 제1장 1차원 배열이란 무엇인가.
파일 입출력.
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
엔화 대환/대출 자금용도 대상 이자 차액 효과 (A,B,C) 환율 리스크 헷징 (A,B) 엔화의 평균환율 (A,B,C)
제10장 전처리기 문봉근.
3주차: Control Flow and Others
목차. 목차 10.1 문자 표현 방법 예제 char_const.c 10.2 문자열 표현 방법.
어서와 C언어는 처음이지 제16장.
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Chapter 09. 배열.
어서와 C언어는 처음이지 제22장.
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
배열.
11장. 1차원 배열.
⊙ 입출력 처리란? data를 입력장치로부터 program 내부로 읽어 들이거나
Presentation transcript:

프로그래밍실습 제 18 강

강의 내용 난수를 사용한 서로 다른 정수의 출력 순열(permutaion) 문자열(string) 문자열의 입력 문자열 입출력의 다양한 예 잘못 사용된 여러 가지 예 (오류 발생): 문자열 입출력 함수 콘솔(console) 버퍼(buffer), 표준입력(stdin), 표준출력(stdout) 문자(character) 입출력 함수 getchar와 putchar getc와 putc getch, getche와 putch NULL 문자의 이해: NULL 문자의 ASCII 값은 0 문자열의 끝에 있는 NULL문자가 사라지면? 문자열 리터럴(string literal, 문자열 상수) 전체 문자열의 변경

난수를 사용한 서로 다른 정수의 출력 예를 들어 1부터 10사이의 서로 다른 난수 3개를 발생시켜 작은 수부터 큰 수 순서로 출력 하는 프로그램을 작성하여 보자. 알고리즘: 1. 일차원 배열 a를 사용하여 a[1]=1, a[2]=2, … , a[10]=10 이라고 둔다. 2. rand()를 이용하여 1부터 10까지의 수 중 하나의 수 k를 발생시킨다. 그러고 나서 a[1]과 a[k]를 교환한다. 3. rand()를 이용하여 2부터 10까지의 수 중 하나의 수 k를 발생시킨다. 그러고 나서 a[2]와 a[k]를 교환한다. 4. rand()를 이용하여 3부터 10까지의 수 중 하나의 수 k를 발생시킨다. 그러고 나서 a[3]과 a[k]를 교환한다. 5.a[1], a[2], a[3]을 작은 수부터 크기 순서대로 정렬한 뒤 출력한다.

알고리즘의 적용 예: 1. a[1]=1, a[2]=2, a[3]=3, a[4]=4, a[5]=5, a[6]=6, a[7]=7, a[8]=8, a[9]=9, a[10]=10 2. 처음 발생한 난수 k가 6이라고 하자. a[1]과 a[6]를 교환하면 다음과 같다: a[1]=6, a[2]=2, a[3]=3, a[4]=4, a[5]=5, a[6]=1, a[7]=7, a[8]=8, a[9]=9, a[10]=10 3. 다음에 발생한 난수 k가 8이라고 하자. a[2]와 a[8]을 교환하면 다음과 같다: a[1]=6, a[2]=8, a[3]=3, a[4]=4, a[5]=5, a[6]=1, a[7]=7, a[8]=2, a[9]=9, a[10]=10 4. 다음에 발생한 난수 k가 4라고 하자. a[3]과 a[4]를 교환하면 다음과 같다: a[1]=6, a[2]=8, a[3]=4, a[3]=3, a[4]=5, a[5]=1, a[7]=7, a[8]=2, a[9]=9, a[10]=10 5. a[1], a[2], a[3]를 크기순서대로 정렬한 뒤 출력하여 다음을 얻는다. 4 6 8

주어진 자료를 순서대로 나열하는 모든 경우를 생각해보자. 예를 들어 1, 2, 3을 순서대로 나열하는 모든 경우를 생각하면 순열(permutaion) 주어진 자료를 순서대로 나열하는 모든 경우를 생각해보자. 예를 들어 1, 2, 3을 순서대로 나열하는 모든 경우를 생각하면 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1 의 6가지 이다. 일반적으로 n개의 서로 다른 자료를 나열하는 모든 경우의 수는 n!개 이다. C언어를 사용하여 n!개의 순열을 순서대로 모두 출력하는 방법을 생각해보자. http://dasan.sejong.ac.kr/~yjcha/c1/c_lectures/ch_08_permutation.hwp

C코드: 08_15.c ~ 08_19 참조

제9장. 문자열(string) H o u s e \0 문자열: 문자 여러 개가 합쳐져서 만들어지는 열. 보통 큰따옴표(" ")에 의해 둘러싸여 나타내진다. 문자열은 문자 여러 개로 이루어진 char형 배열로 볼 수 있다. 문자열 저장시 문자열의 마지막은 NULL 문자라 불리는 \0 이 저장된다.(NULL 문자는 문자열의 끝을 표시하며 글꼴에 따라 \0으로 나타내지기도 한다.) 따라서 배열의 크기는 전체 바이트 수 보다 하나 이상 크게 잡아야 한다. 위 예에서는 배열의 크기를 최소 6이상으로 잡아야 한다. (영문,숫자,기호: 한 글자 당 1바이트 한글: 한 글자 당 2바이트) 문자열의 입출력을 위한 변환문자: %s H o u s e \0

예: #include<stdio.h> main() { char a[4]="Hi!"; char b[7]="홍길동"; printf("%s\n",a); printf("이름: %s\n",b); } 출력: Hi! 이름: 홍길동 참고: a: 배열의 크기가 4이상이어야 하며 3이하이면 오류 발생 b: 배열의 크기가 7이상이어야 하며 6이하이면 오류 발생 배열의 크기를 명시하지 않고 다음과 같이 해도 된다: char a[]="Hi!"; char b[]="홍길동";

문자열의 입력 #include<stdio.h> main() { char name[20]; printf("이름을 입력하십시오.\n"); scanf("%s",name); //name 앞에 &가 없음에 주의 printf("\n이름: %s\n",name); } 입출력 예: 이름을 입력하십시오. 홍길동 이름: 홍길동

주의: 1. 앞 예에서 char name[20]; scanf("%s",name); // name앞에 &를 붙일 필요가 없다. 배열이름 자체가 포인터이기 때문이다. 2. 입력시 공백문자를 입력하면 그 이전까지만 입력되므로 주의할 것. 예: 이름을 입력하십시오. 홍 길동 이름: 홍

문자열 입출력의 다양한 예 #include<stdio.h> main() { char a[10]="Hi!", b[10]; char *c="안녕하세요.",*d; printf("문자열 2개를 입력 하십시오.\n"); scanf("%s%s",a,b); d="반갑습니다."; printf("%s\n%s\n%s\n%s\n",a,b,c,d); } 입출력 예: 문자열 2개를 입력 하십시오. AB 1234567 AB 1234567 안녕하세요. 반갑습니다.

[주의] 잘못 사용된 여러 가지 예 (오류 발생): char a[6]; a="ABCDE"; // a는 포인터 상수이므로 이와 같은 치환문은 사용 불가. 선언과 동시에 초기화 하거나, 아니면 scanf등으로 입력 받아야 함. 오류 발생 char *c; scanf("%s",c); // 포인터로 선언된 경우는 메모리 동적 할당이 되기 전에는 입력 불가. 오류 발생 즉, 예를 들어 다음과 같이 동적할당을 하면 오류 없이 사용 가능하다: c=malloc(10*sizeof(char)); scanf("%s",c);

문자열 입출력 함수 문자열 입력 함수: gets() 문자열 출력 함수: puts() (두 함수 모두 stdio.h를 필요로 함) 예: #include<stdio.h> main() { char name[12],number[10]; puts("이름을 입력하십시오."); // 문자열 끝에 \n이 없음에 주의 gets(name); puts("학번을 입력하십시오."); gets(number); printf("이름: %s \n학번: %s\n",name,number); }

입출력 예: 이름을 입력하십시오. S. Kim 학번을 입력하십시오. 092048 이름: S. Kim 학번: 092048 주의: 1. gets()의 경우 공백문자를 포함하여 입력 가능하다. 2. puts()의 경우 출력 후 자동으로 커서를 다음 줄로 내린다.

콘솔(console): 컴퓨터를 제어하기 위한 계기반. 일반적인 의미로는 각종 시스템에서 주요 본체가 되는 기기를 일컫는 말이다. 이를테면 컴퓨터에서는 본체, 게임기에서는 게임조정바와 모니터, 음향기기 에서는 여러 음원들을 섞는 믹서, 오디오 시스템에서는 엠프, 비행기에서는 계기반 등이 콘솔에 해당한다. 컴퓨터의 경우 콘솔은 오퍼레이터와 컴퓨터 사이에 대화할 수 있는 입출력장치로 오퍼레이터는 콘솔을 통해 모든 프로그램을 총괄한다. 즉 컴퓨터의 작동 및 정지, 프로그램 입력, 오류 발생시 컴퓨터의 상태를 정상화하는 작업 등이 콘솔을 통해 이루어진다. 콘솔은 오퍼레이터가 명령을 입력하는 콘솔판(console panel)과 컴퓨터 내의 정보가 표시되는 콘솔탁자(console device)로 구성된다. 개인용 PC에서 콘솔판은 키보드(입력장치), 콘솔탁자는 모니터(출력장치)에 해당한다. 따라서 콘솔 입력은 키보드로 입력한다는 의미이고, 콘솔 출력은 모니터로 출력한다는 의미이다. 출처: 두산백과사전 EnCyber & EnCyber.com

버퍼(buffer) : 컴퓨터에 버퍼는 한 곳에서 다른 곳으로 데이터가 이동되기 위해 임시로 머무는 저장소(memory)를 말한다. 예를 들면 데이터는 키보드와 같은 입력 장치를 통해 입력되어 다른 곳으로 보내지기 전까지 입력된 상태 그대로 입력버퍼에 저장된다. 표준입력(stdin) : 키보드를 통한 입력. 일단 입력된 내용은 입력버퍼에 저장되며 특별히 제거해 주지 않는 한 버퍼에 그대로 남아 있어서 다음 번 입력에 사용된다. 표준출력(stdout) : 모니터를 통한 출력.

문자(character) 입출력 함수 1. 대표적인 문자 입출력 함수: getchar와 putchar 예: #include<stdio.h> main() { char ch1,ch2='A'; ch1=getchar(); //getchar(ch1);이 아닌 것에 주의 할 것 putchar(ch1); putchar(ch2); putchar('B'); putchar('\n'); } 입출력 예: C CAB

#include<stdio.h> main() { char ch1,ch2='A'; scanf("%c",&ch1); 주의: getchar의 경우 한번에 한 글자(1바이트)만 입력 가능하다. 따라서 2바이트인 한글을 입력하기 위해서는 (뒤에 나오는) 순환문을 이용한 입력 방법을 사용하거나 아니면 gets혹은 scanf를 사용해야 한다. 또한 앞의 예는 다음과 같이 scanf와 printf를 사용하여 작성할 수 있다. (입출력은 완전히 같다.) #include<stdio.h> main() { char ch1,ch2='A'; scanf("%c",&ch1); printf("%c%c%c\n",ch1,ch2,'B'); }

2. 문자 입출력 함수의 다른 예: getc와 putc #include<stdio.h> void main() { char a; printf("문자 하나를 입력하십시오.\n"); a=getc(stdin); // stdin: 표준 입력. 즉, 키보드 입력 printf("입력된 문자는 다음과 같습니다.\n"); putc(a,stdout); // stdout: 표준 출력. 즉, 화면 출력 putc('\n',stdout); } 입출력 예: 문자 하나를 입력하십시오. R 입력된 문자는 다음과 같습니다.

3. 또 다른 문자 입출력 함수: getch, getche와 putch 타이핑된 글자를 한번 보여주고(echo) 입력된다. putch 함수는 putchar함수와 기능이 동일하다. getch, getche, putch 함수를 사용하려면 conio.h 가 필요하다.(conio는 console input output의 줄임말임)

getch의 사용 예: #include<stdio.h> #include<conio.h> main() { char c; printf("문자를 입력하십시오: "); c=getch(); printf("\n입력하신 문자는 다음과 같습니다.\n"); putch(c); putchar('\n'); } 입출력 예: 문자를 입력하십시오: 입력하신 문자는 다음과 같습니다. a

getche의 사용 예: #include<stdio.h> #include<conio.h> main() { char c; printf("문자를 입력하십시오: "); c=getche(); //getche의 사용 printf("\n입력하신 문자는 다음과 같습니다.\n"); putch(c); putchar('\n'); } 입출력 예: 문자를 입력하십시오: a 입력하신 문자는 다음과 같습니다. a

NULL 문자의 이해: NULL 문자의 ASCII 값은 0 #include <stdio.h> main(){ char b[4]="Car"; //b[3]은 NULL문자로 채워진다. char c[5]="Car"; //c[3], c[4]는 모두 NULL문자로 채워진다. printf("%c %c %c %c \n",b[0],b[1],b[2],b[3]); printf("%d %d %d %d \n",b[0],b[1],b[2],b[3]); printf("%c %c %c %c %c \n",c[0],c[1],c[2],c[3],c[4]); printf("%d %d %d %d %d \n",c[0],c[1],c[2],c[3],c[4]); printf("%s %s\n",b,b); printf("%s %s\n",c,c); //NULL문자를 만나기 전까지 출력한다. } 출력: C a r 67 97 114 0 67 97 114 0 0 Car Car

#include <stdio.h> main(){ char str1[4]={'A','B','C','\0'}; //다음 선언문에서 ASCII값 0은 NULL문자를 나타냄 char str2[4]={'A','B','C',0}; char str3[4]={'A','B','C',NULL}; //다음 출력에서 3개의 문자열은 모두 동일 printf("%s %s %s\n",str1,str2,str3); str1[0]='D'; //문자열중 한 문자의 치환 str1[1]='E'; printf("%s\n",str1); } 출력 ABC ABC ABC DEC

문자열의 끝에 있는 NULL문자가 사라지면? #include<stdio.h> main(){ char string[4]="ABC"; string[3]='D'; //NULL문자를 'D'로 치환 printf("%s\n",string); } 출력 예: ABCD儆儆덝?

참고: 문자열 리터럴(string literal, 문자열 상수) 예를 들어 문자열 "ABC"는 포인터 상수이며 문자열의 첫글자가 저장된 기억장소의 주소를 나타낸다. #include<stdio.h> main(){ char *str="ABC"; //str은 포인터변수. "ABC"는 포인터 상수 printf("%p\n",str); //문자열 "ABC"의 첫글자가 저장된 기억장소의 주소 printf("%p\n","ABC");//문자열 "ABC"의 첫글자가 저장된 기억장소의 주소 printf("%c\n",*str); //문자열의 첫글자 'A' printf("%c\n",*"ABC"); //문자열의 첫글자 'A' printf("%c\n",str[0]); //문자열의 첫글자 'A' //str[0]='D'; //실행시 오류 발생. 문자열 리터럴의 일부 변경은 불가함 //scanf("%s",str); //실행시 오류 발생. str은 동적할당 되지 않은 포인터 변수 } 출력 예: 00CC59D8 A 참고: 위 예에서 "ABC"는 문자열 리터럴(literal)이라 불리며 이와 같은 문자열들은 별도의 공간에 따로 저장된다. 이 문자열들은 일부 수정이 불가하다.

전체 문자열의 변경 #include<stdio.h> main(){ char *str="ABC"; printf("%s\n",str); printf("%p\n",str); //문자열 "ABC"의 첫글자가 저장된 기억장소의 주소 str="DEFGH";//문자열을 통채로 바꾸는 것은 가능. str에 새 주소가 저장됨 printf("%p\n",str); //문자열 "DEFGH"의 첫글자가 저장된 기억장소의 주소 } 출력 예: ABC 012159D8 DEFGH 012158B4