[1번 문제]
/*
입력된 정수를 long형 변수 num에 저장하고, 저장된 숫자의 역순 값을 long형 변수 rev에 저장하여 출력하는 프로그램을 작성한다.
예를 들어 정수 1234가 입력되었다면 변수 rev에는 정수 4321이 저장되도록 한다
*/
#include <stdio.h>
#include <math.h>
long reverse(long num)
{
long rev=0;
int length = 0;
length = (int)(log10(num) + 1);
for (int i = length; i >= 1; i--)
{
rev += num % 10 * pow(10, i - 1);
num /= 10;
//printf("%ld\n", rev);
}
return rev;
}
int main(void)
{
long num;
printf("뒤집고 싶은 숫자를 입력: ");
scanf("%ld", &num);
printf("역순으로 출력: %ld\n", reverse(num));
return 0;
}
[2번 문제]
/*
입력된 실수를 double형 변수 num에 저장하고, 저장된 숫자의 역순 값을 double형 변수 rev에 저장하여 출력하는 프로그램을 작성한다.
예를 들어 정수 1.234가 입력되었다면 변수 rev에는 정수 432.1이 저장되도록합니다
*/
#include <stdio.h>
#include <math.h>
double reverse(double num)
{
int length, length2;
double rev = 0.0;
int count = 0;
int number=(int)num; //실수 중 정수형 부분
//printf("정수부분:%d\n", number);
length = (int)(log10(number) + 1); //정수 부분 길이
double decimal = num - number; //실수형 부분
//printf("실수부분: %lf\n", decimal);
//printf("%d\n", (int)(10 * decimal));
do
{
if ((int)(10*decimal)%10==0) //0이 두번 나오기 전까지
{
//printf("count++\n");
count += 1;
}
if (count == 2)
break;
decimal *= 10;
} while (count != 2);
length2 = (int)(log10((int)decimal) + 1); //실수부분 길이
for (int i = length2; i >= 1; i--)
{
rev += ((int)decimal % 10) * pow(10, i - 1);
decimal /= 10;
}
//printf("%lf\n", rev);
for (int i = length; i >= 1; i--)
{
rev += (number) % 10 * pow(10, -i);
number /= 10;
}
return rev;
}
int main(void)
{
double num = 1.234;
printf("역순: %lf\n", reverse(num));
return 0;
}
[3번 문제]
/*
야구선수의 타율과 같은 소수 이하의 숫자는 할푼리 단위로 읽습니다.
예를 들어 1 미만의 실수 0.435가 입력되었을 경우 "사할삼푼오리"로 출력하는 프로그램을 작성하시오
*/
#include <stdio.h>
void batting_average(double num)
{
int ten = 10;
char *unit[] = { "할", "푼", "리" };
for (int i = 0; i < 3; i++)
{
int number = (int)(num*ten) % 10;
if (number)
printf("%d%s", number, unit[i]);
ten *= 10;
}
}
int main(void)
{
double average;
printf("타율 입력: ");
scanf("%lf", &average);
batting_average(average);
printf("\n");
return 0;
}
[4번 문제]
/*
주판의 기본을 연습할 수 있도록 1부터 9까지 표시하는 과정을 애니메이션을 이용하여 단계별로 화면에 출력하는 프로그램을 작성하시오
*/
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
void display_abacus(int number);
void draw_rectangle(int c, int r);
void gotoxy(int x, int y);
int main(void)
{
int number = 0;
printf("0~9를 주판모양으로 출력\n\n");
printf("시작하려면 키보드를 누르세요\n");
getch();
system("cls");
gotoxy(1, 4);
draw_rectangle(1, 8);
display_abacus(number);
do
{
gotoxy(1, 14);
printf("현재값:%d\n", number);
gotoxy(1, 16);
display_abacus(number);
gotoxy(1, 24);
Sleep(1000);
number++;
} while (number < 10);
gotoxy(1, 17);
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
void draw_rectangle(int c, int r)
{
int i, j;
unsigned char a = 0xa6;
unsigned char b[7];
for (i = 1; i < 7; i++)
b[i] = 0xa0 + i;
printf("%c%c", a, b[3]);
for (i = 0; i < c; i++)
printf("%c%c", a, b[1]);
printf("%c%c", a, b[4]);
printf("\n");
for (i = 0; i < r; i++)
{
printf("%c%c", a, b[2]);
for (j = 0; j < c; j++)
printf(" ");
printf("%c%c", a, b[2]);
printf("\n");
}
printf("%c%c", a, b[6]);
for (i = 0; i < c; i++)
printf("%c%c", a, b[1]);
printf("%c%c", a, b[5]);
printf("\n");
}
void display_abacus(int number)
{
int i, m;
unsigned char a1 = 0xa6, a2 = 0xa1;
gotoxy(3, 5);
if (number / 5)
printf("%c%c", a1, 0xa2);
else
printf("%c%c", a2, 0xdf);
gotoxy(3, 6);
if (number < 5)
printf("%c%c", a1, 0xa2);
else
printf("%c%c", a2, 0xdf);
gotoxy(1, 7);
printf("%c%c", a1, 0xa7);
printf("%c%c", a1, a2);
printf("%c%c", a1, 0xa9);
m = number % 5;
for (i = 1; i <= 5; i++)
{
gotoxy(3, 7 + i);
if (m >= i)
printf("%c%c", a2, 0xdf);
else if (m == 0)
{
printf("%c%c", a1, 0xa2);
m = 5;
}
else
{
printf("%c%c", a1, 0xa2);
m = 5;
}
}
}
[5번 문제]
/*
다음의 표를 참고하여 두 자리 이상의 정수를 로마 숫자로 변환하는 프로그램을 작성한다
*/
#include <stdio.h>
void print_roman_number(int n);
int main(void)
{
int n;
do
{
system("cls");
printf("10진 정수를 로마 숫자로 변환\n\n");
printf("1이상 6999 미만의 정수만 입력\n");
printf("숫자를 입력하고 Enter\n");
printf("숫자입력>");
scanf("%d", &n);
if (n < 1 || n>=7000)
break;
printf("변환된 로마숫자: ");
print_roman_number(n);
printf("\n");
printf("아무키나 누르시오...");
getch();
} while (n);
return 0;
}
void print_roman_number(int n)
{
int i;
char rome[7] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' };
if (n <= 3)
for (i = 1; i <= n; i++)
printf("%c", rome[0]);
else if (n < 10)
{
if (n == 4)
printf("%c", rome[0]);
if (n <= 8)
{
printf("%c", rome[1]);
for (i = 5; i < n; i++)
printf("%c", rome[0]);
}
else
printf("%c%c", rome[0], rome[2]);
}
else if (n < 40)
{
if (n < 20)
{
printf("%c", rome[2]);
print_roman_number(n % 10);
}
else if (n < 30)
{
printf("%c%c", rome[2], rome[2]);
print_roman_number(n % 10);
}
else
{
printf("%c%c%c", rome[2], rome[2], rome[2]);
print_roman_number(n % 10);
}
}
else if (n < 50)
{
printf("%c%c", rome[2], rome[3]);
print_roman_number(n % 10);
}
else if (n < 90)
{
if (n < 60)
{
printf("%c", rome[3]);
print_roman_number(n % 10);
}
else if (n < 70)
{
printf("%c%c", rome[3], rome[2]);
print_roman_number(n % 10);
}
else if (n < 80)
{
printf("%c%c%c", rome[3], rome[2], rome[2]);
print_roman_number(n % 10);
}
else
{
printf("%c%c%c%c", rome[3], rome[2], rome[2], rome[2]);
print_roman_number(n % 10);
}
}
else if (n < 100)
{
printf("%c%c", rome[2], rome[4]);
print_roman_number(n % 10);
}
else if (n < 200)
{
printf("%c", rome[4]);
print_roman_number(n % 100);
}
else if (n < 300)
{
printf("%c%c", rome[4], rome[4]);
print_roman_number(n % 100);
}
else if (n < 400)
{
printf("%c%c%c", rome[4], rome[4], rome[4]);
print_roman_number(n % 100);
}
else if (n < 500)
{
printf("%c%c", rome[4], rome[5]);
print_roman_number(n % 100);
}
else if (n < 600)
{
printf("%c", rome[5]);
print_roman_number(n % 100);
}
else if (n < 700)
{
printf("%c%c", rome[5], rome[4]);
print_roman_number(n % 100);
}
else if (n < 800)
{
printf("%c%c%c", rome[5], rome[4], rome[4]);
print_roman_number(n % 100);
}
else if (n < 900)
{
printf("%c%c%c%c", rome[5], rome[4], rome[4], rome[4]);
print_roman_number(n % 100);
}
else if (n < 1000)
{
printf("%c%c", rome[5], rome[6]);
print_roman_number(n % 100);
}
else if (n < 2000)
{
printf("%c", rome[6]);
print_roman_number(n % 1000);
}
else if (n < 3000)
{
printf("%c%c", rome[6], rome[6]);
print_roman_number(n % 1000);
}
else if (n < 4000)
{
printf("%c%c%c", rome[6], rome[6], rome[6]);
print_roman_number(n % 1000);
}
else if (n < 5000)
{
printf("%c%c%c%c", rome[6], rome[6], rome[6], rome[6]);
print_roman_number(n % 1000);
}
else if (n < 6000)
{
printf("%c%c%c%c%c", rome[6], rome[6], rome[6], rome[6], rome[6]);
print_roman_number(n % 1000);
}
else if (n < 7000)
{
printf("%c%c%c%c%c%c", rome[6], rome[6], rome[6], rome[6], rome[6], rome[6]);
print_roman_number(n % 1000);
}
}
[6번 문제]
/*
로마 숫자를 입력하면 10진수로 변환하는 프로그램을 작성한다
*/
#include <stdio.h>
int number(char *roma);
int main(void)
{
char roma[100];
char *pointer; //로마숫자를 가리키는 포인터
int num; //십진수
printf("로마숫자: ");
scanf("%s", roma);
num = 0;
pointer = roma;
while (*pointer)
{
if (number(pointer + 1) == 0) //다음문자가 널인 경우 더하고
num += number(pointer);
else if (number(pointer) >= number(pointer + 1)) //지금 가리키고 있는 로마숫자가 다음 로마숫자보다 클경우
//ex) XI 6(5+1)
num += number(pointer);
else //지금 가리키고 있는 로마숫자가 다음 로마숫자보다 작을 경우
//ex) IX 4(5-1)
num -= number(pointer);
pointer++;
}
printf("로마숫자:%d\n", num);
return 0;
}
int number(char *roma)
{
switch (*roma)
{
case 'I':
return 1;
break;
case 'V':
return 5;
break;
case 'X':
return 10;
break;
case 'L':
return 50;
break;
case 'C':
return 100;
break;
case 'D':
return 500;
break;
case 'M':
return 1000;
break;
default:
return 0;
}
}
[7번 문제]
/*
한글과 영문이 포함된 텍스트 파일에 대해 영어 단어와 한글 단어가 각각 몇 개가 포함되어 있는지를
계산하는 프로그램을 작성한다
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int alpha = 0, hangul = 0;
char c1;
unsigned char uc1, uc2;
FILE *fp = fopen("C:\\5.4.7.txt", "r");
if (fp == NULL)
{
printf("파일 오픈 에러\n");
exit(1);
}
while ((c1 = fgetc(fp)) != EOF)
{
//printf("%c\n", c1);
if ((c1 >= 65 && c1<=90) || (c1>=97 && c1 <= 122))
alpha++;
else if (c1 != ' ') //그 외 띄어쓰기가 아니라면
{
uc1 = c1;
uc2 = fgetc(fp);
hangul++;
}
}
printf("영어:%d개, 한글:%d개\n", alpha, hangul);
return 0;
}
[8번 문제]
/*
한글과 영어문장이 저장된 파일의 내용을 역순으로 변환하는 프로그램을 작성한다
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct _TXT
{
int number;
char string[256];
}TXT;
int main(void)
{
FILE *fp;
int lines;
char s[256];
TXT *p;
//행의 수를 카운트하여 필요한 메모리 확보
if (!(fp = fopen("C:\\심리테스트질문.txt", "r")))
return 1;
for (lines = 0; !feof(fp);lines++)
fgets(s, 255, fp);
p = (TXT*)malloc(lines * sizeof(TXT));
if (!p)
return 2;
memset(p, 0, lines * sizeof(TXT)); //초기화
fseek(fp, SEEK_SET, 0);
for (int i = 0; i < lines; i++)
{
p[i].number = i;
fgets(p[i].string, 255, fp);
p[i].string[strlen(p[i].string) - 1] = '\0';
}
fclose(fp);
//거꾸로 표시
for (int i = lines - 1; i > 0; i--)
printf("%04d:%s\n", p[i].number + 1, p[i].string);
free(p);
return 0;
}
[9번 문제]
/*
50000원권 화폐는 2009년 6월에 발행되었습니다.
50000원권을 포함하여 처리하도록 함수 5.4.5를 수정하세요
*/
#include <stdio.h>
void serial_unit(long money)
{
long money_unit[] = { 50000, 10000, 5000, 1000, 500, 100, 50, 10, 5, 1 };
long i, num;
char *unit[] = { "오만원", "만원", "오천원", "천원", "오백원", "백원", "오십원", "십원", "오원", "일원" };
printf("\n화폐 단위\n");
for (i = 0; i <= 9; i++)
{
num = money / money_unit[i];
money = money - num*money_unit[i];
printf("%6s권\t:%3ld\n", unit[i], num);
}
printf("\n");
}
int main(void)
{
long money;
printf("금액 입력: ");
scanf("%ld", &money);
serial_unit(money);
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저, http://hyunssssss.tistory.com/29
*8번 문제는 http://hyunssssss.tistory.com/29를 그대로 작성했습니다. 파일 입출력 문제를 별로 안 풀다보니 미숙한 것 같습니다.
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 6.1장 연습문제 (0) | 2017.08.21 |
---|---|
명품 C언어 프로젝트 5.5장 연습문제 (0) | 2017.08.19 |
명품 C언어 프로젝트 5.3장 연습문제 (2) | 2017.08.05 |
명품 C언어 프로젝트 5.2장 연습문제 (0) | 2017.07.30 |
명품 C언어 프로젝트 5.1장 연습문제 (0) | 2017.07.26 |