C Primer Plus(13-17章)答案
来源:互联网 发布:淘宝数据作战室 编辑:程序博客网 时间:2024/05/22 04:39
Chapter 13
PE 13-2
#include <stdio.h>
#include <stdlib.h>
//#include <console.h>
int main(int argc, char *argv[])
{
int byte;
FILE * source;
FILE * target;
// argc = ccommand(&argv);
if (argc != 3)
{
printf("Usage: %s sourcefile targetfile\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((source = fopen(argv[1], "rb")) == NULL)
{
printf("Could not open file %s for input\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((target = fopen(argv[2], "wb")) == NULL)
{
printf("Could not open file %s for output\n", argv[2]);
exit(EXIT_FAILURE);
}
while ((byte = getc(source)) != EOF)
{
putc(byte, target);
}
if (fclose(source) != 0)
printf("Could not close file %s\n", argv[1]);
if (fclose(target) != 0)
printf("Could not close file %s\n", argv[2]);
return 0;
}
PE 13-4
#include <stdio.h>
#include <stdlib.h>
#include <console.h>
int main(int argc, char *argv[])
{
int byte;
FILE * source;
int filect;
argc = ccommand(&argv);
if (argc == 1)
{
printf("Usage: %s filename[s]\n", argv[0]);
exit(EXIT_FAILURE);
}
for (filect = 1; filect < argc; filect++)
{
if ((source = fopen(argv[filect], "r")) == NULL)
{
printf("Could not open file %s for input\n", argv[filect]);
continue;
}
while ((byte = getc(source)) != EOF)
{
putchar(byte);
}
if (fclose(source) != 0)
printf("Could not close file %s\n", argv[1]);
}
return 0;
}
PE 13-5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <console.h>
#define BUFSIZE 1024
#define SLEN 81
void append(FILE *source, FILE *dest);
int main(int argc, char *argv[])
{
FILE *fa, *fs;
int files = 0;
int fct;
// argc = ccommand(&argv);
if (argc < 3)
{
printf("Usage: %s appendfile sourcefile[s]\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fa = fopen(argv[1], "a")) == NULL)
{
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
{
fputs("Can't create output buffer\n", stderr);
exit(EXIT_FAILURE);
}
for (fct = 2; fct < argc; fct++)
{
if (strcmp(argv[fct], argv[1]) == 0)
fputs("Can't append file to itself\n",stderr);
else if ((fs = fopen(argv[fct], "r")) == NULL)
fprintf(stderr, "Can't open %s\n", argv[fct]);
else
{
if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
{
fputs("Can't create output buffer\n",stderr);
continue;
}
append(fs, fa);
if (ferror(fs) != 0)
fprintf(stderr,"Error in reading file %s.\n",
argv[fct]);
if (ferror(fa) != 0)
fprintf(stderr,"Error in writing file %s.\n",
argv[1]);
fclose(fs);
files++;
printf("File %s appended.\n", argv[fct]);
}
}
printf("Done. %d files appended.\n", files);
fclose(fa);
return 0;
}
void append(FILE *source, FILE *dest)
{
size_t bytes;
static char temp[BUFSIZE]; // allocate once
while ((bytes = fread(temp,sizeof(char),BUFSIZE,source)) > 0)
fwrite(temp, sizeof (char), bytes, dest);
}
PE 13-7
#include <stdio.h>
#include <stdlib.h>
#include <console.h>
int main(int argc, char *argv[])
{
int ch1, ch2;
FILE * f1;
FILE * f2;
argc = ccommand(&argv);
if (argc != 3)
{
printf("Usage: %s file1 file2\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((f1 = fopen(argv[1], "r")) == NULL)
{
printf("Could not open file %s for input\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((f2 = fopen(argv[2], "r")) == NULL)
{
printf("Could not open file %s for input\n", argv[2]);
exit(EXIT_FAILURE);
}
ch1 = getc(f1);
ch2 = getc(f2);
while (ch1 != EOF || ch2 != EOF)
{
while (ch1 != EOF && ch1 != '\n')
{
putchar(ch1);
ch1 = getc(f1);
}
if (ch1 != EOF)
{
putchar('\n');
ch1 = getc(f1);
}
while (ch2 != EOF && ch2 != '\n')
{
putchar(ch2);
ch2 = getc(f2);
}
if (ch2 != EOF)
{
putchar('\n');
ch2 = getc(f2);
}
}
if (fclose(f1) != 0)
printf("Could not close file %s\n", argv[1]);
if (fclose(f2) != 0)
printf("Could not close file %s\n", argv[2]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <console.h>
int main(int argc, char *argv[])
{
int ch1, ch2;
FILE * f1;
FILE * f2;
argc = ccommand(&argv);
if (argc != 3)
{
printf("Usage: %s file1 file2\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((f1 = fopen(argv[1], "r")) == NULL)
{
printf("Could not open file %s for input\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((f2 = fopen(argv[2], "r")) == NULL)
{
printf("Could not open file %s for input\n", argv[2]);
exit(EXIT_FAILURE);
}
ch1 = getc(f1);
ch2 = getc(f2);
while (ch1 != EOF || ch2 != EOF)
{
while (ch1 != EOF && ch1 != '\n')
{
putchar(ch1);
ch1 = getc(f1);
}
if (ch1 != EOF)
{
if (ch2 == EOF)
putchar('\n');
else
putchar(' ');
ch1 = getc(f1);
}
while (ch2 != EOF && ch2 != '\n')
{
putchar(ch2);
ch2 = getc(f2);
}
if (ch2 != EOF)
{
putchar('\n');
ch2 = getc(f2);
}
}
if (fclose(f1) != 0)
printf("Could not close file %s\n", argv[1]);
if (fclose(f2) != 0)
printf("Could not close file %s\n", argv[2]);
return 0;
}
PE 13-9
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
int main(void)
{
FILE *fp;
char words[MAX];
int wordct = 0;
if ((fp = fopen("wordy", "a+")) == NULL)
{
fprintf(stderr,"Can't open \"words\" file.\n");
exit(1);
}
rewind(fp);
while (fgets(words, MAX - 1, fp) != NULL)
wordct++;
rewind(fp);
puts("Enter words to add to the file. Enter one word per line, and ");
puts("press the Enter key at the beginning of a line to terminate.");
while (gets(words) != NULL && words[0] != '\0')
fprintf(fp, "%d: %s\n", ++wordct, words);
puts("File contents:");
rewind(fp);
while (fgets(words, MAX - 1, fp) != NULL)
fputs(words, stdout);
if (fclose(fp) != 0)
fprintf(stderr,"Error closing file\n");
return 0;
}
PE 13-11
#include <stdio.h>
#include <stdlib.h>
#include <console.h>
#define SLEN 256
const char *errmesg[] = {"Usage: %s string filename]\n",
"Can't open file %s\n" };
int main(int argc, char *argv[])
{
FILE *fp;
char line[SLEN];
argc = ccommand(&argv);
if (argc != 3)
{
fprintf(stderr, errmesg[0], argv[0]);
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, errmesg[1], argv[2]);
exit(EXIT_FAILURE);
}
while (fgets(line, SLEN - 1, fp) != NULL)
{
if (strstr(line, argv[1]) != NULL)
fputs(line, stdout);
}
fclose(fp);
return 0;
}
PE 13-12
Data for program:
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 5 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 4 5 2 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 0 4 5 2 0 0 0 0 0 0 0 0
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 4 5 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 1 8 5 0 0 0 4 5 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 4 5 2 0 0 0 0 0
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 3 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 2 2 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 3 3 0 0 0 0 0 0 5 8 9 9 8 5 0 5 6 1 1 1 1 6 5 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 5 5 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
const char trans[LEVELS + 1] = " .':~*=&%@";
void MakePic(int data[][COLS], char pic[][COLS], int rows);
void init(char arr[][COLS], char ch);
int main()
{
int row, col;
int picIn[ROWS][COLS];
char picOut[ROWS][COLS];
char fileName[40];
FILE * infile;
init(picOut, 'S');
printf("Enter name of file: ");
scanf("%s", fileName);
if ((infile = fopen(fileName, "r")) == NULL)
{
fprintf(stderr, "Could not open data file.\n");
exit(EXIT_FAILURE);
}
for (row = 0; row < ROWS; row++)
for (col = 0; col < COLS; col++)
fscanf(infile, "%d", &picIn[row][col]);
if (ferror(infile))
{
fprintf(stderr, "Error getting data from file.\n");
exit(EXIT_FAILURE);
}
MakePic(picIn, picOut, ROWS);
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
putchar(picOut[row][col]);
putchar('\n');
}
return 0;
}
void init(char arr[][COLS], char ch)
{
int r, c;
for (r = 0; r < ROWS; r++)
for (c = 0; c < COLS; c++)
arr[r][c] = ch;
}
void MakePic(int data[][COLS], char pic[][COLS], int rows)
{
int row, col;
for (row = 0; row < rows; row++)
for (col = 0; col < COLS; col++)
pic[row][col] = trans[data[row][col]];
}
Chapter 14
PE 14-1
#include <stdio.h>
#include <string.h>
#include <ctype.h>
struct month {
char name[10];
char abbrev[4];
int days;
int monumb;
};
const struct month months[12] = {
{"January", "Jan", 31, 1},
{"February", "Feb", 28, 2},
{"March", "Mar", 31, 3},
{"April", "Apr", 30, 4},
{"May", "May", 31, 5},
{"June", "Jun", 30, 6},
{"July", "Jul", 31, 7},
{"August", "Aug", 31, 8},
{"September", "Sep", 30, 9},
{"October", "Oct", 31, 10},
{"November", "Nov", 30, 11},
{"December", "Dec", 31, 12}
};
int days(char * m);
int main(void)
{
char input[20];
int daytotal;
printf("Enter the name of a month: ");
while (gets(input) != NULL && input[0] != '\0')
{
daytotal = days(input);
if (daytotal > 0)
printf("There are %d days through %s.\n", daytotal, input);
else
printf("%s is not valid input.\n", input);
printf("Next month (empty line to quit): ");
}
puts("bye");
return 0;
}
int days(char * m)
{
int total = 0;
int mon_num = 0;
int i;
if (m[0] == '\0')
total = -1;
else
{
m[0] = toupper(m[0]);
for (i = 1; m[i] != '\0'; i++)
m[i] = tolower(m[i]);
for (i = 0; i < 12; i++)
if (strcmp(m, months[i].name) == 0)
{
mon_num = months[i].monumb;
break;
}
if (mon_num == 0)
total = -1;
else
for (i = 0; i < mon_num; i++)
total +=months[i].days;
}
return total;
}
PE 14-3
#include <stdio.h>
#include <string.h>
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 100
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
void sortt(struct book * pb[], int n);
void sortv(struct book * pb[], int n);
int main(void)
{
struct book library[MAXBKS];
struct book * pbk[MAXBKS];
int count = 0;
int index;
printf("Please enter the book title.\n");
printf("Press [enter] at the start of a line to stop.\n");
while (count < MAXBKS && gets(library[count].title) != NULL
&& library[count].title[0] != '\0')
{
printf("Now enter the author.\n");
gets(library[count].author);
printf("Now enter the value.\n");
scanf("%f", &library[count].value);
pbk[count] = &library[count];
count++;
while (getchar() != '\n')
continue;
if (count < MAXBKS)
printf("Enter the next title.\n");
}
printf("Here is the list of your books:\n");
for (index = 0; index < count; index++)
printf("%s by %s: $%.2f\n", library[index].title,
library[index].author, library[index].value);
printf("Here is the list of your books sorted by title:\n");
sortt(pbk, count);
for (index = 0; index < count; index++)
printf("%s by %s: $%.2f\n", pbk[index]->title,
pbk[index]->author, pbk[index]->value);
sortv(pbk, count);
printf("Here is the list of your books sorted by value:\n");
for (index = 0; index < count; index++)
printf("%s by %s: $%.2f\n", pbk[index]->title,
pbk[index]->author, pbk[index]->value);
return 0;
}
void sortt(struct book * pb[], int n)
{
int top, search;
struct book * temp;
for (top = 0; top < n -1; top++)
for (search = top + 1; search < n; search++)
if (strcmp(pb[search]->title, pb[top]->title) < 0)
{
temp = pb[search];
pb[search] = pb[top];
pb[top] = temp;
}
}
void sortv(struct book * pb[], int n)
{
int top, search;
struct book * temp;
for (top = 0; top < n -1; top++)
for (search = top + 1; search < n; search++)
if (pb[search]->value < pb[top]->value)
{
temp = pb[search];
pb[search] = pb[top];
pb[top] = temp;
}
}
PE 14-5
#include <stdio.h>
#include <string.h>
#define LEN 14
#define CSIZE 4
#define SCORES 3
struct name {
char first[LEN];
char last[LEN];
};
struct student {
struct name person;
float scores[SCORES];
float mean;
};
void get_scores(struct student ar[], int lim);
void find_means(struct student ar[], int lim);
void show_class(const struct student ar[], int lim);
void show_ave(const struct student ar[], int lim);
int main(void)
{
struct student class[CSIZE] ={
{ "Flip", "Snide"},
{ "Clare", "Voyans"},
{ "Bingo", "Higgs"},
{ "Fawn", "Hunter"}
};
get_scores(class, CSIZE);
find_means(class, CSIZE);
show_class(class, CSIZE);
show_ave(class, CSIZE);
return 0;
}
void get_scores(struct student ar[], int lim)
{
int i,j;
for (i = 0; i < lim; i++)
{
printf ("Please enter %d scores for %s %s:\n", SCORES,
ar[i].person.first, ar[i].person.last);
for (j = 0; j < SCORES; j++)
{
while (scanf("%f", &ar[i].scores[j]) != 1)
{
scanf("%*s");
puts("Please use numeric input.");
}
}
}
}
void find_means(struct student ar[], int lim)
{
int i, j;
float sum;
for (i = 0; i < lim; i++)
{
for (sum = 0, j = 0; j < SCORES; j++)
sum += ar[i].scores[j];
ar[i].mean = sum / SCORES;
}
}
void show_class(const struct student ar[], int lim)
{
int i, j;
char wholename[2*LEN];
for (i = 0; i < lim; i++)
{
strcpy(wholename, ar[i].person.first);
strcat(wholename, " ");
strcat(wholename, ar[i].person.last);
printf("'s: ", wholename);
for (j = 0; j < SCORES; j++)
printf("%6.1f ", ar[i].scores[j]);
printf(" Average = %5.2f\n", ar[i].mean);
}
}
void show_ave (const struct student ar[], int lim)
{
int i, j;
float total;
printf("\n's: ", "QUIZ AVERAGES");
for (j = 0; j < SCORES; j++)
{
for (total = 0, i = 0; i < lim; i++)
total += ar[i].scores[j];
printf("%6.2f ", total / lim);
}
putchar('\n');
}
PE 14-7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 10
#define CONTINUE 0
#define DONE 1
#define YES 1
#define NO 0
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
int delete;
};
int getlet(const char * s);
int getbook(struct book * pb);
void update(struct book * item);
int main(void)
{
struct book library[MAXBKS];
int count = 0;
int deleted = 0;
int index, filecount, open;
FILE * pbooks;
int size = sizeof (struct book);
if ((pbooks = fopen("book.dat", "r")) != NULL)
{
while (count < MAXBKS && fread(&library[count], size,
1, pbooks) == 1)
{
if (count == 0)
puts("Current contents of book.dat:");
printf("%s by %s: $%.2f\n",library[count].title,
library[count].author, library[count].value);
printf("Do you wish to change or delete this entry?<y/n> ");
if (getlet("yn") == 'y')
{
printf("Enter c to change, d to delete entry: ");
if (getlet("cd") == 'd')
{
library[count].delete = YES;
deleted++;
puts("Entry marked for deletion.");
}
else
update(&library[count]);
}
count++;
}
fclose(pbooks);
}
filecount = count - deleted;
if (count == MAXBKS)
{
fputs("The book.dat file is full.", stderr);
exit(2);
}
puts("Please add new book titles.");
puts("Press [enter] at the start of a line to stop.");
open = 0;
while (filecount < MAXBKS)
{
if (filecount < count)
{
while (library[open].delete == NO)
open++;
if (getbook(&library[open]) == DONE)
break;
}
else if (getbook(&library[filecount]) == DONE)
break;
filecount++;
if (filecount < MAXBKS)
puts("Enter the next book title.");
}
puts("Here is the list of your books:");
for (index = 0; index < filecount; index++)
if (library[index].delete == NO)
printf("%s by %s: $%.2f\n",library[index].title,
library[index].author, library[index].value);
if ((pbooks = fopen("book.dat", "w")) == NULL)
{
fputs("Can't open book.dat file for output\n",stderr);
exit(1);
}
for (index = 0; index < filecount; index++)
if (library[index].delete == NO)
fwrite(&library[index], size, 1, pbooks);
fclose(pbooks);
puts("Done!");
return 0;
}
int getlet(const char * s)
{
char c;
c = getchar();
while (strchr(s, c) == NULL)
{
printf ("Enter a character in the list %s\n", s);
while( getchar() != '\n')
continue;
c = getchar();
}
while (getchar() != '\n')
continue;
return c;
}
int getbook(struct book * pb)
{
int status = CONTINUE;
if (gets(pb->title) == NULL || pb->title[0] == '\0')
status = DONE;
else
{
printf ("Now enter the author: ");
gets (pb->author);
printf ("Now enter the value: ");
while (scanf("%f", &pb->value ) != 1)
{
puts("Please use numeric input");
scanf("%*s");
}
while (getchar() != '\n')
continue;
pb->delete = NO;
}
return status;
}
void update(struct book * item)
{
struct book copy;
char c;
copy = *item;
puts("Enter the letter that indicates your choice:");
puts("t) modify title a) modify author");
puts("v) modify value s) quit, saving changes");
puts("q) quit, ignore changes");
while ( (c = getlet("tavsq")) != 's' && c != 'q')
{
switch ( c )
{
case 't' : puts("Enter new title: ");
gets (copy.title);
break;
case 'a' : puts("Enter new author: ");
gets (copy.author);
break;
case 'v' : puts("Enter new value: ");
while (scanf("%f", ©.value) != 1)
{
puts ("Enter a numeric value: ");
scanf("%*s");
}
while( getchar() != '\n')
continue;
break;
}
puts("t) modify title a) modify author");
puts("v) modify value s) quit, saving changes");
puts("q) quit, ignore changes");
}
if (c == 's')
*item = copy;
}
PE 14-8
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LEN 14
#define SEATS 12
#define EMPTY 0
#define TAKEN 1
#define CONTINUE 1
#define DONE 0
struct planestats {
int seat_id;
int status;
char last[LEN];
char first[LEN];
};
int getmenu(void);
int getlet(const char *);
int openings(const struct planestats [], int);
void show_empties(const struct planestats [], int);
void list_assign(struct planestats *[], int);
void assign_seat(struct planestats [], int);
void delete_seat(struct planestats [], int);
void show_seats(const struct planestats [], int);
void sort(struct planestats *[], int);
void makelist(const struct planestats [], char *, int);
int main(void)
{
struct planestats plane_1[SEATS], *ps[SEATS];
int choice;
int i;
FILE *fp;
size_t size = sizeof(struct planestats);
for ( i = 0; i < SEATS; i++)
ps[i] = &plane_1[i];
if ((fp = fopen("air.dat", "rb")) == NULL )
for (i = 0; i < SEATS; i++)
{
plane_1[i].status = EMPTY;
plane_1[i].seat_id = i + 1;
}
else
{
fread(plane_1, size, SEATS, fp);
fclose(fp);
}
while ( (choice = getmenu() ) != 'q')
{
switch (choice)
{
case 'o' : printf ("There are %d empty seats.\n",
penings(plane_1, SEATS));
break;
case 'e' : show_empties(plane_1, SEATS);
break;
case 'l' : list_assign(ps, SEATS);
break;
case 'a' : assign_seat(plane_1, SEATS);
break;
case 'd' : delete_seat(plane_1, SEATS);
break;
default : puts("Switch trouble");
break;
}
}
if((fp = fopen("air.dat", "wb")) == NULL )
puts("Can't save data to file.");
else
{
fwrite(plane_1, size, SEATS, fp);
fclose(fp);
}
puts("Bye from Colossus Airlines!");
return 0;
}
#define CHOICES 6
int getmenu(void)
{
const char *descript[CHOICES] = {
"Show number of empty seats",
"Show list of empty seats",
"Show alphabetical list of seat assignments",
"Assign a customer to a seat",
"Delete a seat assignment",
"Quit"
};
const char labels[CHOICES + 1] = "oeladq";
int i;
puts("To choose a function, enter its letter label");
for (i = 0; i < CHOICES; i++)
printf("%c) %s\n", labels[i], descript[i]);
return getlet(labels);
}
int getlet(const char * s)
{
char c;
c = getchar();
while (strchr(s, c) == NULL)
{
printf ("Enter a character in the list %s\n", s);
while( getchar() != '\n')
continue;
c = getchar();
}
while (getchar() != '\n')
continue;
return c;
}
int openings(const struct planestats pl[], int n)
{
int count = 0;
int seat;
for (seat = 0; seat < n; seat++)
if (pl[seat].status == EMPTY)
count++;
return count;
}
void show_empties(const struct planestats pl[], int n)
{
int seat;
char seating[3* SEATS];
if ( openings(pl,n) == 0)
puts("All seats are assigned");
else
{
puts("The following seats are available:");
makelist(pl, seating, EMPTY);
puts (seating) ;
}
}
void makelist(const struct planestats pl[], char * str, int kind)
{
int seat;
char temp[LEN];
str[0] = '\0';
for (seat = 0; seat < SEATS; seat++)
if (pl[seat].status == kind)
{
sprintf(temp," %d", pl[seat].seat_id);
strcat(str, temp);
}
}
void list_assign(struct planestats *ps[], int n)
{
int i;
if (openings(*ps, n) == SEATS)
puts("All seats are empty.");
else
{
sort(ps, n);
for(i = 0; i < SEATS; i++)
if ( ps[i]->status == TAKEN )
printf ("Seat %d: %s, %s\n",
ps[i]->seat_id, ps[i]->last, ps[i]->first);
}
}
void assign_seat(struct planestats pl[], int n)
{
char list[3 * SEATS];
int seat, loop;
if (openings(pl,n) == 0)
puts("All seats are assigned.");
else
{
makelist(pl,list, EMPTY);
puts("Which seat do you want? Choose from this list:");
puts (list) ;
do
{
while( scanf("%d", &seat) != 1)
{
scanf("%*s");
puts("Enter a number from this list:");
puts (list) ;
}
if (seat < 1 || seat > SEATS ||
pl[seat-1].status == TAKEN)
{
puts("Enter a number from this list:");
puts (list) ;
loop = CONTINUE;
}
else
loop = DONE;
} while (loop == CONTINUE);
while (getchar() != '\n')
continue;
puts("Enter first name:");
gets (pl[seat - 1].first);
puts("Enter last name:");
gets (pl[seat - 1].last);
printf("%s %s assigned to seat %d.\n",
pl[seat - 1].first, pl[seat - 1].last, seat);
puts("Enter a to accept assignment, c to cancel it.");
if (getlet("ac") == 'a')
{
pl[seat - 1].status = TAKEN;
puts("Passenger assigned to seat.");
}
else
puts("Passenger not assigned.");
}
}
void delete_seat(struct planestats pl[], int n)
{
int seat, loop;
char list[3 * SEATS];
if (openings(pl, n) == SEATS)
puts("All seats already are empty.");
else
{
show_seats(pl, n);
makelist(pl, list, TAKEN);
puts("Enter the number of the seat to be cancelled:");
do
{
while( scanf("%d", &seat) != 1)
{
scanf("%*s");
puts("Enter a number from this list:");
puts (list) ;
}
if (seat < 1 || seat > SEATS ||
pl[seat-1].status == EMPTY)
{
puts("Enter a number from this list:");
puts (list) ;
loop = CONTINUE;
}
else
loop = DONE;
} while (loop == CONTINUE);
while (getchar() != '\n')
continue;
printf("%s %s to be canceled for seat %d.\n",
pl[seat - 1].first, pl[seat - 1].last, seat);
puts("Enter d to delete assignment, a to abort.");
if ( getlet("da") == 'd')
{
pl[seat - 1].status = EMPTY;
puts ("Passenger dropped.");
}
else
puts("Passenger retained.");
}
}
void show_seats(const struct planestats pl[], int n)
{
int i;
puts("Seats currently taken:");
for (i = 0; i < SEATS; i++)
if (pl[i].status == TAKEN)
printf("Seat %d: %s, %s\n", pl[i].seat_id,
pl[i].last, pl[i].first);
}
void sort(struct planestats *array[], int limit)
{
int top, search;
struct planestats * temp;
for (top = 0; top < limit -1; top++)
for (search = top + 1; search < limit; search++)
if (strcmp(array[search]->last, array[top]->last) < 0)
{
temp = array[search];
array[search] = array[top];
array[top] = temp;
}
}
PE 14-10
#include <stdio.h>
#include <math.h>
double twice(double x);
double half(double x);
double thrice(double x);
void showmenu(void);
#define NUM 4
int main(void)
{
double (*pf[NUM])(double) = {twice, half, thrice, sqrt};
double val;
double ans;
int sel;
printf("Enter a number (negative to quit): ");
while (scanf("%lf", &val) && val >= 0)
{
showmenu();
while (scanf("%d", &sel) && sel >= 0 && sel <= 3)
{
ans = (*pf[sel])(val);
printf("answer = %f\n", ans);
showmenu();
}
printf("Enter next number (negative to quit): ");
}
puts("bye");
return 0;
}
void showmenu(void)
{
puts("Enter one of the following choices:");
puts("0) double the value 1) halve the value");
puts("2) triple the value 3) squareroot the value");
puts("4) next number");
}
double twice(double x) {return 2.0 * x;}
double half(double x) {return x / 2.0;};
double thrice(double x) {return 3.0 * x;}
Chapter 15
PE 15-1
#include <stdio.h>
#include <stdbool.h> // C99 -- otherwise use int
int bstr_to_dec(const char * str);
bool check_val(const char * str);
int main(void)
{
char value[8* sizeof (int) + 1];
printf("Enter a binary number with up to %d digits: ", 8 * sizeof(int));
while (gets(value) && value[0] != '\0')
{
if (!check_val(value))
puts("A binary number contains just 0s and 1s.");
else
printf("%s is %d\n", value, bstr_to_dec(value));
puts("Enter next value:");
}
puts("Done");
return 0;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while (*str != '\0')
val = 2 * val + (*str++ - '0');
return val;
}
bool check_val(const char * str)
{
bool valid = true;
while (valid && *str != '\0')
{
if (*str != '0' && *str != '1')
valid = false;
++str;
}
return valid;
}
PE 15-2
int bstr_to_dec(const char * str);
char * itobs(int, char *);
int main(int argc, char * argv[])
{
int v1;
int v2;
char bstr[8* sizeof (int) + 1];
if (argc != 3)
{
fprintf(stderr, "Usage: %s binarynum1 binarynum2\n", argv[0]);
exit(EXIT_FAILURE);
}
v1 = bstr_to_dec(argv[1]);
v2 = bstr_to_dec(argv[2]);
printf("~%s = %s\n", argv[1], itobs(~v1, bstr));
printf("~%s = %s\n", argv[2], itobs(~v2, bstr));
printf("%s & %s= %s\n", argv[1], argv[2], itobs(v1 & v2, bstr));
printf("%s | %s= %s\n", argv[1], argv[2], itobs(v1 | v2, bstr));
printf("%s ^ %s= %s\n", argv[1], argv[2], itobs(v1 ^ v2, bstr));
puts("Done");
return 0;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while (*str != '\0')
val = 2 * val + (*str++ - '0');
return val;
}
char * itobs(int n, char * ps)
{
int i;
static int size = 8 * sizeof(int);
for (i = size - 1; i >= 0; i--, n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
return ps;
}
PE 15-3
#include <stdio.h>
char * itobs(int, char *);
int onbits(int);
int main(int argc, char * argv[])
{
int val;
char bstr[8* sizeof (int) + 1];
printf("Enter an integer (negative to quit): ");
while (scanf("%d", &val) && val >= 0)
{
printf ("%d (%s) has %d bits on.\n", val,
itobs(val, bstr), onbits(val));
printf("Next value: ");
}
puts("Done");
return 0;
}
char * itobs(int n, char * ps)
{
int i;
static int size = 8 * sizeof(int);
for (i = size - 1; i >= 0; i--, n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
return ps;
}
int onbits(int n)
{
static const int size = 8 * sizeof(int);
int ct = 0;
int i;
for (i = 0; i < size; i++, n >>= 1)
if ((1 & n) == 1)
ct++;
return ct;
}
PE 15-5
#include <stdio.h>
unsigned int rotate_l(unsigned int, unsigned int);
char * itobs(int, char *);
int main(void)
{
unsigned int val;
unsigned int rot;
unsigned int places;
char bstr1[8* sizeof (int) + 1];
char bstr2[8* sizeof (int) + 1];
printf("Enter an integer (0 to quit): ");
while (scanf("%ud", &val) && val > 0)
{
printf("Enter the number of bits to be rotated: \n");
scanf("%ul", &places);
rot = rotate_l(val, places);
itobs(val, bstr1);
itobs(rot, bstr2);
printf ("%u rotated is %u.\n", val, rot );
printf("%s rotated is %s.\n", bstr1, bstr2);
printf("Next value: ");
}
puts("Done");
return 0;
}
unsigned int rotate_l(unsigned int n, unsigned int b)
{
static const int size = 8 * sizeof(int);
unsigned int overflow;
b %= size;
overflow = n >> (size - b);
return (n << b) | overflow;
}
char * itobs(int n, char * ps)
{
int i;
static int size = 8 * sizeof(int);
for (i = size - 1; i >= 0; i--, n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
return ps;
}
PE 15-7
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define ID_MASK 0xFF
#define SIZE_MASK 0x7F00
#define LEFT 0x00000
#define CENTER 0x08000
#define RIGHT 0x10000
#define ALIGN_MASK 0x18000
#define REGULAR 0x00000
#define BOLD 0x20000
#define ITALIC 0x40000
#define UNDERLINE 0x80000
#define STYLE_MASK 0xE0000
#define SIZE_SHIFT 8
typedef unsigned long font;
char do_menu(font * f);
char get_choice(const char *);
void show_menu(void);
void show_font(font f);
void eatline(void);
void get_id(font * f);
void get_size(font * f);
void get_align(font * f);
int main(void)
{
font sample = 1 | (12 <<SIZE_SHIFT) | LEFT | ITALIC;
while (do_menu(&sample) != 'q')
continue;
puts("Bye!");
return 0;
}
char do_menu(font * f)
{
char response;
show_font(*f);
show_menu();
response = get_choice("fsabiuq");
switch(response)
{
case 'f' : get_id(f); break;
case 's' : get_size(f); break;
case 'a' : get_align(f); break;
case 'b' : *f ^= BOLD; break;
case 'i' : *f ^= ITALIC; break;
case 'u' : *f ^= UNDERLINE; break;
case 'q' : break;
default : fprintf(stderr, "menu problem\n");
}
return response;
}
char get_choice(const char * str)
{
char ch;
ch = getchar();
ch = tolower(ch);
eatline();
while (strchr(str, ch) == NULL)
{
printf("Please enter one of the following: %s\n",
str);
ch = tolower(getchar());
eatline();
}
return ch;
}
void eatline(void)
{
while (getchar() != '\n')
continue;
}
void show_menu(void)
{
puts("f)change font s)change size a)change alignment");
puts("b)toggle bold i)toggle italic u)toggle underline");
puts("q)quit");
}
void show_font(font f)
{
printf("\n%4s %4s %9s %3s %3s %3s\n",
"ID", "SIZE", "ALIGNMENT", "B", "I", "U");
printf("M M", f & ID_MASK, (f & SIZE_MASK) >> SIZE_SHIFT);
switch(f & ALIGN_MASK)
{
case LEFT : printf("%7s", "left"); break;
case RIGHT : printf("%7s", "right"); break;
case CENTER : printf("%7s", "center"); break;
default : printf("%7s", "unknown"); break;
}
printf("%8s %3s %3s\n\n", (f & BOLD) == BOLD? "on" : "off",
(f & ITALIC) == ITALIC ? "on" : "off",
(f & UNDERLINE) == UNDERLINE ? "on" : "off");
}
void get_id(font * f)
{
int id;
printf("Enter font ID (0-255): ");
scanf("%d", &id);
id = id & ID_MASK;
*f |= id;
eatline();
}
void get_size(font * f)
{
int size;
printf("Enter font size (0-127): ");
scanf("%d", &size);
*f |= (size << SIZE_SHIFT) & SIZE_MASK;
eatline();
}
void get_align(font * f)
{
puts("Select alignment:");
puts("l)left c)center r)right");
switch (get_choice("lcr"))
{
case 'l' : *f &= ~ALIGN_MASK; *f |= LEFT; break;
case 'c' : *f &= ~ALIGN_MASK; *f |= CENTER; break;
case 'r' : *f &= ~ALIGN_MASK; *f |= RIGHT; break;
default : fprintf(stderr, "alignment problem\n");
}
}
Chapter 16
PE 16-2
#include <stdio.h>
#define HMEAN(X,Y) (2.0 * (X) *(Y) / ((X) + (Y)))
int main(void)
{
double x, y, ans;
while (scanf("%lf %lf", &x, &y) == 2)
{
ans = HMEAN(x,y);
printf("%g = harmonic mean of %g %g.\n", ans, x, y);
ans = HMEAN(x - y, x +y);
printf("%g = harmonic mean of %g %g.\n", ans, x - y, x + y);
}
puts("Bye");
return 0;
}
PE 16-3
#include <stdio.h>
#include <math.h>
struct polar {
double r;
double theta;
};
struct rect {
double x;
double y;
};
struct rect p_to_r(const struct polar * ppol);
int main(void)
{
struct polar input;
struct rect answer;
while (scanf("%lf %lf", &input.r, &input.theta) == 2)
{
answer = p_to_r(&input);
printf("polar coord: %g %f\n",input.r, input.theta);
printf("rectangular coord: %g %f\n",answer.x, answer.y);
}
puts("Bye");
return 0;
}
struct rect p_to_r(const struct polar * ppol)
{
static const double deg_rad = 3.141592654 / 180.0;
struct rect res;
double ang = deg_rad * ppol->theta;
res.x = ppol->r * sin(ang);
res.y = ppol->r * cos(ang);
return res;
}
PE 16-5
#include <stdio.h>
#include <time.h>
void wait(double t);
void random_pick(int ar[], int arsize, int picks);
#define SPOTS 51
#define PICKS 6
int main()
{
int lotto[SPOTS];
int i;
char ch;
for (i = 0; i < SPOTS; i++)
lotto[i] = i + 1;
do {
random_pick(lotto, SPOTS, PICKS);
printf ("Again? <y/n> ");
ch = getchar();
while (getchar() != '\n')
continue;
} while (ch == 'y' || ch == 'Y');
puts ("Done");
return 0;
}
void random_pick(int ar[], int arsize, int picks)
{
int i, index, temp;
srand(time(0));
if (picks > arsize)
{
fputs("Number of picks > array size\n", stderr);
fputs("Setting picks = array size\n", stderr);
picks = arsize;
}
for (i = 0; i < picks; i++)
{
index = rand() % (arsize - 1);
temp = ar[index];
printf ("- ", temp);
if (i % 20 == 19)
putchar('\n');
ar[index] = ar[arsize - 1];
ar[arsize - 1] = temp;
arsize--;
}
if (i % 20 != 0)
putchar('\n');
}
PE 16-7
// pe16-7.c.-- using a variadic function
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void show_array(const double ar[], int n);
double * new_d_array(int n, ...);
int main()
{
double * p1;
double * p2;
p1 = new_d_array(5, 1.2, 2.3, 3.4, 4.5, 5.6);
p2 = new_d_array(4, 100.0, 20.00, 8.08, -1890.0);
show_array(p1, 5);
show_array(p2, 4);
free(p1);
free(p2);
return 0;
}
void show_array(const double ar[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%g ", ar[i]);
putchar('\n');
}
double * new_d_array(int n, ...)
{
va_list ap;
int i;
double * pt;
va_start(ap, n);
pt = (double *) malloc(n * sizeof(double));
for (i = 0; i< n; i++)
pt[i] = va_arg(ap, double);
va_end(ap);
return pt;
}
Chapter 17
PE 17-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45
struct film {
char title[TSIZE];
int rating;
struct film * next;
};
void show_rec(const struct film * pf);
int main(void)
{
struct film * head = NULL;
struct film * prev, * current;
char input[TSIZE];
puts("Enter first movie title:");
while (gets(input) != NULL && input[0] != '\0')
{
current = (struct film *) malloc(sizeof(struct film));
if (head == NULL)
head = current;
else
prev->next = current;
current->next = NULL;
strcpy(current->title, input);
puts("Enter your rating <0-10>:");
scanf("%d", ¤t->rating);
while(getchar() != '\n')
continue;
puts("Enter next movie title (empty line to stop):");
prev = current;
}
if (head == NULL)
printf("No data entered. ");
else
printf ("Here is the movie list:\n");
current = head;
while (current != NULL)
{
printf("Movie: %s Rating: %d\n", current->title, current->rating);
current = current->next;
}
if (head != NULL)
{
printf("\nHere is the list in reverse order:\n");
show_rec(head);
}
printf("Bye!\n");
return 0;
}
void show_rec(const struct film * pf)
{
if (pf->next != NULL)
show_rec(pf->next);
printf("Movie: %s Rating: %d\n", pf->title, pf->rating);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45
struct film {
char title[TSIZE];
int rating;
struct film * next;
struct film * prev;
};
int main(void)
{
struct film * head = NULL;
struct film * prev, * current;
char input[TSIZE];
puts("Enter first movie title:");
while (gets(input) != NULL && input[0] != '\0')
{
current = (struct film *) malloc(sizeof(struct film));
if (head == NULL)
{
head = current;
head->prev = NULL;
}
else
{
prev->next = current;
current->prev = prev;
}
current->next = NULL;
strcpy(current->title, input);
puts("Enter your rating <0-10>:");
scanf("%d", ¤t->rating);
while(getchar() != '\n')
continue;
puts("Enter next movie title (empty line to stop):");
prev = current;
}
if (head == NULL)
printf("No data entered. ");
else
printf ("Here is the movie list:\n");
current = head;
while (current != NULL)
{
printf("Movie: %s Rating: %d\n", current->title, current->rating);
prev = current;
current = current->next;
}
if (head != NULL)
{
printf("\nHere is the list in reverse order:\n");
current = prev;
while (current != NULL)
{
printf("Movie: %s Rating: %d\n", current->title,
current->rating);
current = current->prev;
}
}
printf("Bye!\n");
return 0;
}
PE 17-3
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h>
#define TSIZE 45
struct film
{
char title[TSIZE];
int rating;
};
typedef struct film Item;
typedef struct node
{
Item item;
struct node * next;
} Node;
#define MAXSIZE 100
typedef struct list
{
Item entries[MAXSIZE];
int items;
} List;
void InitializeList(List * plist);
bool ListIsEmpty(const List * plist);
bool ListIsFull(const List * plist);
unsigned int ListItemCount(const List * plist);
bool AddItem(Item item, List * plist);
void Traverse (const List * plist, void (* pfun)(Item item) );
void EmptyTheList(List * plist);
#endif
#include <stdio.h>
#include <stdlib.h>
#include "list17-3.h"
void showmovies(Item item);
int main(void)
{
List movies;
Item temp;
InitializeList(&movies);
if (ListIsFull(&movies))
{
fprintf(stderr,"No memory available! Bye!\n");
exit(1);
}
puts("Enter first movie title:");
while (gets(temp.title) != NULL && temp.title[0] != '\0')
{
puts("Enter your rating <0-10>:");
scanf("%d", &temp.rating);
while(getchar() != '\n')
continue;
if (AddItem(temp, &movies)==false)
{
fprintf(stderr,"Problem allocating memory\n");
break;
}
if (ListIsFull(&movies))
{
puts("The list is now full.");
break;
}
puts("Enter next movie title (empty line to stop):");
}
if (ListIsEmpty(&movies))
printf("No data entered. ");
else
{
printf ("Here is the movie list:\n");
Traverse(&movies, showmovies);
}
printf("You entered %d movies.\n", ListItemCount(&movies));
EmptyTheList(&movies);
printf("Bye!\n");
return 0;
}
void showmovies(Item item)
{
printf("Movie: %s Rating: %d\n", item.title,
item.rating);
}
#include <stdio.h>
#include <stdlib.h>
#include "list17-3.h"
void InitializeList(List * plist)
{
plist->items = 0;
}
bool ListIsEmpty(const List * plist)
{
if (plist->items == 0)
return true;
else
return false;
}
bool ListIsFull(const List * plist)
{
if (plist->items == MAXSIZE)
return true;
else
return false;
}
unsigned int ListItemCount(const List * plist)
{
return plist->items;
}
bool AddItem(Item item, List * plist)
{
if (plist->items == MAXSIZE)
return false;
else
{
plist->entries[plist->items++] = item;
return true;
}
}
void Traverse (const List * plist, void (* pfun)(Item item) )
{
int i;
for (i = 0; i < plist->items; i++)
(*pfun)(plist->entries[i]);
}
void EmptyTheList(List * plist)
{
plist->items = 0;
}
PE 17-5
#ifndef STACK_H_
#define STACK_H_
#include <stdbool.h>
typedef char Item;
#define MAXSTACK 100
typedef struct stack
{
Item items[MAXSTACK];
int top;
} Stack;
void InitializeStack(Stack * ps);
bool FullStack(const Stack * ps);
bool EmptyStack(const Stack *ps);
bool Push(Item item, Stack * ps);
bool Pop(Item *pitem, Stack * ps);
#endif
#include <stdio.h>
#include "pe17-5.h"
#define SLEN 81
int main(void)
{
Stack stch;
char temp[SLEN];
int i;
char ch;
InitializeStack(&stch);
printf("Enter a line (an empty line to quit): \n");
while (gets(temp) && temp[0] != '\0')
{
i = 0;
while (temp[i] != '\0' && !FullStack(&stch))
Push(temp[i++], &stch);
while (!EmptyStack(&stch))
{
Pop(&ch, &stch);
putchar(ch);
}
putchar('\n');
printf("Enter next line (empty line to quit): ");
}
puts("Done!");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "pe17-5.h"
void InitializeStack(Stack * ps)
{
ps->top = 0;
}
bool FullStack(const Stack * ps)
{
return ps->top == MAXSTACK;
}
bool EmptyStack(const Stack *ps)
{
return ps->top == 0;
}
bool Push(Item item, Stack * ps)
{
if (ps->top == MAXSTACK)
return false;
else
{
ps->items[ps->top++] = item;
return true;
}
}
bool Pop(Item *pitem, Stack * ps)
{
if (ps->top == 0)
return false;
else
{
ps->top--;
*pitem = ps->items[ps->top];
return true;
}
}
PE 17-7
#ifndef _TREE_H_
#define _TREE_H_
#include <stdbool.h>
#define SLEN 81
typedef struct item
{
char wrd[SLEN];
int count;
} Item;
#define MAXITEMS 100
typedef struct node
{
Item item;
struct node * left;
struct node * right;
} Node;
typedef struct tree
{
Node * root;
int size;
} Tree;
void InitializeTree(Tree * ptree);
bool TreeIsEmpty(const Tree * ptree);
bool TreeIsFull(const Tree * ptree);
int TreeItemCount(const Tree * ptree);
bool AddItem(const Item * pi, Tree * ptree);
bool InTree(const Item * pi, const Tree * ptree);
bool DeleteItem(const Item * pi, Tree * ptree);
void Traverse (const Tree * ptree, void (* pfun)(Item item));
void DeleteAll(Tree * ptree);
const Item * WhereInTree(const Item * pi, const Tree * ptree);
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "pe17-7.h"
void printitem(Item item);
char menu(void);
void showwords (const Tree * pt);
void findword (const Tree * pt);
#define SLEN 81
int main(void)
{
Tree wordcount;
FILE * fp;
char filename[SLEN];
char word[SLEN];
Item entry;
char choice;
printf ("Enter name of file to be processed: \n");
gets(filename);
if ((fp = fopen(filename, "r")) == 0)
{
printf("Can't open file %s. Bye.\n", filename);
exit(EXIT_FAILURE);
}
InitializeTree(&wordcount);
while (fscanf(fp, "%s", word) == 1 && !TreeIsFull(&wordcount))
{
strcpy(entry.wrd, word);
AddItem(&entry, &wordcount);
}
while ((choice = menu()) != 'q')
{
switch (choice)
{
case 's' : showwords(&wordcount);
break;
case 'f' : findword(&wordcount);
break;
default : puts("Switching error");
}
}
fclose(fp);
puts("Done");
return 0;
}
char menu(void)
{
int ch;
puts("Word counting program");
puts("Enter the letter corresponding to your choice:");
puts("s) show word list f) find a word");
puts("q) quit");
while ((ch = getchar()) != EOF)
{
while (getchar() != '\n')
continue;
ch = tolower(ch);
if (strchr("sfq",ch) == NULL)
puts("Please enter an s, f, or q:");
else
break;
}
if (ch == EOF)
ch = 'q';
return ch;
}
void showwords (const Tree * pt)
{
if (TreeIsEmpty(pt))
puts("No entries!");
else
Traverse(pt, printitem);
}
void findword (const Tree * pt)
{
char word[SLEN];
Item entry;
const Item * pi;
if (TreeIsEmpty(pt))
{
puts("No entries!");
return;
}
printf("Enter the word to find: ");
scanf("%s", word);
while (getchar() != '\n')
continue;
strcpy(entry.wrd, word);
pi = WhereInTree(&entry, pt);
if (pi == NULL)
printf("%s is not in the list.\n", word);
else
printf("%s appears %d times.\n", word, pi->count);
}
void printitem(Item item)
{
printf("=: %s\n", item.count,
item.wrd);
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "pe17-7.h"
typedef struct pair {
Node * parent;
Node * child;
} Pair;
static Node * MakeNode(const Item * pi);
static bool ToLeft(const Item * i1, const Item * i2);
static bool ToRight(const Item * i1, const Item * i2);
static void AddNode (Node * new_node, Node * root);
static void InOrder(const Node * root, void (* pfun)(Item item));
static Pair SeekItem(const Item * pi, const Tree * ptree);
static void DeleteNode(Node **ptr);
static void DeleteAllNodes(Node * ptr);
void InitializeTree(Tree * ptree)
{
ptree->root = NULL;
ptree->size = 0;
}
bool TreeIsEmpty(const Tree * ptree)
{
if (ptree->root == NULL)
return true;
else
return false;
}
bool TreeIsFull(const Tree * ptree)
{
if (ptree->size == MAXITEMS)
return true;
else
return false;
}
int TreeItemCount(const Tree * ptree)
{
return ptree->size;
}
bool AddItem(const Item * pi, Tree * ptree)
{
Node * new;
Pair seek;
if (TreeIsFull(ptree))
{
fprintf(stderr,"Tree is full\n");
return false;
}
if ((seek = SeekItem(pi, ptree)).child != NULL)
{
seek.child->item.count++;
return true;
}
new = MakeNode(pi);
if (new == NULL)
{
fprintf(stderr, "Couldn't create node\n");
return false;
}
ptree->size++;
if (ptree->root == NULL)
ptree->root = new;
else
AddNode(new,ptree->root);
return true;
}
bool InTree(const Item * pi, const Tree * ptree)
{
return (SeekItem(pi, ptree).child == NULL) ? false : true;
}
const Item * WhereInTree(const Item * pi, const Tree * ptree)
{
Node * pn;
pn = SeekItem(pi,ptree).child;
if (pn != NULL)
return &(pn->item);
else return NULL;
}
bool DeleteItem(const Item * pi, Tree * ptree)
{
Pair look;
look = SeekItem(pi, ptree);
if (look.child == NULL)
return false;
if (look.child->item.count > 0)
look.child->item.count--;
else
{
if (look.parent == NULL)
DeleteNode(&ptree->root);
else if (look.parent->left == look.child)
DeleteNode(&look.parent->left);
else
DeleteNode(&look.parent->right);
ptree->size--;
}
return true;
}
void Traverse (const Tree * ptree, void (* pfun)(Item item))
{
if (ptree != NULL)
InOrder(ptree->root, pfun);
}
void DeleteAll(Tree * ptree)
{
if (ptree != NULL)
DeleteAllNodes(ptree->root);
ptree->root = NULL;
ptree->size = 0;
}
static void InOrder(const Node * root, void (* pfun)(Item item))
{
if (root != NULL)
{
InOrder(root->left, pfun);
(*pfun)(root->item);
InOrder(root->right, pfun);
}
}
static void DeleteAllNodes(Node * root)
{
Node * pright;
if (root != NULL)
{
pright = root->right;
DeleteAllNodes(root->left);
free(root);
DeleteAllNodes(pright);
}
}
static void AddNode (Node * new_node, Node * root)
{
if (ToLeft(&new_node->item, &root->item))
{
if (root->left == NULL)
root->left = new_node;
else
AddNode(new_node, root->left);
}
else if (ToRight(&new_node->item, &root->item))
{
if (root->right == NULL)
root->right = new_node;
else
AddNode(new_node, root->right);
}
else
{
fprintf(stderr,"location error in AddNode()\n");
exit(1);
}
}
static bool ToLeft(const Item * i1, const Item * i2)
{
if (strcmp(i1->wrd, i2->wrd) < 0)
return true;
else
return false;
}
static bool ToRight(const Item * i1, const Item * i2)
{
if (strcmp(i1->wrd, i2->wrd) > 0)
return true;
else
return false;
}
static Node * MakeNode(const Item * pi)
{
Node * new_node;
new_node = (Node *) malloc(sizeof(Node));
if (new_node != NULL)
{
new_node->item = *pi;
new_node->item.count = 1;
new_node->left = NULL;
new_node->right = NULL;
}
return new_node;
}
static Pair SeekItem(const Item * pi, const Tree * ptree)
{
Pair look;
look.parent = NULL;
look.child = ptree->root;
if (look.child == NULL)
return look;
while (look.child != NULL)
{
if (ToLeft(pi, &(look.child->item)))
{
look.parent = look.child;
look.child = look.child->left;
}
else if (ToRight(pi, &(look.child->item)))
{
look.parent = look.child;
look.child = look.child->right;
}
else
break;
}
return look;
}
static void DeleteNode(Node **ptr)
{
Node * temp;
if ( (*ptr)->left == NULL)
{
temp = *ptr;
*ptr = (*ptr)->right;
free(temp);
}
else if ( (*ptr)->right == NULL)
{
temp = *ptr;
*ptr = (*ptr)->left;
free(temp);
}
else
{
for (temp = (*ptr)->left; temp->right != NULL;
temp = temp->right)
continue;
temp->right = (*ptr)->right;
temp = *ptr;
*ptr =(*ptr)->left;
free(temp);
}
}
- C Primer Plus(13-17章)答案
- 第六章答案 c primer plus
- C Primer Plus(2-12章)答案
- c primer plus 第九章 答案
- c primer plus 第八章答案
- c primer plus第九章答案
- c primer plus 第十章答案
- c primer plus 11章习题答案
- c primer plus 14章答案
- c++primer plus第十一章答案
- c primer plus 12.11答案
- C++.Primer.Plus第五版第五章编程练习答案
- c++.primer.plus第五版第六章编程练习答案
- c++.primer.plus第五版第七章编程练习答案
- c++.primer.plus第五版第八章编程练习答案
- c++.primer.plus第五版第九章编程练习答案
- c++.primer.plus第五版第十章编程练习答案
- C++Primer Plus 第二章编程练习个人答案
- C语言头文件组织
- 未来的方向
- 关于纯JAVA浏览器的源码说明
- android学习——SharedPreferences类的的使用方法
- C Primer Plus(2-12章)答案
- C Primer Plus(13-17章)答案
- 百万数据查询优化技巧三十则
- 2011年9月30日
- 删除Ubuntu后无法启动XP的解决办法
- 二分查找法及改进
- 一个IT老总对新人的建议
- API Demos 2.3学习笔记(10)-- Views->WebView
- Ajax的post方法的使用
- 心不余,力不足