반응형
16. [프로그램 8-17]의 compute_avg 함수는 전달된 인수를 배열로 선언하여 처리한다. compute_avg 함수가 포인터를 이용하여 처리하도록 수정하시오.
#include <stdio.h>
#define N 4
double compute_avg(int *p); // 함수의 원형 선언
int main()
{
int notebook[N] = { 2507, 2232, 2009, 2890 };
int pen[N] = { 4527, 5370, 4923, 6097 };
double average;
// 노트의 평균 판매수 구하기
average = compute_avg(notebook);
printf("노트 평균 판매수: %.1lf \n", average);
// 펜의 평균 판매수 구하기
average = compute_avg(pen);
printf("펜 평균 판매수: %.1lf \n", average);
return 0;
}
// 전달된 배열의 평균을 구하는 함수
double compute_avg(int *p)
{
int i, sum = 0;
for (i = 0; i < N; i++) {
sum = sum + *(p + i);
}
return (double)sum / N;
}
17. sales 배열에 대리점 10곳의 월 판매량이 저장되어 있다. 이 배열에서 사용자가 입력한 n에 대해 상위 n개의 판매량을 출력하는 프로그램을 작성하시오. 상위 n개의 값을 sales[0]~sales[n-1]에 저장하는 top_n 함수를 정의하여 이용하며 main 함수의 sales 배열은 다음과 같이 초기화한다.
#include <stdio.h>
#define N 4
void top_n(int sales[], int n); // 함수의 원형 선언
int main()
{
int sales[10] = { 203, 105, 302, 200, 289, 175, 130, 120, 267, 312 };
int n;
printf("n을 입력하세요:");
scanf_s("%d", &n);
top_n(sales, n);
for (int i = 0; i < n; i++)
printf("%d ", sales[i]);
return 0;
}
void top_n(int sales[], int n)
{
for (int i = 0; i < n; i++) {
int max = 0;
int index = 0;
for (int j = i; j < 10; j++) {
if (sales[j] > max) {
max = sales[j];
index = j;
}
}
int temp = sales[i];
sales[i] = max;
sales[index] = temp;
}
}
18. 10명의 퀴즈 점수 15, 4, 8, 9, 6, 13, 12, 10, 9, 11을 저장하고 있는 배열 quiz의 최대치를 출력하는 프로그램을 작성하시오. quiz 배열의 최대치는 전달된 배열의 최대치에 대한 배열 첨자를 반환하는 함수 index_of_max를 이용하도록 작성하시오.
#include <stdio.h>
int index_of_max(int quiz[]);
int main()
{
int quiz[10] = { 15, 4, 8, 9, 6, 13, 12, 10, 9, 11 };
printf("%d ", quiz[index_of_max(quiz)]);
return 0;
}
int index_of_max(int quiz[]) {
int max = quiz[0];
int index = 0;
for (int i = 0; i < 10; i++) {
if (quiz[i] > max) {
max = quiz[i];
index = i;
}
}
return index;
}
19. 학생 10명의 이름, 전화번호, 평점 정보가 저장되어 있을 때 학생 이름으로 정보를 검색하여 출력하는 프로그램을 작성하시오.
#include <stdio.h>
#include <string.h>
#define N 10
int search(char findname[], char* nameList[]);
int main()
{
char* name[N] = { "나태희", "유현빈", "나원빈", "문건영",
"소지법", "나보배", "장도건", "고수영", "이나라", "김해수" };
char* phone[N] = { "010-5228-7889", "010-5211-1472", "010-1235-8765",
"010-8282-8282", "010-5165-3483", "010-5232-1628", "010-3452-1676",
"010-5210-5463", "010-5210-1234", "010-8255-8255" };
double grade[N] = { 4.3, 4.0, 3.2, 2.7, 3.2, 4.0, 4.4, 3.7, 4.2, 3.8 };
char who[10];
printf("이름 입력:");
gets_s(who, 10);
int index = search(who, name);
if (index == -1)
printf("이름을 찾을 수 없습니다!\n");
else {
printf("이름 전화 평점\n");
printf("=============================\n");
printf("%-6s %-13s %-5lf", name[index], phone[index], grade[index]);
}
return 0;
}
int search(char findname[], char* nameList[])
{
for (int i = 0; i < N; i++) {
if (!strcmp(findname, nameList[i]))
return i;
}
return -1;
}
20. 1~45 범위의 난수 6개로 구성된 로또 번호를 생성하는 프로그램을 작성하시오. 난수 6개는 no 배열에 저장하되 6개의 난수가 서로 달라야 하며 화면에 출력될 때는 오름차순으로 정렬하여 표시한다. 사용자에게 생성한 로또 번호를 보여준 후에는 새로운 로또 번호의 생성 여부를 물어 사용자가 [Esc] 키를 누르면 더 이상 생성하지 않고 실행을 끝낸다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define N 6
void random_no(int numList[]);
void sort(int numList[]);
void print_lotto(int numList[]);
int main()
{
srand((unsigned)time(NULL));
int lottoNumList[N] = { 0 };
do {
random_no(lottoNumList);
sort(lottoNumList);
print_lotto(lottoNumList);
printf("그만하려면 [Esc]키를, 새 로또 번호를 보려면 다른 키를 누르세요.\n");
} while (_getch() != 0X1B);
return 0;
}
void random_no(int numList[])
{
for (int i = 0; i < N; i++) {
numList[i] = rand() % 45 + 1;
for (int j = 0; j < i; j++) {
if (numList[i] == numList[j]) {
i--; //중복이면 다시 생성
break;
}
}
}
}
void sort(int numList[])
{
for (int i = 0; i < N; i++) {
int max = 0;
int index = 0;
for (int j = i; j < N; j++) {
if (numList[j] > max) {
max = numList[j];
index = j;
}
}
int temp = numList[i];
numList[i] = max;
numList[index] = temp;
}
}
void print_lotto(int numList[])
{
printf("당첨 번호: ");
for (int i = 0; i < N; i++) {
printf("%d ", numList[i]);
}
printf("\n");
}
21. char msg[] = "Happy Birthday!";로 msg에 문자열이 저장되어 있다. 전광판에 글자가 반복적으로 지나가는 것과 같이 "Happy Birthday!" 문자열의 글자들이 다음 그림과 같이 0.5초 마다 한 글자씩 앞으로 당겨져서 한 바퀴 회전하여 마지막에는 다시 "Happy Birthday!"가 나타나서 끝나는 프로그램을 작성하고자 한다. 문자열 내용을 직접 변경하지 말고 포인터를 사용하여 해결하시오.
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main(void)
{
char msg[] = "Happy Birthday!";
int repeat, i, offset = 0;
for (repeat = 0; repeat <= strlen(msg); repeat++) {
printf(" %s", msg + repeat); //msg+repeat가 가리키는 위치부터 끝까지 출력
for (i = 0; i < repeat; i++)
printf("%c", msg[i]); //처음부터 msg+repeat 앞까지 출력
printf("\r"); //내용을 지우기 위해 캐리지 리턴
Sleep(500);
}
return 0;
}
반응형
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++] 입출력(cin, cout)과 네임스페이스(namespace) (0) | 2022.11.17 |
---|---|
<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 11(1번~10번) (0) | 2020.11.26 |
c언어 콘솔에서 음악 동시에 재생하기(mcisendCommand, playsound) (3) | 2020.11.18 |
<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 10(11, 12, 13, 14, 15) (0) | 2020.10.18 |
<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 10(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) (0) | 2020.10.17 |