home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Jason Aller Floppy Collection
/
180.img
/
TURBOD.ZIP
/
TCDEMOB.C
< prev
next >
Wrap
Text File
|
1989-05-02
|
6KB
|
155 lines
/* file <tcdemob.c>
*
* Broken demo program to show debugging techniques
* Reads words from standard input, analyzes letter and word frequency
*/
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
#define BUFSIZE 128 /* length of line buffer */
#define LETTERSINALPHABET 26 /* number of letters in the alphabet */
#define MAXWORDLENGTH 10 /* maximum word length allowed */
static struct linfo {
unsigned int count; /* number of occurrences of this letter */
unsigned int firstletter; /* number of times as first letter of a word */
} letterinfo[26]; /* info for each letter */;
static unsigned int wordcounts[MAXWORDLENGTH]; /* count of words of each length */
static char buffer[BUFSIZE]; /* line buffer */
static int makeintowords(char *bufp);
static long analyzewords(char *bufp);
static void printstatistics(int nlines, int nwords, long charcount);
static int readaline(void);
static void showargs(int argc, char *argv[]);
/* program entry point
*/
int main(int argc, char **argv) {
unsigned int nlines, nwords, wordcount;
unsigned long totalcharacters;
nlines = 0;
nwords = 0;
totalcharacters = 0;
showargs(argc, argv);
while (readaline() != 0) {
wordcount = makeintowords(buffer);
nwords += wordcount;
totalcharacters += analyzewords(buffer);
nlines++;
}
printstatistics(nwords, nlines, totalcharacters); /* BUG #2 HERE */
return(0);
}
/* make the buffer into a list of null-terminated words that end in
* in two nulls, squish out white space
*/
static int makeintowords(char *bufp) {
unsigned int nwords;
char *writep;
nwords = 0;
writep = bufp;
do {
while (*bufp == ' ')
bufp++; /* skip white space between words */
if (*bufp != 0)
nwords++; /* got the start of a word */
while (*bufp && *bufp != ' ')
*writep++ = *bufp++;
if (*bufp != 0)
bufp++; /* skip over space after word */
*writep++ = 0; /* word is null terminated */
}
while (*bufp);
*writep++ = 0;
return(nwords);
}
/* analyze the words in the buffer
* there is a null between each word and two nulls at the end
*/
static long analyzewords(char *bufp) {
unsigned long charcount;
unsigned int letterindex;
charcount = 0;
while (*bufp != 0) {
char first = 1;
int wordlen = 0;
while (*bufp != 0) {
letterindex = toupper(*bufp) - 'A'; /* 0-based index */
if (first) {
letterinfo[letterindex].firstletter++;
first = 0;
}
letterinfo[letterindex].count++; /* count the letter */
charcount++;
wordlen++;
bufp++;
} /* BUG #1 AFTER THIS LINE */
wordcounts[wordlen - 1]++; /* count a word of this length */
}
return(charcount);
}
/* display all the statistics
*/
static void printstatistics(int nlines, int nwords, long charcount) {
unsigned int n, count;
float averagelength;
if (nlines == 0)
printf("No lines entered\n");
else {
averagelength = (float)nwords / nlines;
printf("Total number of letters = %ld\n", charcount);
printf("Total number of lines = %d\n", nlines);
printf("Total word count = %d\n", nwords);
printf("Average number of words per line = %g\n", averagelength);
for (n = 0; n < LETTERSINALPHABET; n++) {
count = letterinfo[n].count;
if (count > 0)
printf("'%c' occurs %u times, %u times at start of a word\n",
'A' + n, count, letterinfo[n].firstletter);
}
for (n = 0; n < MAXWORDLENGTH; n++) {
count = wordcounts[n];
if (count > 0) {
if (count == 1)
printf("There is 1 word");
else
printf("There are %d words", count);
printf(" %d character", n + 1);
if (n > 0)
printf("s"); /* make it plural */
printf(" long\n");
}
}
}
}
/* read a line from the standard input into "buffer"
* returns 1 for ok, 0 for end of file or empty line
*/
static int readaline() {
printf("Enter a line (empty line to end): ");
if (gets(buffer) == 0)
return(0); /* end of file */
return(*buffer == 0 ? 0 : 1); /* empty line is also end */
}
/* display the arguments the program was called with
*/
static void showargs(int argc, char *argv[]) {
printf("Arguments: ");
while (--argc)
printf("%s ", *++argv);
printf("\n");
}