부스트코스 - 모두를 위한 컴퓨터 과학 (CS50 2019) - 3주차 Mission
업데이트:
✔︎ 문제 1. 학점을 계산해보자!
1. 미션 제목
해당 코스에서 문제를 챌린저들을 위한것이기때문에 공개하면 안된다고 공지되어있어서 문제 내용은 제거합니다.
#include <stdio.h>
#include <string.h>
#include <ctype.h> // isdigit 함수사용
#include <stdlib.h> // atoi 함수 사용
const int NUMBER_OF_GRADES = 9;
// printGradeTable() 함수를 사용하기 위하여 타입을 char 형태로 통일하기 위해 점수도 스트링 타입으로 입력
const char *GRADE_POINTS[NUMBER_OF_GRADES] = {"95", "90", "85", "80", "75", "70", "65", "60", "0"};
const char *GRADES[NUMBER_OF_GRADES] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"};
void printGradeTable(char *label, const char *target[]);
int checkNum(char *str);
int resultGradePoint(int numGrade, int length);
int main(void) {
char strGrade[4];
printf("학점프로그램\n");
printf("종료를 원하면 \"999\" 를 입력\n");
printf("[학점 테이블]\n");
printGradeTable("점수", GRADE_POINTS);
printf("\n");
printGradeTable("학점", GRADES);
printf("\n");
int arrNum = sizeof(GRADE_POINTS) / sizeof(GRADE_POINTS[0]);
while(1) {
int numGrade;
printf("성적을 입력하세요 (0 ~ 100) : ");
scanf("%s", strGrade);
if (checkNum(strGrade) == -1) {
printf("숫자가 아닙니다 프로그램을 종료합니다.\n");
break;
}
numGrade = atoi(strGrade); // 문자 정수를 숫자로 변환
if (numGrade == 999) {
printf("학점 프로그램을 종료합니다.\n");
break;
}
if(numGrade > 100 || numGrade < 0) {
printf("** %d 성적을 올바르게 입력하세요! (0 ~ 100)\n", numGrade);
continue;
}
resultGradePoint(numGrade, arrNum);
}
}
void printGradeTable(char *label, const char *target[]) {
// 학점 테이블 출력 함수
printf("%s : ", label);
for (int i = 0; i < NUMBER_OF_GRADES; i++) {
printf("%s\t", target[i]);
}
}
int checkNum(char *str) {
int const length = strlen(str);
int result;
// 문자 정수를 문자배열로 취급하여 숫자인지 아닌지 하나씩 체크 하나라도 숫자가 아니면 -1
// ex) str = 20 => ["2", "0"] => isdigit() 함수로 문자가 숫자 문자인지 체크(연속된 문자가 아닌 한글자씩만 체크가능)
for (int i = 0; i < length; i++) {
if (isdigit(str[i]) == 0) {
// 숫자가 아님
result = -1;
break;
}
result = 0;
}
return result;
}
int resultGradePoint(int numGrade, int length) {
for (int j = 0; j < length; j++) {
if (numGrade == 0) {
printf("학점은 F 입니다.\n");
break;
}
if (numGrade >= 95) {
printf("학점은 A+ 입니다.\n");
break;
}
if (atoi(GRADE_POINTS[j]) >= numGrade && atoi(GRADE_POINTS[j + 1]) <= numGrade) {
printf("학점은 %s 입니다.\n", GRADES[j + 1]);
break;
}
}
return -1;
}
✔︎ 문제 2. 누가 빠졌는지 찾아보자!
해당 코스에서 문제를 챌린저들을 위한것이기때문에 공개하면 안된다고 공지되어있어서 문제 내용은 제거합니다.
#include <stdio.h>
#define SIZE 500000
int main(int arge, char*argv[]) {
int n;
scanf("%d", &n);
// 1부터 N의 숫자중 K가 빠진 배열
int partArr[SIZE];
int lengthOfPartArr = n-1;
for(int i=0; i < lengthOfPartArr; i++){
scanf("%d", &partArr[i]);
}
// TODO: n과 partArr를 이용하여, K를 구하라
return 0;
}
풀이
#include <stdio.h>
#define SIZE 500000
int main(int arge, char*argv[]) {
int n;
int nSum;
int sum;
// scanf 는 \n 즉 엔터가 나오기 전까지있는 숫자와 문자를 출력한다 해당 파일들은 각각 10, 100... 등의 숫자가 있고 바로 엔터가 있기때문에 n에는 자동으로 각 파일의 엔터전에있는 첫번째 숫자값이 자동으로 들어온다.
scanf("%d", &n);
// 1부터 N의 숫자중 K가 빠진 배열
int partArr[SIZE]; // SIZE 만큼의 메모리 영역을 할당
int lengthOfPartArr = n-1; // 받아온 각 첫번째 숫자보다 -1 된 숫자를 저장
// 1 부터 N 까지의 정상적인 숫자의 합
for (int j = 0; j <= n; j++) {
nSum += j;
}
// 1 부터 N-1 까지의 숫자의 합
for(int i=0; i < lengthOfPartArr; i++){
// scanf 는 엔터를 만나기전까지의 데이터를 리턴하지만 띄어쓰기가 있어도 똑같이 동작함
// 띄어쓰기를 만날때마다 partArr[i] 배열에 값을 하나씩 저장
scanf("%d", &partArr[i]);
sum += partArr[i];
}
// 1 부터 N 까지의 숫자를 더한 총 값에서 N-1 의 숫자를 더한값을 빼면 빠진값을 구할 수 있음
printf("K = %d", nSum - sum);
// TODO: n과 partArr를 이용하여, K를 구하라
return 0;
}
결과
✔︎ 문제 3. Queue를 만들어보자!
해당 코스에서 문제를 챌린저들을 위한것이기때문에 공개하면 안된다고 공지되어있어서 문제 내용은 제거합니다.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 10
#define TRUE 1
#define FALSE 0
int front = 0;
int rear = 0;
int queueArr[MAX];
int loopEnd = FALSE;
void enqueue(void);
void dequeue(void);
void quit(void);
void display(void);
int get_int(char *text);
int main(void) {
while(!loopEnd) {
int option = get_int("옵션번호를 입력하세요(1. enqueue, 2. dequeue, 3. display, 4. quit) : ");
// getchar 는 stdin에있는 문자를 읽어들이는데 그러면 scanf 입력버퍼에 남아있던 \n 을 가져옴 != \n 처리를 한 이유는 그냥 getchar() 함수를 사용하면 띄어쓰기 이후에 남아있던 다른 문자까지 모두 가져와 입력버퍼에서 제거해버리기 때문에 필요한 비교구문
while (getchar() != '\n');
switch(option) {
case 1:
enqueue();
break;
case 2:
dequeue();
break;
case 3:
display();
break;
case 4:
quit();
break;
default:
break;
}
}
}
void enqueue(void) {
if ((rear + 1) % MAX == front) {
printf("Queue가 꽉 찼습니다.\n");
} else {
int input_value = get_int("값을 입력해주세요 : ");
rear = (rear + 1) % MAX;
queueArr[rear] = input_value;
}
}
void dequeue(void) {
if (front == rear) {
printf("Queue 가 비었습니다.\n");
} else {
front = (front + 1) % MAX;
printf("%i\n", queueArr[front]);
}
}
void display(void) {
printf("==============================================================\n");
printf("Queue에 남은값 : ");
for(int i = front + 1; i < rear + 1; i++) {
printf("%i ", queueArr[i]);
}
printf("\n");
printf("==============================================================\n");
}
void quit(void) {
printf("************************************************************\n");
printf("Queue 프로그램 종료\n");
printf("************************************************************\n");
loopEnd = TRUE;
}
int get_int(char *text) {
int getInt;
printf("%s", text);
scanf("%i", &getInt);
return getInt;
}
댓글남기기