CS50-MCZ

Uma introdução aos empreendimentos intelectuais da Ciência da Computação e da arte da programação.


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        

Começando

Abra o VS Code.

Comece clicando dentro da janela do seu terminal e execute cd sozinho. Você deve encontrar que seu "prompt" se parece com o abaixo.

$

Clique dentro da janela do terminal e execute

wget https://cdn.cs50.net/2022/fall/psets/2/readability.zip

seguido de Enter para baixar um arquivo ZIP chamado readability.zip em seu espaço de código. Tenha cuidado para não ignorar o espaço entre o wget e a URL a seguir, ou qualquer outro caractere!

Agora execute

unzip readability.zip

para criar uma pasta chamada readability. Você não precisa mais do arquivo ZIP, então pode executar

rm readability.zip

e responda com "y" seguido por Enter no prompt para remover o arquivo ZIP que você baixou.

Agora digite

cd readability

seguido de Enter para mover-se para o diretório (ou seja, abrir) esse diretório. Seu prompt agora deve se parecer com o abaixo.

readability/ $

Se tudo ocorreu bem, você deve executar

ls

e ver um arquivo chamado readability.c. Executar code readability.c deve abrir o arquivo onde você digitará o seu código para este problema. Se não, refaça seus passos e veja se consegue determinar onde errou!

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        
Assista a uma gravação

Especificação

Projete e implemente um programa, readability, que calcule o índice Coleman-Liau de um texto.

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:

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 biblioteca math.h, conforme o manual.cs50.io!
  • Lembre-se que, ao dividir valores do tipo int em C, o resultado também será do tipo int, 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 em float antes de realizar a divisão ao calcular L e S!

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.

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/2023/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/2023/x/readability