https://cs50.harvard.edu/x/2023/psets/2/readability/
Coleman-Liau index
index = 0.0588 * L - 0.296 * S - 15.8
L은 100단어당 들어간 알파벳의 숫자
S는 100단어당 들어간 문장의 숫자.
이 값을 이용하여 입력된 문장의 수준을 판별하는 프로그램 작성.
꽤나 복잡해서 의사코드 작성...을 한다고 했는데 그냥 대충쓴 코드처럼 썼다..
이거 붙여넣고 돌렸다가 빼먹은 세미콜론이랑 타입, 괄호를 코드에 추가했다.
ctype.h
math.h 호출할것
string paragraph = get_string("Text :");
par_length = strlen(paragraph)
int space_count = 0;
for (i = 0; i < par_length; i++)
{
if( paragraph[i] = 32 )
{
space_count++;
}
}
int word_count = space_count + 1;
word count per 100
letter_count = 0;
for (i = 0; i < par_length; i++)
{
if (isalpha(paragraph[i])
{
count++;
}
};
float word_per_100 = letter_count / word_count * 100
int sentence_count = 0;
for (i = 0; i < par_length; i++)
{
if (paragraph[i] = 46 || paragraph[i] = 63 || paragraph[i] = 33)
{
sentence_count++;
}
};
float sentence_per_100 = sentence_count / word_count * 100
float index = 0.0588 * word_per_100 - 0.296 * sentence_per_100 - 15.8
int grade = round(index);
printf("Grade %i", grade);
하단은 작성한 코드.
#include <cs50.h>
#include <stdio.h>
#include <math.h> //round
#include <ctype.h> //isalpha
#include <string.h> //strlen
int main(void)
{
string paragraph = get_string("Text : ");
int par_length = strlen(paragraph);
int space_count = 0;
for (int i = 0; i < par_length; i++)
{
// 32는 띄어쓰기, ==두개임에 주의!
if( paragraph[i] == 32 )
{
space_count++;
};
};
//딘어수는 띄어쓰기수 +1
float word_count = space_count + 1;
//총 글자수
//주의. 여기서 float이 아니라 int로 선언하면 하단에서 계산시 소수점값이 버려짐.
float letter_count = 0;
for (int i = 0; i < par_length; i++)
{
if (isalpha(paragraph[i]))
{
letter_count++;
};
};
//100단어당 글자수
float letter_per_100 = letter_count / word_count * 100;
//문장수
//주의. 여기서 float이 아니라 int로 선언하면 하단에서 계산시 소수점값이 버려짐.
float sentence_count = 0;
for (int i = 0; i < par_length; i++)
{
// 46 . 63 ? 33 ! ==두개임에 주의!
if (paragraph[i] == 46 || paragraph[i] == 63 || paragraph[i] == 33)
{
sentence_count++;
};
};
//100단어당 문장수
//float값으로 결과를 받기 위해서는 정수(int)끼리 나눗셈을 하면 안됨!!
float sentence_per_100 = sentence_count / word_count * 100;
//공식에 대입
float index = 0.0588 * letter_per_100 - 0.296 * sentence_per_100 - 15.8;
//0.9처럼 0 이하이면 모두 before grade1 이므로 반올림 전에 별도로 미리 내려버림
if (index < 0)
{
index = 0;
}
//반올림
int grade = round(index);
//출력 ==두개임에 주의
if (grade == 0)
{
printf("Before Grade 1\n");
}
else if (grade >= 16)
{
printf("Grade 16+\n");
}
else
{
printf("Grade %i\n", grade);
};
}
중간에 단순 계산에서 4/8*100이 계속 값이 0이 나와서 한참을 돌려봤는데,
결국 문제는 정수끼리 계산을 해서 중간에 값이 0.5가 아닌 0이 되어버려서 0이 나온것이다.
int(정수)끼리 계산을 하면 결과도 int만 나오므로 정말 주의해야 한다.
해당 변수를 float으로 수정하고 오류가 해결되었다.