Lesbarkeit
Aufgabe
Laut Scholastic liegt das Leseniveau von E.B. Whites Charlotte’s Web zwischen der zweiten und vierten Klasse, und Lois Lowrys The Giver zwischen der achten und zwölften Klasse. Aber was bedeutet es, wenn ein Buch ein bestimmtes Leseniveau hat?
Nun, in vielen Fällen wird vermutlich ein menschlicher Experte ein Buch lesen und eine Entscheidung darüber treffen, für welche Klassenstufe (d.h. Schuljahr) das Buch seiner Meinung nach am besten geeignet ist. Aber das könnte wahrscheinlich auch ein Algorithmus herausfinden!
In dieser Aufgabe wollen wir ein Programm schreiben, das die ungefähre Klassenstufe berechnet, die zum Verstehen eines Textes erforderlich ist. Ihr Programm sollte am Ende “Grade X” ausgeben, wobei “X” die berechnete Klassenstufe ist, gerundet auf die nächste ganze Zahl. Wenn die Klassenstufe 16 oder höher ist (gleich oder höher als die Lesestufe eines US-amerikanischen Oberstufenschülers), sollte Ihr Programm “Grade 16+” ausgeben, anstatt die genaue Indexzahl anzugeben. Wenn die Klassenstufe kleiner als 1 ist, sollte Ihr Programm “Before Grade 1” ausgeben.
Implementieren Sie das Programm in C in einer Datei namens readability.c
in einem Ordner namens readability
.
mkdir readability
mit dem Befehl pwd
, in welchem Verzeichnis Sie aktuell befinden. Wenn Sie diese Aufgabe im Anschluss an Scrabble bearbeiten, befinden Sie sich vermutlich noch in scrabble
. Um in der Verzeichnisstruktur wieder nach oben zu gelangen, können Sie cd ../
eingeben. Anschließend können Sie alle Schritte für die Erstellung von Ordner und Datei analog zu Scrabble wiederholen.
Demo
Hintergrund
Welche Eigenschaften sind charakteristisch für ein höheres Leseniveau? Nun, wahrscheinlich korrelieren längere Wörter mit einem höheren Leseniveau, ebenso wie längere Sätze.
Im Laufe der Jahre wurden verschiedene “Lesbarkeitstests” entwickelt, die Formeln zur Berechnung des Leseniveaus eines Textes festlegen. Einer dieser Lesbarkeitstests ist der Coleman-Liau-Index. Der Coleman-Liau-Index eines Textes wurde entwickelt, um die (US-amerikanische) Klassenstufe zu ermitteln, die zum Verständnis eines Textes erforderlich ist. Die Formel lautet:
index = 0.0588 * L - 0.296 * S - 15.8
L
ist hierbei die durchschnittliche Anzahl von Buchstaben pro 100 Wörter im Text und S
die durchschnittliche Anzahl von Sätzen pro 100 Wörter.
Hinweis: Für diese Aufgabe betrachten wir jede Folge von Zeichen, die durch ein Leerzeichen getrennt ist, als ein Wort (ein Wort mit Bindestrich wie “Schritt-für-Schritt-Anleitung” sollte also als ein Wort betrachtet werden, nicht als vier). Achten Sie außerdem darauf, das Endergebnis der Formel auf die nächste ganze Zahl zu runden.
Hilfestellung
Klicken Sie auf die folgenden Tipps, um einige Ratschläge zu erhalten. Versuchen Sie aber zunächst, selbst so weit wie möglich zu kommen.
Beginnen Sie mit Code, der kompilierbar ist
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
}
Beachten Sie, dass in diesem Grundgerüst mehrere Header-Dateien eingebunden sind, die Ihnen Zugriff auf Funktionen geben, die Ihnen bei der Lösung dieses Problems helfen könnten.
Versuchen Sie das Problem in Pseudocode zu beschreiben
Wenn Sie unsicher sind, wie Sie das eigentliche Problem lösen können, unterteilen Sie es in kleinere Probleme, die Sie wahrscheinlich einfacher lösen können. Das Problem dieser Aufgabe besteht eigentlich nur aus einer Handvoll Probleme:
- Die Aufforderung an den Benutzer, einen Text einzugeben.
- Das Zählen der Buchstaben, Wörter und Sätze des Textes.
- Das Berechnen des Coleman-Liau-Index.
- Das Ausgeben der Klassenstufe.
Fügen Sie nun diese Teilprobleme in Form von Pseudocode als Kommentare ein, um Sie dann nacheinander bearbeiten zu können:
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
// Prompt the user for some text
// Count the number of letters, words, and sentences in the text
// Compute the Coleman-Liau index
// Print the grade level
}
Wandeln Sie den Pseudocode in Code um
Überlegen Sie zunächst, wie Sie den Benutzer zur Eingabe eines Textes auffordern können. Erinnern Sie sich, dass get_string
, eine Funktion der CS50-Bibliothek, den Benutzer nach einer Zeichenkette fragt.
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
// Prompt the user for some text
string text = get_string("Text: ");
// Count the number of letters, words, and sentences in the text
// Compute the Coleman-Liau index
// Print the grade level
}
Nachdem Sie die Eingabe des Benutzers erhalten haben, können Sie damit beginnen, diese Eingabe zu analysieren. Versuchen Sie zunächst, die Anzahl der Buchstaben im Text zu zählen. Als Buchstaben gelten Groß- und Kleinbuchstaben des Alphabets, nicht aber Satzzeichen, Ziffern oder andere Symbole.
Eine Möglichkeit, an dieses Problem heranzugehen, besteht darin, eine Funktion namens count_letters
zu erstellen. Diese nimmt eine Zeichenkette als Eingabe entgegen - innerhalb der Funktion kann auf diese Zeichenkette mit text
zugegriffen werden - und gibt dann die Anzahl der Buchstaben in dieser Zeichenkette als int
zurück.
int count_letters(string text)
{
// Return the number of letters in text
}
Den Code für das Zählen der Buchstaben im Text müssen Sie jedoch selbst schreiben. Aber vielleicht hat jemand bereits eine Funktion geschrieben, um festzustellen, ob ein Zeichen alphabetisch ist. Dies ist eine gute Gelegenheit, das CS50-Handbuch zu benutzen, eine Sammlung von Erklärungen zu allgemeinen Funktionen in der C-Standardbibliothek.
Sie können dann count_letters
wie folgt in den bestehenden Code integrieren:
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int count_letters(string text);
int main(void)
{
// Prompt the user for some text
string text = get_string("Text: ");
// Count the number of letters, words, and sentences in the text
int letters = count_letters(text);
// Compute the Coleman-Liau index
// Print the grade level
}
int count_letters(string text)
{
// Return the number of letters in text
}
Schreiben Sie als nächstes eine Funktion zum Zählen von Wörtern.
int count_words(string text)
{
// Return the number of words in text
}
Für die Zwecke dieser Aufgabe betrachten wir jede Folge von Zeichen, die durch ein Leerzeichen getrennt sind, als ein Wort (ein Wort mit Bindestrich wie “Schritt-für-Schritt-Anleitung” sollte also als ein Wort betrachtet werden, nicht als vier). Sie können davon ausgehen, dass ein Text:
- mindestens ein Wort enthält;
- nicht mit einem Leerzeichen beginnt oder endet; und
- nicht mehrere Leerzeichen in einer Reihe enthalten darf.
Unter diesen Annahmen können Sie vielleicht eine Beziehung zwischen der Anzahl der Wörter und der Anzahl der Leerzeichen finden. Sie können natürlich auch einen Lösungsweg versuchen, der auch bei mehreren Leerzeichen zwischen den Wörtern oder gar keinen Wörtern funktioniert!
Sie können count_words
wie folgt in Ihr Programm integrieren:
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int count_letters(string text);
int count_words(string text);
int main(void)
{
// Prompt the user for some text
string text = get_string("Text: ");
// Count the number of letters, words, and sentences in the text
int letters = count_letters(text);
int words = count_words(text);
// Compute the Coleman-Liau index
// Print the grade level
}
int count_letters(string text)
{
// Return the number of letters in text
}
int count_words(string text)
{
// Return the number of words in text
}
Fehlt nur noch eine Funktion zum Zählen von Sätzen. Sie können jede Folge von Zeichen, die mit einem .
oder einem !
oder einem ?
endet, als Satz betrachten.
int count_sentences(string text)
{
// Return the number of sentences in text
}
Sie können count_sentences
wie folgt in Ihr Programm integrieren:
#include <ctype.h>
#include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int count_letters(string text);
int count_words(string text);
int count_sentences(string text);
int main(void)
{
// Prompt the user for some text
string text = get_string("Text: ");
// Count the number of letters, words, and sentences in the text
int letters = count_letters(text);
int words = count_words(text);
int sentences = count_sentences(text);
// Compute the Coleman-Liau index
// Print the grade level
}
int count_letters(string text)
{
// Return the number of letters in text
}
int count_words(string text)
{
// Return the number of words in text
}
int count_sentences(string text)
{
// Return the number of sentences in text
}
Berechnen Sie abschließend den Coleman-Liau-Index und geben Sie die resultierende Klassenstufe aus.
- Der Coleman-Liau-Index wird wie folgt berechnet:
index = 0.0588 * L - 0.296 * S - 15.8
. L
ist die durchschnittliche Anzahl der Buchstaben pro 100 Wörter im Text, d. h. die Anzahl der Buchstaben geteilt durch die Anzahl der Wörter, und dann multipliziert mit 100.S
ist die durchschnittliche Anzahl der Sätze pro 100 Wörter im Text, d. h. die Anzahl der Sätze geteilt durch die Anzahl der Wörter, und dann multipliziert mit 100.- Sie werden das Ergebnis auf die nächste ganze Zahl runden wollen. Dazu kann die Funktion
round
verwendet werden, die laut Handbuch inmath.h
deklariert ist. - Erinnern Sie sich daran, dass bei der Division von Werten des Typs
int
in C das Ergebnis ebenfalls einint
ist, wobei jeder Rest (d.h. die Ziffern nach dem Dezimalpunkt) verworfen wird. Mit anderen Worten, das Ergebnis wird “abgeschnitten” (z.B.3.7
würde eine3
ergeben, d.h. es wird nicht gerundet). Sie sollten einen oder mehrere Werte infloat
umwandeln, bevor Sie die Division bei der Berechnung vonL
undS
durchführen!
Wenn die sich daraus ergebende Indexzahl 16 oder höher ist (d.h. sie entspricht oder liegt über der Lesestufe eines US-amerikanischen Oberstufenschülers), sollte Ihr Programm “Grade 16+” ausgeben, statt einer genauen Indexzahl. Wenn die Indexzahl kleiner als 1 ist, sollte Ihr Programm “Before Grade 1” ausgeben.
Testen
Führen Sie Ihr Programm mit den folgenden Texten aus, um zu testen, ob die angegebenen Klassen angezeigt werden. Achten Sie darauf, dass Sie nur den Text kopieren, ohne zusätzliche Leerzeichen.
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+)
Korrektheit
Führen Sie in Ihrem Terminal den folgenden Befehl aus, um die Korrektheit Ihrer Arbeit zu überprüfen:
check50 -l cs50/problems/2024/x/readability
Style
Führen Sie den folgenden Befehl aus, um den Stil Ihres Codes mit style50
zu analysieren:
style50 readability.c