어서와 C언어는 처음이지 제22장
배열 채우기 초기값 대입 사용자 데이터 입력 디스크 파일
배열 탐색하기 신용카드 회사가 하나 있다. 회사는 고객의 ID 정보가 저장된 배열을 가지고 있다. 고객들의 카드 사용액을 저장하고 있는 배열도 있다. 평행 배열
예제: 신용카드 회사의 프로그램 고객 ID 번호를 요구한다. (이것이 키이다.) 키 값과 일치하는 고객 카드 사용액을 찾아서 배열을 탐색한다. 고객이 이미 $100 이상의 카드 사용액이 있으면 고객에게 경고한다.
실행 결과 /* 이 프로그램은 사용자로부터 ID 번호를 받는다. ID를 가지고 데이터베이스에서 고객들의 리스트를 탐색한다. 고객이 있으면 현재 카드 사용액을 검사하기 위하여 발견된 첨자를 이용한다. 그리고 현재 카드 사용액이 100달러이상이면 경고한다. */ *** 고객 카드 사용액 검색 *** 어떤 고객의 카드 사용액을 검색하시겠습니까? 313 ** 고객의 카드 사용액이 아직 여유가 있습니다! 어떤 고객의 카드 사용액을 검색하시겠습니까? 891 ** 잘못된 사용자 ID입니다. ID 891은 발견되지 않았습니다. 어떤 고객의 카드 사용액을 검색하시겠습니까? 475 ** 고객의 카드 사용액은 $192.41. 더 이상의 사용은 불가능합니다.
// 완전 초보자 가이드 3판 22장 예제 #1 #include <stdio.h> main() { int ctr; // 루프 카운터 int idSearch; // 탐색할 고객(키) int found = 0; // 고객이 발견되면 1 (true) // 2개의 평행 배열에 10개의 요소를 정의한다. int custID[10] = { 313, 453, 502, 101, 892, 475, 792, 912, 343, 633 }; float custBal[10] = { 0.00, 45.43, 71.23, 301.56, 9.08, 192.41, 389.00, 229.67, 18.31, 59.54 };
/* 사용자와 상호작용한다. */ printf("\n\n*** 고객 카드 사용액 검색 ***\n"); printf("어떤 고객의 카드 사용액을 검색하시겠습니까? "); scanf(" %d", &idSearch); /* 고객 배열에서 입력받은 고객 ID가 존재하는 지를 검사한다. */ for (ctr = 0; ctr<10; ctr++) { if (idSearch == custID[ctr]) found = 1; break; }
if (found) { if (custBal[ctr] > 100.00) printf("\n** 고객의 카드 사용액은 $%.2f.\n", custBal[ctr]); printf(" 더 이상의 사용은 불가능합니다. \n"); } else printf("\n** 고객의 카드 사용액이 아직 여유가 있습니다!\n"); printf("** 잘못된 사용자 ID입니다. "); printf("\n ID %3d은 발견되지 않았습니다. \n", idSearch); return(0);
실행 결과 *** 고객 카드 사용액 검색 *** 어떤 고객의 카드 사용액을 검색하시겠습니까? 313 ** 고객의 카드 사용액이 아직 여유가 있습니다! 어떤 고객의 카드 사용액을 검색하시겠습니까? 891 ** 잘못된 사용자 ID입니다. ID 891은 발견되지 않았습니다. 어떤 고객의 카드 사용액을 검색하시겠습니까? 475 ** 고객의 카드 사용액은 $192.41. 더 이상의 사용은 불가능합니다.
예제: 농구 예제 사용자에게 10개의 정수값을 받아서 배열에 저장한다. 배열에 저장된 값들의 합계와 평균을 계산하여 출력한다. 선수의 최다득점 경기 기록: 최다득점 경기는 game 1 득점은 100 점 리바운드는 20 회 어시스트는 10 회
// 완전 초보자 가이드 3판 22장 예제 #2 // 파일 Chapter22ex2.c /* 이 프로그램은 3개의 배열을 선수의 득점, 리바운드 횟수, 어시스트 횟수로 채운다. 반복 루프를 통하여 득점 배열에서 가장 많은 득점을 했던 경기를 찾는다. 그 경기의 3가지 카테고리에서의 점수를 출력한다. */ #include <stdio.h> main() { int gameScores[10] = { 12, 5, 21, 15, 32, 10, 6, 31, 11, 10 }; int gameRebounds[10] = { 5, 7, 1, 5, 10, 3, 0, 7, 6, 4 }; int gameAssists[10] = { 2, 9, 4, 3, 6, 1, 11, 6, 9, 10 }; int bestGame = 0; // 이제까지의 최다 득점 int gmMark = 0; // 가장 득점이 많았던 경기 번호를 저장한다. int i;
for (i = 0; i<10; i++) { // 반복 루프에서 각 경기의 득점을 이제까지의 최다득점 기록과 비교한다. // 현재의 점수가 더 높으면, 이것이 새로운 최다득점이 된다. // 그리고 현재의 요소 번호가 gmMark에 저장된다. if (gameScores[i] > bestGame) bestGame = gameScores[i]; gmMark = i; } // 최다 득점 게임의 세부 사항을 출력한다. // 배열이 0에서 시작하기 때문에 경기 번호에 1을 더한다. printf("\n\n선수의 최다득점 경기 기록:\n"); printf("최다득점 경기는 game #%d\n", gmMark + 1); printf("득점은 %d 점\n", gameScores[gmMark]); printf("리바운드는 %d 회\n", gameRebounds[gmMark]); printf("어시스트는 %d 회\n", gameAssists[gmMark]); return(0);
Lab: 평균 계산 크기가 10인 1차원 배열에 0부터 99 사이의 난수를 저장한 후에, 최대값과 최소값을 출력하는 프로그램을 작성하시오. 난수는 rand() 함수를 호출하여 생성하라. 58 27 29 12 89 67 0 85 71 3 최대값은 89, 최소값은 0입니다.
#include <time.h> #include <stdio.h> #include <stdlib.h> #define SIZE 10 main() { int values[SIZE]; int i, max, min; srand((unsigned int)time(NULL)); for (i = 0; i < SIZE; i++){ values[i] = rand() % 100; printf("%d ", values[i]); } printf("\n");
max = values[0]; min = values[0]; for (i = 1; i < SIZE; i++){ if (values[i] > max) max = values[i]; if (values[i] < min) min = values[i]; } printf("최대값은 %d, 최소값은 %d입니다. \n", max, min); return 0;
학습 정리 배열을 채우는 것은 단지 첫 번째 단계일 뿐이다. 배열이 채워진 다음에 프로그램이 데이터와 상호작용해야 한다. 탐색에 대해 더 많이 배우기 전에, 일단 순차 탐색부터 익혀야 한다. 이것이 가장 쉬운 탐색 기법이다. 탐색이 실패할 수도 있다는 것을 항상 기억해야 한다. 탐색값이 리스트에 없을 수도 있다고 항상 생각하자. 그리고 실패한 탐색을 처리하는 코드도 추가하자.
Q & A