Download presentation
Presentation is loading. Please wait.
1
프로그래밍실습 제 18 강
2
강의 내용 난수를 사용한 서로 다른 정수의 출력 순열(permutaion) 문자열(string) 문자열의 입력
문자열 입출력의 다양한 예 잘못 사용된 여러 가지 예 (오류 발생): 문자열 입출력 함수 콘솔(console) 버퍼(buffer), 표준입력(stdin), 표준출력(stdout) 문자(character) 입출력 함수 getchar와 putchar getc와 putc getch, getche와 putch NULL 문자의 이해: NULL 문자의 ASCII 값은 0 문자열의 끝에 있는 NULL문자가 사라지면? 문자열 리터럴(string literal, 문자열 상수) 전체 문자열의 변경
3
난수를 사용한 서로 다른 정수의 출력 예를 들어 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]을 작은 수부터 크기 순서대로 정렬한 뒤 출력한다.
4
알고리즘의 적용 예: 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]를 크기순서대로 정렬한 뒤 출력하여 다음을 얻는다.
5
주어진 자료를 순서대로 나열하는 모든 경우를 생각해보자. 예를 들어 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!개의 순열을 순서대로 모두 출력하는 방법을 생각해보자.
6
C코드: 08_15.c ~ 08_19 참조
7
제9장. 문자열(string) H o u s e \0 문자열: 문자 여러 개가 합쳐져서 만들어지는 열.
보통 큰따옴표(" ")에 의해 둘러싸여 나타내진다. 문자열은 문자 여러 개로 이루어진 char형 배열로 볼 수 있다. 문자열 저장시 문자열의 마지막은 NULL 문자라 불리는 \0 이 저장된다.(NULL 문자는 문자열의 끝을 표시하며 글꼴에 따라 \0으로 나타내지기도 한다.) 따라서 배열의 크기는 전체 바이트 수 보다 하나 이상 크게 잡아야 한다. 위 예에서는 배열의 크기를 최소 6이상으로 잡아야 한다. (영문,숫자,기호: 한 글자 당 1바이트 한글: 한 글자 당 2바이트) 문자열의 입출력을 위한 변환문자: %s H o u s e \0
8
예: #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[]="홍길동";
9
문자열의 입력 #include<stdio.h> main() { char name[20];
printf("이름을 입력하십시오.\n"); scanf("%s",name); //name 앞에 &가 없음에 주의 printf("\n이름: %s\n",name); } 입출력 예: 이름을 입력하십시오. 홍길동 이름: 홍길동
10
주의: 1. 앞 예에서 char name[20]; scanf("%s",name); // name앞에 &를 붙일 필요가 없다.
배열이름 자체가 포인터이기 때문이다. 2. 입력시 공백문자를 입력하면 그 이전까지만 입력되므로 주의할 것. 예: 이름을 입력하십시오. 홍 길동 이름: 홍
11
문자열 입출력의 다양한 예 #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 AB 안녕하세요. 반갑습니다.
12
[주의] 잘못 사용된 여러 가지 예 (오류 발생): char a[6]; a="ABCDE"; // a는 포인터 상수이므로 이와 같은 치환문은 사용 불가. 선언과 동시에 초기화 하거나, 아니면 scanf등으로 입력 받아야 함. 오류 발생 char *c; scanf("%s",c); // 포인터로 선언된 경우는 메모리 동적 할당이 되기 전에는 입력 불가. 오류 발생 즉, 예를 들어 다음과 같이 동적할당을 하면 오류 없이 사용 가능하다: c=malloc(10*sizeof(char)); scanf("%s",c);
13
문자열 입출력 함수 문자열 입력 함수: 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); }
14
입출력 예: 이름을 입력하십시오. S. Kim 학번을 입력하십시오. 092048 이름: S. Kim 학번: 주의: 1. gets()의 경우 공백문자를 포함하여 입력 가능하다. 2. puts()의 경우 출력 후 자동으로 커서를 다음 줄로 내린다.
15
콘솔(console): 컴퓨터를 제어하기 위한 계기반.
일반적인 의미로는 각종 시스템에서 주요 본체가 되는 기기를 일컫는 말이다. 이를테면 컴퓨터에서는 본체, 게임기에서는 게임조정바와 모니터, 음향기기 에서는 여러 음원들을 섞는 믹서, 오디오 시스템에서는 엠프, 비행기에서는 계기반 등이 콘솔에 해당한다. 컴퓨터의 경우 콘솔은 오퍼레이터와 컴퓨터 사이에 대화할 수 있는 입출력장치로 오퍼레이터는 콘솔을 통해 모든 프로그램을 총괄한다. 즉 컴퓨터의 작동 및 정지, 프로그램 입력, 오류 발생시 컴퓨터의 상태를 정상화하는 작업 등이 콘솔을 통해 이루어진다. 콘솔은 오퍼레이터가 명령을 입력하는 콘솔판(console panel)과 컴퓨터 내의 정보가 표시되는 콘솔탁자(console device)로 구성된다. 개인용 PC에서 콘솔판은 키보드(입력장치), 콘솔탁자는 모니터(출력장치)에 해당한다. 따라서 콘솔 입력은 키보드로 입력한다는 의미이고, 콘솔 출력은 모니터로 출력한다는 의미이다. 출처: 두산백과사전 EnCyber & EnCyber.com
16
버퍼(buffer) : 컴퓨터에 버퍼는 한 곳에서 다른 곳으로 데이터가 이동되기 위해 임시로 머무는 저장소(memory)를 말한다. 예를 들면 데이터는 키보드와 같은 입력 장치를 통해 입력되어 다른 곳으로 보내지기 전까지 입력된 상태 그대로 입력버퍼에 저장된다. 표준입력(stdin) : 키보드를 통한 입력. 일단 입력된 내용은 입력버퍼에 저장되며 특별히 제거해 주지 않는 한 버퍼에 그대로 남아 있어서 다음 번 입력에 사용된다. 표준출력(stdout) : 모니터를 통한 출력.
17
문자(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
18
#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'); }
19
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 입력된 문자는 다음과 같습니다.
20
3. 또 다른 문자 입출력 함수: getch, getche와 putch
타이핑된 글자를 한번 보여주고(echo) 입력된다. putch 함수는 putchar함수와 기능이 동일하다. getch, getche, putch 함수를 사용하려면 conio.h 가 필요하다.(conio는 console input output의 줄임말임)
21
getch의 사용 예: #include<stdio.h> #include<conio.h> main() { char c; printf("문자를 입력하십시오: "); c=getch(); printf("\n입력하신 문자는 다음과 같습니다.\n"); putch(c); putchar('\n'); } 입출력 예: 문자를 입력하십시오: 입력하신 문자는 다음과 같습니다. a
22
getche의 사용 예: #include<stdio.h> #include<conio.h> main() { char c; printf("문자를 입력하십시오: "); c=getche(); //getche의 사용 printf("\n입력하신 문자는 다음과 같습니다.\n"); putch(c); putchar('\n'); } 입출력 예: 문자를 입력하십시오: a 입력하신 문자는 다음과 같습니다. a
23
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 Car Car
24
#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
25
문자열의 끝에 있는 NULL문자가 사라지면? #include<stdio.h> main(){ char string[4]="ABC"; string[3]='D'; //NULL문자를 'D'로 치환 printf("%s\n",string); } 출력 예: ABCD儆儆덝?
26
참고: 문자열 리터럴(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)이라 불리며 이와 같은 문자열들은 별도의 공간에 따로 저장된다. 이 문자열들은 일부 수정이 불가하다.
27
전체 문자열의 변경 #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
Similar presentations