Readability
Para este problema, você irá implementar um programa que calcula o nível aproximado de série necessário para compreender um texto, como mostrado abaixo.
$ ./readability
Text: Congratulations! Today is your day. You're off to Great Places! You're off and away!
Grade 3
Problema a Resolver
Em um arquivo chamado readability.c
em uma pasta chamada
readability
, você implementará um programa que calcula a
nota aproximada necessária para compreender algum texto. Seu programa deve imprimir como saída “Grade X”, onde “X”
é a série calculada, arredondada para o número inteiro mais próximo. Se a nota for 16 ou superior (equivalente ou
superior a um nível de leitura de graduação sênior), seu programa deverá gerar “Grade 16+” em vez de fornecer o
número de índice exato. Se o nível da série for inferior a 1, seu programa deverá gerar “Before Grade 1”.
Começando
Passo a Passo
Eis aqui um passo a passo para a resolução do problema.
Contexto
De acordo com a Scholastic, o livro A Teia de Charlotte, de E.B. White, é adequado para leitores entre o segundo e o quarto anos de escolaridade, enquanto O Doador de Memórias, de Lois Lowry, é adequado para leitores entre o oitavo e o décimo segundo anos. Mas o que significa, na prática, um livro estar em um determinado nível de leitura?
Bem, em muitos casos, um especialista em literatura pode ler um livro e decidir qual é o ano escolar mais apropriado para a sua leitura. Mas um algoritmo também pode ser capaz de fazer essa análise!
Então, quais características costumam estar presentes em livros de níveis de leitura mais elevados? Palavras mais longas geralmente correlacionam-se com níveis de leitura mais elevados. Da mesma forma, frases mais longas também costumam correlacionar-se com níveis de leitura mais elevados.
Ao longo dos anos, vários "testes de legibilidade" foram desenvolvidos para definir fórmulas para calcular o nível de leitura de um texto. Um desses testes de legibilidade é o índice de Coleman-Liau. O índice de Coleman-Liau de um texto é projetado para indicar qual ano escolar (nos Estados Unidos) é necessário para compreender o texto. A fórmula é:
índice = 0.0588 * L - 0.296 * S - 15.8
onde L
é a média de letras por 100 palavras no texto e
S
é a média de frases por 100 palavras no texto.
Vamos escrever um programa chamado readability
que
recebe um texto e determina seu nível de leitura. Por exemplo, se o usuário digitar uma linha de texto do Dr.
Seuss, o programa deve funcionar da seguinte forma:
$ ./readability
Text: Congratulations! Today is your day. You're off to Great Places! You're off and away!
Grade 3
O texto inserido pelo usuário tem 65 letras, 4 frases e 14 palavras. 65 letras por 14 palavras é uma média de cerca de 464,29 letras por 100 palavras (porque 65/14 * 100 = 464,29). E 4 sentenças por 14 palavras é uma média de cerca de 28,57 sentenças por 100 palavras (porque 4/14 * 100 = 28,57). Conectado à fórmula de Coleman-Liau e arredondado para o inteiro mais próximo, obtemos uma resposta de 3 (porque 0,0588 * 464,29 - 0,296 * 28,57 - 15,8 = 3): portanto, esta passagem está no nível de leitura da terceira série.
Vamos tentar outro:
$ ./readability
Text: Harry Potter was a highly unusual boy in many ways. For one thing, he hated the summer holidays more than any other time of year. For another, he really wanted to do his homework, but was forced to do it in secret, in the dead of the night. And he also happened to be a wizard.
Grade 5
Este texto possui 214 letras, 4 frases e 56 palavras. Isso resulta em cerca de 382,14 letras por 100 palavras e 7,14 frases por 100 palavras. Aplicando a fórmula Coleman-Liau, obtemos um nível de leitura de quinta série.
À medida que o número médio de letras e palavras por frase aumenta, o índice Coleman-Liau atribui um nível de leitura mais alto ao texto. Se você pegasse este parágrafo, por exemplo, que possui palavras e frases mais longas do que os dois exemplos anteriores, a fórmula daria ao texto um nível de leitura de décima segunda série.
$ ./readability
Text: As the average number of letters and words per sentence increases, the Coleman-Liau index gives the text a higher reading level. If you were to take this paragraph, for instance, which has longer words and sentences than either of the prior two examples, the formula would give the text an twelfth-grade reading level.
Grade 12
Demo
Especificação
Projete e implemente um programa, readability
, que
calcule o índice Coleman-Liau de um texto.
- Implemente seu programa em um arquivo chamado
readability.c
em um diretório chamadoreadability
. - Seu programa deve solicitar ao usuário uma
string
de texto usandoget_string
. - Seu programa deve contar o número de letras, palavras e frases no texto. Você pode assumir que
uma letra é qualquer caractere minúsculo de
a
az
ou qualquer caractere maiúsculo deA
aZ
, qualquer sequência de caracteres separados por espaços deve ser contada como uma palavra e que qualquer ocorrência de um ponto, ponto de exclamação ou ponto de interrogação indica o final de uma frase. - Seu programa deve imprimir como saída
"Grade X"
, ondeX
é o nível de série calculado pela fórmula Coleman-Liau, arredondado para o número inteiro mais próximo. - Se o número resultante do índice for 16 ou superior (equivalente ou superior a um nível de
leitura de graduação sênior), seu programa deve imprimir
"Grade 16+"
em vez de fornecer o número exato do índice. Se o número do índice for menor que 1, seu programa deve imprimir"Before Grade 1"
.
Obtendo entrada do usuário
Vamos escrever primeiro algum código em C que simplesmente obtém alguma entrada de texto do usuário e a imprime
de volta. Especificamente, implemente na função main
em
readability.c
que solicita ao usuário com "Text: "
usando get_string
e, em seguida, imprime o mesmo texto usando printf
. E lembre-se, ao trabalhar neste programa, que se
você usar qualquer função de biblioteca, certifique-se de #include
quaisquer arquivos de cabeçalho correspondentes.
O programa deve se comportar conforme abaixo.
$ ./readability
Text: In my younger and more vulnerable years my father gave me some advice that I've been turning over in my mind ever since.
In my younger and more vulnerable years my father gave me some advice that I've been turning over in my mind ever since.
Letras
Agora que você coletou a entrada do usuário, vamos começar a analisar essa entrada contando primeiro o número de letras no texto. Considere letras como caracteres alfabéticos maiúsculos ou minúsculos, não pontuação, dígitos ou outros símbolos.
Adicione ao arquivo readability.c
, abaixo do main
, uma função chamada count_letters
que recebe um argumento, uma string de texto,
e que retorna um int
, o número de letras nesse texto.
Certifique-se de adicionar o protótipo da função também no topo do seu arquivo, para que o main
saiba como chamá-lo. É provável que o protótipo se
pareça com o abaixo:
int count_letters(string text);
Então chame essa função em main
, para que, em vez de
imprimir o próprio texto, o programa agora imprima o número de letras no texto.
O programa agora deve se comportar conforme abaixo.
$ ./readability
Text: Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, "and what is the use of a book," thought Alice "without pictures or conversation?"
235 letters
Dica
Declarada em ctype.h
há uma função que pode ser útil,
de acordo com o manual.cs50.io. Se você usá-la,
certifique-se de incluir o
arquivo de cabeçalho no início do seu código!
Palavras
O índice Coleman-Liau se preocupa não apenas com o número de letras, mas também com o número de palavras em uma
frase. Para fins deste problema, consideraremos qualquer sequência de caracteres separados por um espaço como uma
palavra (então uma palavra com hífen como "sister-in-law"
deve ser considerada como uma única palavra, não três).
Adicione em readability.c
, abaixo de main
, uma função chamada count_words
que recebe um argumento, uma string
de texto, e retorna um int
, o número de palavras nesse texto. Certifique-se de
adicionar o protótipo da função também no início do seu arquivo, para que main
saiba como chamá-la. (Deixamos o protótipo para você!)
Em seguida, chame essa função em main
, para que seu
programa também imprima o número de palavras no texto.
Você pode assumir que uma frase:
- irá conter pelo menos uma palavra;
- não começará ou terminará com um espaço; e
- não terá múltiplos espaços seguidos.
Você, é claro, pode tentar uma solução que tolerará múltiplos espaços entre as palavras ou, de fato, nenhuma palavra!
O programa deve se comportar conforme abaixo.
$ ./readability
Text: It was a bright cold day in April, and the clocks were striking thirteen. Winston Smith, his chin nuzzled into his breast in an effort to escape the vile wind, slipped quickly through the glass doors of Victory Mansions, though not quickly enough to prevent a swirl of gritty dust from entering along with him.
250 letters
55 words
Frases
A última informação que a fórmula Coleman-Liau se preocupa, além do número de letras e palavras, é o número de frases. Determinar o número de frases pode ser surpreendentemente complicado. Você pode imaginar primeiro que uma frase é apenas qualquer sequência de caracteres que termina com um ponto final, mas é claro que as frases também podem terminar com um ponto de exclamação ou uma interrogação. Mas nem todos os pontos finais necessariamente significam que a frase acabou. Por exemplo, considere a frase abaixo.
O Sr. e a Sra. Dursley, do número quatro da Rua dos Alfeneiros, estavam orgulhosos em dizer que eram perfeitamente normais, muito obrigado.
Esta é apenas uma única frase, mas há três pontos finais! Para este problema, pedimos que você ignore essa
sutileza: você deve considerar qualquer sequência de caracteres que termina com um .
ou um !
ou um ?
como uma frase (então, para a "frase" acima, você deve
contá-la como três frases). Na prática, a detecção de fronteiras de frases precisa ser um pouco mais inteligente
para lidar com esses casos, mas não vamos nos preocupar com isso por agora.
Adicione ao readability.c
, abaixo do main
, uma função chamada count_sentences
que recebe um argumento, uma string
de texto, e que retorna um int
, o número de frases nesse texto. Certifique-se de
adicionar o protótipo da função, também, no topo do seu arquivo, para que o main
saiba como chamá-la. (Deixamos novamente o protótipo
para você!)
Em seguida, chame essa função no main
para que o seu
programa também imprima o número de frases no texto.
O programa agora deve se comportar conforme abaixo.
$ ./readability
Text: When he was nearly thirteen, my brother Jem got his arm badly broken at the elbow. When it healed, and Jem's fears of never being able to play football were assuaged, he was seldom self-conscious about his injury. His left arm was somewhat shorter than his right; when he stood or walked, the back of his hand was at right angles to his body, his thumb parallel to his thigh.
295 letters
70 words
3 sentences
Colocando tudo junto
Agora é hora de juntar todas as peças! Lembre-se de que o índice Coleman-Liau é calculado usando a fórmula:
index = 0.0588 * L - 0.296 * S - 15.8
Colocando tudo junto
Onde L
é o número médio de letras por 100 palavras no
texto e S
é o número médio de frases por 100 palavras no
texto.
Modifique a função main
em readability.c
para que, em vez de exibir o número de letras,
palavras e frases, exiba apenas o nível de graduação conforme definido pelo índice Coleman-Liau (por exemplo,
"Grade 2"
ou "Grade 8"
ou similar). Certifique-se de arredondar o número
de índice resultante para o inteiro mais próximo usando a função round
da biblioteca math.h
.
Dicas
- Lembre-se que a função
round
é declarada na bibliotecamath.h
, conforme o manual.cs50.io! - Lembre-se que, ao dividir valores do tipo
int
em C, o resultado também será do tipoint
, com qualquer resto (ou seja, dígitos após o ponto decimal) descartado. Em outras palavras, o resultado será "truncado". Você pode querer converter um ou mais valores emfloat
antes de realizar a divisão ao calcularL
eS
!
Se o número de índice resultante for 16 ou superior (equivalente ou superior ao nível de leitura de graduação em
nível universitário), o programa deve exibir "Grade 16+"
em vez de exibir um número de índice exato. Se o número de índice for inferior a 1, o programa deve exibir "Before Grade 1"
.
Como Testar Seu Código
Tente executar seu programa nos seguintes textos para garantir que você visualize o nível de graduação especificado. Certifique-se de copiar apenas o texto, sem espaços extras.
One fish. Two fish. Red fish. Blue fish.
(Before Grade 1)Would you like them here or there? I would not like them here or there. I would not like them anywhere.
(Grade 2)Congratulations! Today is your day. You're off to Great Places! You're off and away!
(Grade 3)Harry Potter was a highly unusual boy in many ways. For one thing, he hated the summer holidays more than any other time of year. For another, he really wanted to do his homework, but was forced to do it in secret, in the dead of the night. And he also happened to be a wizard.
(Grade 5)In my younger and more vulnerable years my father gave me some advice that I've been turning over in my mind ever since.
(Grade 7)Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, "and what is the use of a book," thought Alice "without pictures or conversation?"
(Grade 8)When he was nearly thirteen, my brother Jem got his arm badly broken at the elbow. When it healed, and Jem's fears of never being able to play football were assuaged, he was seldom self-conscious about his injury. His left arm was somewhat shorter than his right; when he stood or walked, the back of his hand was at right angles to his body, his thumb parallel to his thigh.
(Grade 8)There are more things in Heaven and Earth, Horatio, than are dreamt of in your philosophy.
(Grade 9)It was a bright cold day in April, and the clocks were striking thirteen. Winston Smith, his chin nuzzled into his breast in an effort to escape the vile wind, slipped quickly through the glass doors of Victory Mansions, though not quickly enough to prevent a swirl of gritty dust from entering along with him.
(Grade 10)A large class of computational problems involve the determination of properties of graphs, digraphs, integers, arrays of integers, finite families of finite sets, boolean formulas and elements of other countable domains.
(Grade 16+)
Execute o comando abaixo para avaliar a correção do seu código usando check50
. Mas lembre-se de compilar e testá-lo por conta
própria também!
check50 cs50/problems/2024/x/readability
Execute o comando abaixo para avaliar o estilo do seu código usando o style50
.
style50 readability.c
Como Enviar
No seu terminal, execute abaixo para enviar seu trabalho.
submit50 cs50/problems/2024/x/readability