C Primer Plus(第六版)第十四章 编程练习答案

这次打了真的好多天,不过坚持下来了,现在知道开发并不容易,不过值得学习。--10.16

CH14 Code answer 1:

#include <stdio.h>
#include <string.h>

int Days(char *);

struct month {
	char name[10];
	char abbrve[4];
	int days;
	int monum;
};

struct month months[12] =
	{
		{ "January", "Jan", 31, 1 },
		{ "February", "Feb", 29, 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 main(void)
{
	int total;
	char mon[10];					//一直疑问作者用字符指针来存储 但这边初始化的时候必须给定大小来存储 
	
	puts("Enter a month name:");
	while ( scanf("%s", mon) )
	{
		total = Days(mon);
		printf("%d\n", total);
		puts("Enter next name(enter other to quit):");
	} 
	
	return 0;	
} 

int Days(char * mon)
{
	int index, i;
	int total = 0;
	
	for (index = 0; index < 12; index++)			//返回月份范围 
		if (!strcmp(months[index].abbrve, mon))
			break;
			
	if ( index < 12 && index >= 0)			//如果是不存在的月份index为12 
		for( i = 0 ; i <= index; i++ )
			total += months[i].days;
	else
		return -1;
	
	return total;
}

CH14 Code answer 2:

#include <stdio.h>
#include <string.h> 

int Days(char *, int);
char * s_gets(char *, int); 

struct month {
	char name[10];
	char abbrve[4];
	int days;
	char monum[3];
};

struct month months[12] =
	{
		{ "January", "Jan", 31, "1" },
		{ "February", "Feb", 29, "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 main(void)
{
	int total;
	char mon[10] = {0};
	int n;
	int year;
	
	puts("Enter the month name or number:");
	while(s_gets(mon, 10) != NULL && mon[0] != '\0')
	{
		puts("Enter the day:");
		scanf("%d", &n);
		while (getchar() != '\n')
			continue;
				
		puts("Enter the year:");
		scanf("%d", &year);
		while (getchar() != '\n')
			continue;
		
		total = Days(mon, n);
		printf("%d days have passed since %d\n", total, year);
		
		puts("\nEnter the month name or number:(Enter empty line to quit)");
	}
	
	return 0;
}

int Days(char * mon, int n)
{
	int i, index;
	int total = 0;
	
	if (strlen(mon) <= 2)			//一开始没加花括号 if只能管下面那条语句当判断错误 就会执行到下面那个if 而不是elseif 
	{
		for (index = 0; index < 12; index++)
			if ( !strcmp(months[index].monum, mon) )
				break;
	}		
	else if (strlen(mon) == 3)
	{
		for (index = 0; index < 12; index++)
			if ( !strcmp(months[index].abbrve, mon) )
				break;
	}		
	else
	{
		for (index = 0; index < 12; index++)
			if ( !strcmp(months[index].name, mon) )
				break;
	} 
	
	if (index < 12 && index >= 0)
	{ 
		for ( i = 0; i < index; i++)	//假设用户输入的是2月 那么就是一月+用户输入的天数 所以是<index 
			total += months[i].days;
	} 
	else
		return -1;
		 
	return total + n;
}

char * s_gets(char * st, int n)
{
	char * ret_val;
	char * find;
	
	ret_val = fgets(st, n, stdin);
	if (ret_val)
	{
		find = strchr(st, '\n');
		if (find)
			*find = '\0';
		else
			while (getchar() != '\n')
				continue;
	}
	
	return ret_val;
}

CH14 Code answer 3:

/* manybook.c -- multiple book inventory */
#include <stdio.h>
#include <string.h>

#define MAXTITL   40
#define MAXAUTL   40
#define MAXBKS   100              /* maximum number of books  */

struct book {                     /* set up book template     */
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

char * s_gets(char * st, int n);
void CPrint(struct book p[], int n);
void NPrint(struct book p[], int n);

int main(void)
{
    struct book library[MAXBKS]; /* array of book structures */
    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 && s_gets(library[count].title, MAXTITL) != NULL
           && library[count].title[0] != '\0')
    {
        printf("Now enter the author.\n");
        s_gets(library[count].author, MAXAUTL);
        printf("Now enter the value.\n");
        scanf("%f", &library[count++].value);
        while (getchar() != '\n')
            continue;          /* clear input line         */
        if (count < MAXBKS)
            printf("Enter the next title.\n");
    }
    
    if (count > 0)
    {
        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);
						
        puts("\n");
        CPrint(library, count);
        puts("\n");
        NPrint(library, count);
    }
    else
    	printf("No books? Too bad.\n");
    
    return 0;
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   // look for newline
        if (find)                  // if the address is not NULL,
            *find = '\0';          // place a null character there
        else
            while (getchar() != '\n')
                continue;          // dispose of rest of line
    }
    return ret_val;
}

void CPrint(struct book p[], int n)
{
	int i, j;
	struct book tmp; 
	
	for (i = 0; i < n - 1; i++)
	{
		for ( j = i + 1; j < n; j++)
			if ( p[i].title[0] > p[j].title[0] ) 
			{
				tmp = p[i];
				p[i] = p[j];
				p[j] = tmp;
			}
		printf("%s by %s: $%.2f\n", p[i].title, p[i].author, p[i].value);
	}
	printf("%s by %s: $%.2f\n", p[i].title, p[i].author, p[i].value);	
	
} 

void NPrint(struct book p[], int n)
{
	int i, j;
	struct book tmp; 
	
	for (i = 0; i < n - 1; i++)
	{
		for ( j = i + 1; j < n; j++)
			if ( p[i].value > p[j].value ) 
			{
				tmp = p[i];
				p[i] = p[j];
				p[j] = tmp;
			}
		printf("%s by %s: $%.2f\n", p[i].title, p[i].author, p[i].value);
	}
	printf("%s by %s: $%.2f\n", p[i].title, p[i].author, p[i].value);	
	
} 

CH14 Code answer 4:

A:

#include <stdio.h>
#include <string.h>

#define LEN 20

struct names{
	char first[LEN];
	char center[LEN];
	char last[LEN];
};

struct guy{
	unsigned int sty;
	struct names handle;
};

void Print(const struct guy * p);

int main(void)
{
	struct guy ifm[5] ={
		{
			302039823,
			{ .first = "Zeep", .last = "Po" },
		},
		{
			302039823,
			{ "Emo", .last = "Tao" },
		},
		{
			302039823,
			{ "Jun", "Hao", "Zhu" },
		},
		{
			302039823,
			{ "Zhong", "Zheng", "Chen" },
		},
		{
			302039823,
			{ "P", .last = "W" },
		}	
	};
	
	Print(ifm);
	
	return 0;
}

void Print(const struct guy * p)		//传递地址 
{
	int i;
	
	for ( i = 0; i < 5; i++ )
	{
		if ( !strlen((p + i)->handle.center) )
			printf("%s.%s -- %d\n", (p + i)->handle.last, (p + i)->handle.first, (p + i)->sty);
		else
			printf("%s.%s %c. -- %d\n", (p + i)->handle.last, (p + i)->handle.first, 
								(p + i)->handle.center[0], (p + i)->sty);	
	} 
}

B:

#include <stdio.h>
#include <string.h>

#define LEN 20

struct names{
	char first[LEN];
	char center[LEN];
	char last[LEN];
};

struct guy{
	unsigned int sty;
	struct names handle;
};

void Print(const struct guy * p);

int main(void)
{
	struct guy ifm[5] ={
		{
			302039823,
			{ .first = "Zeep", .last = "Po" },
		},
		{
			302039823,
			{ "Emo", .last = "Tao" },
		},
		{
			302039823,
			{ "Jun", "Hao", "Zhu" },
		},
		{
			302039823,
			{ "Zhong", "Zheng", "Chen" },
		},
		{
			302039823,
			{ "P", .last = "W" },
		}	
	};
	
	Print(ifm);
	
	return 0;
}

void Print(const struct guy p[])		//传递个值 这是个副本 
{
	int i;
	
	for ( i = 0; i < 5; i++ )
	{
		if ( !strlen((p + i)->handle.center) )
			printf("%s.%s -- %d\n", (p + i)->handle.last, (p + i)->handle.first, (p + i)->sty);
		else
			printf("%s.%s %c. -- %d\n", (p + i)->handle.last, (p + i)->handle.first, 
								(p + i)->handle.center[0], (p + i)->sty);	
	} 
}

CH14 Code answer 5:

#include <stdio.h>
#include <string.h>

#define CSIZE 4
#define NLEN 10

struct name{
	char first[NLEN];
	char last[NLEN];
};

struct student{
	struct name hm;
	float grade[3];
	float avg;
};

char * s_gets(char * st, int n);
void Print_ifm(const struct student * p, int n);

int main(void)
{
	struct student guy[CSIZE];
	int count = 0;
	int i;
	
	puts("Enter a student name:");
	while ( count < CSIZE && s_gets(guy[count].hm.last, NLEN) != NULL 
				&& guy[count].hm.last[0] != '\0' )
	{
		puts("Enter the student first name:");
		s_gets(guy[count].hm.first, NLEN);
		
		puts("Enter the student that three grades:");
		for ( i = 0; i < 3; i++)
			scanf("%f", &guy[count].grade[i]);
		guy[count].avg = (guy[count].grade[0] + guy[count].grade[1] +
								guy[count].grade[2]) / 3;
		while ( getchar() != '\n' )
			continue;
			
		puts("Enter the next student name:(Enter empty line to quit)");
		count++;
	}
	
	Print_ifm(guy, count);
	printf("All avg:%-8.2f.", (guy[0].avg + guy[1].avg + guy[2].avg)/3 );
	
	return 0; 
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   
        if (find)                 
            *find = '\0';         
        else
            while (getchar() != '\n')
                continue;          
    }
    return ret_val;
}

void Print_ifm(const struct student * p, int n)
{
	int i;
	
	for ( i = 0; i < n; i++)
		printf( "%s %s:  exam1:%-8.2f exam2:%-8.2f exam3:%-8.2f  avg:%-5.2f.\n", (p + i)->hm.first, 
					(p + i)->hm.last, (p + i)->grade[0], (p + i)->grade[1], (p + i)->grade[2],
					(p + i)->avg );
}

CH14 Code answer 6:

#include <stdio.h>
#include <stdlib.h>

#define NLEN 20
#define MMB 18
#define IFM 5
#define LMAX 256

struct name{
	char first[NLEN];
	char last[NLEN];
};

struct member{
	int num;
	struct name self;
	int exam;
	int bingo;
	int walk;
	int point;
	float beat;
};

void f_gets(FILE * fp, struct member (*p)[IFM], int next[MMB]);
void Print(struct member (*p)[IFM], int next[MMB]);

int main(void)
{
	FILE * fp;
	struct member guy[MMB][IFM] = { 0 };	
	char fname[NLEN];			
	int next[MMB] = { 0 };			//存储同一名棒球手的多次出线
	 
	puts("Enter the file name:");
	scanf("%s", fname);
	if ( (fp = fopen(fname, "r")) == NULL )
	{
		fprintf(stderr, "Can't open the file!");
		exit(EXIT_FAILURE);
	}
	
//	fscanf(fp, "%d", &n);			一定提前尝试能不能读取!!要不然理论想通了但一直不通 
//	printf("%d", n);				发现是读取文件的指针少了个括号 
	f_gets(fp, guy, next); 
	
	Print(guy, next);

	puts("\nDone!");
	
	return 0;
} 
//这个程序真是打了太久了 把与文件和结构放在一起 莫名其妙各种地方卡了半天 还是要先单个测试再打循环 
void f_gets(FILE * fp, struct member (*p)[IFM], int next[MMB])
{
	int i, j;	
	int itmp = 0;
	
//尝试创建一个结构作为载体 但fgets对于文件的读取一直调试不好 于是用了这个比较笨的方法 但真的没有什么其他思路	
    while (fscanf(fp, "%d", &itmp) == 1)
    {
//    	printf("%d", itmp - 1);
    	if ( p[itmp - 1][next[itmp - 1]].num != 0 )
    		next[itmp - 1]++;
    		
    	p[itmp - 1][next[itmp - 1]].num = itmp;
    	fscanf(fp, "%s", p[itmp - 1][next[itmp - 1]].self.first);
//    	puts(p[itmp - 1][next[itmp - 1]].self.first); 
    	fscanf(fp, "%s", p[itmp - 1][next[itmp - 1]].self.last);
    	fscanf(fp, "%d", &p[itmp - 1][next[itmp - 1]].exam);
    	fscanf(fp, "%d", &p[itmp - 1][next[itmp - 1]].bingo);
    	fscanf(fp, "%d", &p[itmp - 1][next[itmp - 1]].walk);
    	fscanf(fp, "%d", &p[itmp - 1][next[itmp - 1]].point);	
	}
		
}

void Print(struct member (*p)[IFM], int next[MMB])
{
	int i, j;
	
	for ( i = 0, j = 0; i < MMB; i++, j = 0)
	{
		if (p[i][j].num == 0)
			break;
			
		float x = 0, y = 0;
		for ( j = 0; j <= next[i]; j++ )
		{
			x += p[i][j].bingo;
			y += p[i][j].exam;
		}

		for ( j = 0; j <= next[i]; j++ )
			p[i][j].beat = x / y;
		
		for ( j = 0; j <= next[i]; j++)		//数组是存在第0所以数为0 所以要<=	
			printf("%d %-5s %-8s %-5d %-5d %-5d %-5d %-5.2f\n", p[i][j].num, p[i][j].self.first, 
				p[i][j].self.last, p[i][j].exam, p[i][j].bingo,
					p[i][j].walk, p[i][j].point, p[i][j].beat);
			
	}
 } 

CH14 Code answer 7:

/* booksave.c -- saves structure contents in a file */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXTITL  40
#define MAXAUTL  40
#define MAXBKS   10             /* maximum number of books */

struct book {                   /* set up book template    */
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

char * s_gets(char * st, int n);
int Find_Emt(struct book * p); 
void Del_Tag(struct book * p, char * name);

int main(void)
{
    struct book library[MAXBKS] = { 0 }; /* array of structures 要记得清空作者居然没初始化    */
    int count = 0;
    int index;
    FILE * pbooks;
    int size = sizeof (struct book);
    int choice = 0;
    
    
    //打开文件 
    if ( (pbooks = fopen("book.txt", "a+b")) == NULL )
    {
        fputs("Can't open book.txt file\n",stderr);
        exit(1);
    }
    
    
    //打印原始信息 count计算个数 
    rewind(pbooks);            /* go to start of file     */
    while (count < MAXBKS &&  fread(&library[count], size, 1, pbooks) == 1)
    {
        if (count == 0)
            puts("Current contents of book.txt:");
        printf("%s by %s: $%.2f\n",library[count].title,
               library[count].author, library[count].value);
        count++;
    }
    if (count == MAXBKS)
    {
        fputs("The book.txt file is full.", stderr);
        exit(2);
    }
    
    
    //进行增删操作 
    puts("0:Del data     1:Add data     7:Quit");
    while( scanf("%d", &choice) && choice != 7 )
    {
    	while (getchar() != '\n')
    		continue;
    	if (choice == 1 || choice == 0 )
    	{
    		if (choice == 1)
    		{
    			puts("Please add new book titles.");
    			puts("Press [enter] at the start of a line to stop.");
    			count = Find_Emt(library);			
    			while (  count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL
           			&& library[count].title[0] != '\0' )		//Find_Emt放在while中就会出错是为什么?? 
    			{
        			puts("Now enter the author.");
        			s_gets(library[count].author, MAXAUTL);
        			puts("Now enter the value.");
        			scanf("%f", &library[count].value);
        			while (getchar() != '\n')
            			continue;                /* clear input line  */
        			if (count < MAXBKS)
            			puts("Enter the next title.");
        			count = Find_Emt(library);
    			}
			}
			else
			{
				pbooks = fopen("book.txt", "r+b"); //出现修改所以要r+b打开 
				
				puts("Enter the Del name of title");
				char name[MAXTITL];
				s_gets(name, MAXTITL);
				Del_Tag(library, name);
			} 
		}
		else
			puts("Invalid input!");
		puts("0:Del data     1:Add data     7:Quit");
	}
    
    
    //打印之后的信息 并写入文件 
    if (count > 0)
    {
    	rewind(pbooks);
        puts("Here is the list of your books:");
        for (index = 0; index < count; index++)
        {
        	if (library[index].title[0] != '\0')
        	{
        		printf("%s by %s: $%.2f\n",library[index].title,
                   library[index].author, library[index].value);
                fwrite(&library[index], size, 1, pbooks);	//根据count全部写入 
			} 		
		}  
    }
    else
    	puts("No books? Too bad.\n");
    
    
    puts("Bye.\n");
    fclose(pbooks);
    
    return 0;
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   
        if (find)                 
            *find = '\0';         
        else
            while (getchar() != '\n')
                continue;         
    }
    return ret_val;
}

int Find_Emt(struct book * p)
{
	int i;
	
	for ( i = 0; i < MAXBKS; i++ )
	{
//		printf("%s ", p[i].title);
		if ( p[i].title[0] == '\0' )
			break;	
	}
			
//	printf("i = %d ", i);
	return i;
}

void Del_Tag(struct book * p, char * name)
{
	int i;
	
	for ( i = 0; i < MAXBKS; i++ )
		if (!strcmp(name, p[i].title))
		{
			p[i].title[0] = '\0';
			break;
		}
}

CH14 Code answer 8:

#include <stdio.h>
#include <string.h>

#define NMAX 10
#define MMAX 12

struct member{
	int num;
	int reserve;
	char first[NMAX];
	char last[NMAX];
};

char * s_gets(char * st, int n);
void Print_imf(void);
void Emt_Num(struct member * p);
void Emt_Seats(struct member * p);
void Ex_Seats(struct member p[MMAX]);
int Find_Emt(struct member * p);
void Set_Seats(struct member * p);
void Del_Seats(struct member * p);

int main(void)
{
	char ch;
	struct member group[MMAX] = 
	{ 
		{ 1, 1, "Po", "Zeep" },
		{ 2, 0, "C", "Zz" },
		{ 3, 1, "Tao", "Tao" },
		{ 4, 0, "Lan", "N" }, 
		{ 5, 0, "Zhu", "Hao" },
		{ 6, 1, "Ma", "C" },
		{ 7, 0, "W", "P" },
		{ 8, 0, "Hu", "Rui" },
		{ 9, 1, "C", "C" },
		{ 10, 1, "Yan", "CQ" },
		{ 11, 0, "Z", "Z" },
		{ 12, 1, "Q", "J" }
	};
	int count;
	
	Print_imf();
	while ( scanf("%c", &ch) && ch != 'f' )
	{
		printf("\n");
		while (getchar() != '\n')
			continue;
			
		if ( ch < 'f' && ch >= 'a' )
		{
			switch (ch)
			{
				case 'a':
					Emt_Num(group);
					break;
				case 'b':
					Emt_Seats(group);
					break;
				case 'c':
					Ex_Seats(group);
					break;
				case 'd':
					Set_Seats(group);
					break; 
				case 'e':
					Del_Seats(group);
					break;
			}
		}
		else
			puts("Invalid input!");
		Print_imf();
	}
	
	printf("\nDone!");
	
	return 0;
}

void Print_imf(void)
{
	puts("To choose a function, enter its letter label:");
	puts("a) Show number of empty seats");
	puts("b) Show list of empty seats");
	puts("c) Show alphabetical list of seats");
	puts("d) Assign a customer to a seat assignment");
	puts("e) Delete a seat assignment");
	puts("f) Quit");
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   
        if (find)                 
            *find = '\0';         
        else
            while (getchar() != '\n')
                continue;         
    }
    return ret_val;
}

void Emt_Num(struct member * p)
{
	int i, count;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 1)
			count++;
	printf("There are %d empty seats!\n\n\n", MMAX - count );
}

void Emt_Seats(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
	{
		if ( p[i].reserve == 0 )
			printf("Seat %d is empty!\n", i + 1);
	}
		
	puts("\n");	 
}

void Ex_Seats(struct member p[MMAX])
{
	int i, j;
	struct member tmp;
	
	printf("\n");
	for ( i = 0; i < MMAX - 1; i++ )
		if ( p[i].reserve == 1 )				//加了判断只排序预定的座位 
		{
			for ( j = i + 1; j < MMAX; j++)
			{
				if (p[j].reserve == 1)
				{
//					printf("%s %d       ", p[i].first, p[i].reserve);
					if (p[i].first[0] > p[j].first[0])
					{
						tmp = p[i];
						p[i] = p[j];
						p[j] = tmp;
					}
				}		 
			}		
			printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);	
		}	
	if (p[i].reserve == 1)
		printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);//i正处于最后一位 前面迭代没有到这位

	puts("\n");	
} 

int Find_Emt(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 0 )
			return i;
}

void Set_Seats(struct member * p)
{
	int index;
	
	index = Find_Emt(p);
	puts("Enter the first name.");
    puts("Press [enter] at the start of a line to stop.");
	while ( index < MMAX && s_gets(p[index].first, NMAX) 
				&& p[index].first[0] != '\0')
	{
		puts("Enter the last name");
		s_gets(p[index].last, NMAX);
		p[index].reserve = 1;
		puts("Enter the next first name");
		index = Find_Emt(p);
	}
	puts("\n") ;
}

void Del_Seats(struct member * p)
{
	int n, i;
	
	puts("Enter the tag num to delete");
	while ( scanf("%d", &n) && n < MMAX && n != 0)
	{
		while (getchar() != '\n')
			continue;
		for (i = 0; i < MMAX; i++)		//找了一早上bug... 因为每次c功能会把数组下标打乱 
			if (p[i].num == n)			//于是这边设置删除下标就会设错 本来应该传递数组进c功能 
				p[i].reserve = 0;		//但写法应该是已经是传递结构创建副本 但好像没用 
//		p[n - 1].reserve = 0;
		puts("Enter the tag num to delete(Enter 0 to quit)");
	}
	puts("\n"); 
}

CH14 Code answer 9:

#include <stdio.h>
#include <string.h>

#define NMAX 10
#define MMAX 12
#define PLN 4

int plane[PLN] = {102, 311, 444, 519};

struct member{
	int num;
	int reserve;
	char first[NMAX];
	char last[NMAX];
};

char * s_gets(char * st, int n);
void Print_imf(int flight);
void Emt_Num(struct member * p);
void Emt_Seats(struct member * p);
void Ex_Seats(struct member p[MMAX]);
int Find_Emt(struct member * p);
void Set_Seats(struct member * p);
void Del_Seats(struct member * p);
void Print_Pln(void); 
void Confirm_Seats(struct member * p);

int main(void)
{
	char ch;
	int flight;
	struct member group[PLN][MMAX] = 
	{ 
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		}
	};
	
	Print_Pln();
	while (scanf("%d", &flight) && flight != 0)		//接受航班号 
	{
		printf("\n");
		while (getchar() != '\n')
			continue;
			
		if ( flight <= 4 && flight >= 1 )
		{
			Print_imf(flight);
			while ( scanf("%c", &ch) && ch != 'g' )
			{
				printf("\n");
				while (getchar() != '\n')
					continue;
			
				if ( ch <= 'f' && ch >= 'a' )
				{
					switch (ch)
					{
						case 'a':
							Emt_Num(group[flight - 1]);
							break;
						case 'b':
							Emt_Seats(group[flight - 1]);
							break;
						case 'c':
							Ex_Seats(group[flight - 1]);
							break;
						case 'd':
							Set_Seats(group[flight - 1]);
							break; 
						case 'e':
							Del_Seats(group[flight - 1]);
							break;
						case 'f':
							Confirm_Seats(group[flight - 1]);
							break;
					}	
				}
				else
					puts("Invalid input!");
				Print_imf(flight);
			}			
		}
		else	
			puts("Invalid input!");
		puts("\n");
		Print_Pln();
	}
	
	printf("\nDone!");
	
	return 0;
}

void Print_imf(int flight)
{
	printf("Current flight:%d\n", plane[flight - 1]); 
	puts("To choose a function, enter its letter label:");
	puts("a) Show number of empty seats");
	puts("b) Show list of empty seats");
	puts("c) Show alphabetical list of seats");
	puts("d) Assign a customer to a seat assignment");
	puts("e) Delete a seat assignment");
	puts("f) Confirm seats");
	puts("g) Quit");
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   
        if (find)                 
            *find = '\0';         
        else
            while (getchar() != '\n')
                continue;         
    }
    return ret_val;
}

void Emt_Num(struct member * p)
{
	int i, count;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 1)
			count++;
	printf("There are %d empty seats!\n\n\n", MMAX - count );
}

void Emt_Seats(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
	{
		if ( p[i].reserve == 0 )
			printf("Seat %d is empty!\n", i + 1);
	}
		
	puts("\n");	 
}

void Ex_Seats(struct member p[MMAX])
{
	int i, j;
	struct member tmp;
	
//	for ( i = 0; i < MMAX; i++)			找不到该如何传递结构 现在都是传递指针 
//		printf("%d ", p[i].num);
	
	printf("\n");
	for ( i = 0; i < MMAX - 1; i++ )
		if ( p[i].reserve == 1 )				//加了判断只排序预定的座位 
		{
			for ( j = i + 1; j < MMAX; j++)
			{
				if (p[j].reserve == 1)
				{
//					printf("%s %d       ", p[i].first, p[i].reserve);
					if (p[i].first[0] > p[j].first[0])
					{
						tmp = p[i];
						p[i] = p[j];
						p[j] = tmp;
					}
				}		 
			}		
			printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);	
		}	
	if (p[i].reserve == 1)
		printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);//i正处于最后一位 前面迭代没有到这位

	puts("\n");	
} 

int Find_Emt(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 0 )
			return i;
}

void Set_Seats(struct member * p)
{
	int index;
	
	index = Find_Emt(p);
	puts("Enter the first name.");
    puts("Press [enter] at the start of a line to stop.");
	while ( index < MMAX && s_gets(p[index].first, NMAX) 
				&& p[index].first[0] != '\0')
	{
		puts("Enter the last name");
		s_gets(p[index].last, NMAX);
		p[index].reserve = 1;
		puts("Enter the next first name");
		index = Find_Emt(p);
	}
	puts("\n") ;
}

void Del_Seats(struct member * p)
{
	int n, i;
	
	puts("Enter the tag num to delete");
	while ( scanf("%d", &n) && n < MMAX && n != 0)
	{
		while (getchar() != '\n')
			continue;
		for (i = 0; i < MMAX; i++)		//找了一早上bug... 因为每次c功能会把数组下标打乱 
			if (p[i].num == n)			//于是这边设置删除下标就会设错 本来应该传递数组进c功能 
				p[i].reserve = 0;		//但写法应该是已经是传递结构创建副本 但好像没用 
//		p[n - 1].reserve = 0;
		puts("Enter the tag num to delete(Enter 0 to quit)");
	}
	puts("\n"); 
}

void Print_Pln(void)
{
	puts("Select your flight number(Enter 0 to quit):");
	puts("1) 102          2) 311");
	puts("3) 444          4) 519");
}

void Confirm_Seats(struct member * p)
{
	int i, j;
	
	printf("Serial     Reserve     FirstN     LastN\n");
	for ( i = 0; i < MMAX; i++)
		for ( j = 0; j < MMAX; j++)
			if (p[j].num == i)
			{
				printf("%-7d    %-7d     %-6s     %-5s\n", p[j].num, p[j].reserve, 
					p[j].first, p[j].last);
				break;
			}
	puts("\n");			
}

CH14 Code answer 10:

#include <stdio.h>
#include <string.h>

#define NMAX 10
#define MMAX 12
#define PLN 4

typedef void (*V_FP_STRUCTP)(struct member *);

int plane[PLN] = {102, 311, 444, 519};

struct member{
	int num;
	int reserve;
	char first[NMAX];
	char last[NMAX];
};

char * s_gets(char * st, int n);
void Print_imf(int flight);
void Emt_Num(struct member * p);
void Emt_Seats(struct member * p);
void Ex_Seats(struct member * p);
int Find_Emt(struct member * p);
void Set_Seats(struct member * p);
void Del_Seats(struct member * p);
void Print_Pln(void); 
void Confirm_Seats(struct member * p);

int main(void)
{
	char ch;
	int flight;
	V_FP_STRUCTP arpf[6] = {Emt_Num, Emt_Seats, Ex_Seats, Set_Seats, Del_Seats, Confirm_Seats};
	struct member group[PLN][MMAX] = 
	{ 
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		},
		{
			{ 1, 1, "Po", "Zeep" },
			{ 2, 0, "C", "Zz" },
			{ 3, 1, "Tao", "Tao" },
			{ 4, 0, "Lan", "N" }, 
			{ 5, 0, "Zhu", "Hao" },
			{ 6, 1, "Ma", "C" },
			{ 7, 0, "W", "P" },
			{ 8, 0, "Hu", "Rui" },
			{ 9, 1, "C", "C" },
			{ 10, 1, "Yan", "CQ" },
			{ 11, 0, "Z", "Z" },
			{ 12, 1, "Q", "J" }
		}
	};
	
	Print_Pln();
	while (scanf("%d", &flight) && flight != 0)		//接受航班号 
	{
		printf("\n");
		while (getchar() != '\n')
			continue;
			
		if ( flight <= 4 && flight >= 1 )
		{
			Print_imf(flight);
			while ( scanf("%c", &ch) && ch != 'g' )
			{
				printf("\n");
				while (getchar() != '\n')
					continue;
			
				if ( ch <= 'f' && ch >= 'a' )
				{
					switch (ch)
					{
						case 'a':
							arpf[0](group[flight - 1]);
							break;
						case 'b':
							arpf[1](group[flight - 1]);
							break;
						case 'c':
							arpf[2](group[flight - 1]);
							break;
						case 'd':
							arpf[3](group[flight - 1]);
							break; 
						case 'e':
							arpf[4](group[flight - 1]);
							break;
						case 'f':
							arpf[5](group[flight - 1]);
							break;
					}	
				}
				else
					puts("Invalid input!");
				Print_imf(flight);
			}			
		}
		else	
			puts("Invalid input!");
		puts("\n");
		Print_Pln();
	}
	
	printf("\nDone!");
	
	return 0;
}

void Print_imf(int flight)
{
	printf("Current flight:%d\n", plane[flight - 1]); 
	puts("To choose a function, enter its letter label:");
	puts("a) Show number of empty seats");
	puts("b) Show list of empty seats");
	puts("c) Show alphabetical list of seats");
	puts("d) Assign a customer to a seat assignment");
	puts("e) Delete a seat assignment");
	puts("f) Confirm seats");
	puts("g) Quit");
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   
        if (find)                 
            *find = '\0';         
        else
            while (getchar() != '\n')
                continue;         
    }
    return ret_val;
}

void Emt_Num(struct member * p)
{
	int i, count;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 1)
			count++;
	printf("There are %d empty seats!\n\n\n", MMAX - count );
}

void Emt_Seats(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
	{
		if ( p[i].reserve == 0 )
			printf("Seat %d is empty!\n", i + 1);
	}
		
	puts("\n");	 
}

void Ex_Seats(struct member * p)
{
	int i, j;
	struct member tmp;
	
//	for ( i = 0; i < MMAX; i++)			找不到该如何传递结构 现在都是传递指针 
//		printf("%d ", p[i].num);
	
	printf("\n");
	for ( i = 0; i < MMAX - 1; i++ )
		if ( p[i].reserve == 1 )				//加了判断只排序预定的座位 
		{
			for ( j = i + 1; j < MMAX; j++)
			{
				if (p[j].reserve == 1)
				{
//					printf("%s %d       ", p[i].first, p[i].reserve);
					if (p[i].first[0] > p[j].first[0])
					{
						tmp = p[i];
						p[i] = p[j];
						p[j] = tmp;
					}
				}		 
			}		
			printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);	
		}	
	if (p[i].reserve == 1)
		printf("%d %s %s\n", p[i].num, p[i].first, p[i].last);//i正处于最后一位 前面迭代没有到这位

	puts("\n");	
} 

int Find_Emt(struct member * p)
{
	int i;
	
	for ( i = 0; i < MMAX; i++)
		if ( p[i].reserve == 0 )
			return i;
}

void Set_Seats(struct member * p)
{
	int index;
	
	index = Find_Emt(p);
	puts("Enter the first name.");
    puts("Press [enter] at the start of a line to stop.");
	while ( index < MMAX && s_gets(p[index].first, NMAX) 
				&& p[index].first[0] != '\0')
	{
		puts("Enter the last name");
		s_gets(p[index].last, NMAX);
		p[index].reserve = 1;
		puts("Enter the next first name");
		index = Find_Emt(p);
	}
	puts("\n") ;
}

void Del_Seats(struct member * p)
{
	int n, i;
	
	puts("Enter the tag num to delete");
	while ( scanf("%d", &n) && n < MMAX && n != 0)
	{
		while (getchar() != '\n')
			continue;
		for (i = 0; i < MMAX; i++)		//找了一早上bug... 因为每次c功能会把数组下标打乱 
			if (p[i].num == n)			//于是这边设置删除下标就会设错 本来应该传递数组进c功能 
				p[i].reserve = 0;		//但写法应该是已经是传递结构创建副本 但好像没用 
//		p[n - 1].reserve = 0;
		puts("Enter the tag num to delete(Enter 0 to quit)");
	}
	puts("\n"); 
}

void Print_Pln(void)
{
	puts("Select your flight number(Enter 0 to quit):");
	puts("1) 102          2) 311");
	puts("3) 444          4) 519");
}

void Confirm_Seats(struct member * p)
{
	int i, j;
	
	printf("Serial     Reserve     FirstN     LastN\n");
	for ( i = 0; i < MMAX; i++)
		for ( j = 0; j < MMAX; j++)
			if (p[j].num == i)
			{
				printf("%-7d    %-7d     %-6s     %-5s\n", p[j].num, p[j].reserve, 
					p[j].first, p[j].last);
				break;
			}
	puts("\n");			
}

CH14 Code answer 11:

#include <stdio.h>
#include <math.h>

typedef double (*SIN)(double);

#define MAX 100

void TransForm(double *, double *, int, SIN fp);

int main(void)
{
	int i, j;
	double source[MAX];
	double target[MAX];
	
	for ( i = 0; i < MAX; i++)		//随便初始化 
		source[i] = i;
	
	for ( i = 0; i < 4; i++)
	{
		printf("The %d time:\n", i + 1);
		TransForm(source, target, MAX, sin);
	}
	
	return 0;
}

void TransForm(double * source, double * target, int n, SIN fp)
{
	int i;
	
	for ( i = 0; i < n; i++)
	{
		target[i] = fp(source[i]);
		printf("%-5.2lf ", target[i]);
		if ( (i + 1) % 10 == 0 )
			printf("\n");
	}
		
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值