C Primer Plus第六版 第十四章程式設計練習
阿新 • • 發佈:2019-02-11
1.
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdbool.h> #define LEN 4 struct month{ char name[LEN]; int days; int monumb; }; struct month months[12] = { {"Jan", 31, 1}, {"Feb", 28, 2}, {"Mar", 31, 3}, {"Apr", 30, 4}, {"May", 31, 5}, {"Jun", 30, 6}, {"Jul", 31, 7}, {"Aug", 31, 8}, {"Sep", 30, 9}, {"Oct", 31, 10}, {"Nov", 30, 11}, {"Dec", 31, 12}, }; int main(void) { char monthname[LEN]; int total = 0; int i; _Bool whether; printf("Enter the name of the month (first three letters) : "); fgets(monthname, LEN, stdin); for(i = 0; i < LEN; i++) { if(0 == i) monthname[i] = toupper(monthname[i]); else monthname[i] = tolower(monthname[i]); } for(i = 0; i < 12; i++) { total += months[i].days; //進來先加一遍,月份是不是對另說 if(strcmp(monthname, months[i].name) == 0) { whether = true; break; } } if(whether) printf("The total days of these months before your month are %d days.\n",total); else printf("Your input is undefined.\n"); return 0; }
2.
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdbool.h> #define LEN 4 struct month{ char name[LEN]; int days; int monumb; }; struct month months[12] = { {"Jan", 31, 1}, {"Feb", 28, 2}, {"Mar", 31, 3}, {"Apr", 30, 4}, {"May", 31, 5}, {"Jun", 30, 6}, {"Jul", 31, 7}, {"Aug", 31, 8}, {"Sep", 30, 9}, {"Oct", 31, 10}, {"Nov", 30, 11}, {"Dec", 31, 12}, }; int main(void) { char monthname[LEN]; int total = 0; int year; int monthnum; int date; int ThisMonth; int i; _Bool whether; printf("Enter the year : "); //讀取使用者輸入的年份,並判斷是否閏年 scanf("%d", &year); if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) //判斷閏年,並改變二月份的天數 months[1].days = 29; printf("Enter the name of the month (first three letters) or the number of the month : "); //讀取使用者輸入的月份數,先計算到這個月月末的天數總和 if(scanf("%d", &monthnum) == 1) { for(i = 0; i < monthnum; i++) { total += months[i].days; ThisMonth = months[i].days; } } //先判斷是不是數字,如果是就讀取,因為整型不能接受字串,而字串可以接受單個輸入數字 else if(scanf("%s", monthname) == 1) { for(i = 0; i < LEN; i++) { if(0 == i) monthname[i] = toupper(monthname[i]); else monthname[i] = tolower(monthname[i]); } for(i = 0; i < 12; i++) { total += months[i].days; //進來先加一遍,月份是不是對另說 if(strcmp(monthname, months[i].name) == 0) { whether = true; ThisMonth = months[i].days; i = i + 1; break; } } if(!whether) { printf("Your input month is undefined.\n"); return 1; } } printf("Enter the date : "); //讀取使用者輸入的日期,進行最後的計算 if(scanf("%d", &date) == 1 && date <= months[i-1].days && date >= 1) { total = total - (ThisMonth - date); printf("The total days of these months before your date are %d days.\n",total); //輸出最終天數 } else printf("Your input is undefined.\n"); return 0; }
3.
#include <stdio.h> #include <string.h> char *s_gets(char *st, int n); #define MAXTITL 40 #define MAXAUTL 40 #define MAXBKS 100 struct book { char title[MAXTITL]; char author[MAXAUTL]; float value; }; int main(void) { struct book library[MAXBKS]; int count = 0; int index; printf("Please enter the book title.\n"); printf("Please [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; if (count < MAXBKS) printf("Enter the next title.\n"); } if (count > 0) { printf("Here is the list of your books :\n"); printf("Array by original :\n"); //原始排序 for (index = 0; index < count; index++) printf("%s by %s: $%.2f\n", library[index].title, library[index].author, library[index].value); printf("\n"); printf("Array by title :\n"); //按標題排序 for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { struct book temp; if (strcmp(library[i].title, library[j].title) > 0) { temp = library[i]; library[i] = library[j]; library[j] = temp; } } } for (index = 0; index < count; index++) printf("%s by %s: $%.2f\n", library[index].title, library[index].author, library[index].value); printf("\n"); printf("Array by value :\n"); //按價格排序 for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { struct book temp; if (library[i].value > library[j].value) { temp = library[i]; library[i] = library[j]; library[j] = temp; } } } for (index = 0; index < count; index++) printf("%s by %s: $%.2f\n", library[index].title, library[index].author, library[index].value); printf("\n"); } 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'); if(find) *find = '\0'; else while(getchar() != '\n') continue; } return ret_val; }
4.
#include <stdio.h>
#define SECLEN 64
#define NAMELEN 32
struct name_info {
char lname[NAMELEN]; //名
char mname[NAMELEN]; //中間名
char fname[NAMELEN]; //姓
};
struct info {
char sec_num[SECLEN];
struct name_info name;
};
void print(struct info informa[5]);
void p_print(struct info *);
int main(void)
{
struct info * pt;
struct info information[5] = {
{"302039823", {"Dribble", "Flossie", "M"}},
{"302039824", {"Owen", "", "Michale"}},
{"302039825", {"Jone", "Jimmy", "J"}},
{"302039826", {"Bob", "", "Mary"}},
{"302039827", {"Jack", "And", "Him"}}
}; //建立並初始化一個內含五個元素的結構陣列
pt = information;
print(information);
puts("*********************");
puts("The other method :");
p_print(pt);
return 0;
}
void print(struct info informa[])
{
int count;
for(count = 0; count < 5; count++)
{
if(informa[count].name.mname[0] == '\0')
printf("%s, %s -- %s\n", informa[count].name.fname, informa[count].name.lname, informa[count].sec_num);
else
printf("%s, %s %c. -- %s\n", informa[count].name.fname, informa[count].name.lname, informa[count].name.mname[0], informa[count].sec_num);
}
}
void p_print(struct info * pst)
{
int i = 0;
while(i < 5)
{
if (pst->name.mname[0] == '\0')
printf("%s, %s -- %s\n", pst->name.fname, pst->name.lname, pst->sec_num);
else
printf("%s, %s %c. -- %s\n", pst->name.fname, pst->name.lname, pst->name.mname[0], pst->sec_num);
i++;
pst++;
}
}
5.
#include <stdio.h>
#define NAMELEN 32
#define CSIZE 4
struct name{
char fname[NAMELEN];
char lname[NAMELEN];
};
struct student{
struct name s_name;
float grade[3];
float average;
};
int main(void)
{
int i;
float total;
float class_average;
struct student stdu[CSIZE];
for(i = 0; i < CSIZE; i++)
{
printf("Enter the first name of the student : ");
scanf("%s", stdu[i].s_name.fname);
getchar();
printf("Enter the last name of the student : ");
scanf("%s", stdu[i].s_name.lname);
getchar();
for(int j = 0; j < 3; j++)
{
printf("Enter the %dst score of the student : ", j);
scanf("%f", &stdu[i].grade[j]);
getchar();
}
}
for(i = 0; i < CSIZE; i++)
{
total = 0;
for(int j = 0; j < 3; j++)
{
total += stdu[i].grade[j];
}
stdu[i].average = total / 3;
}
for(i = 0; i < CSIZE; i++)
{
printf("Student: %s %s, grade: %.2lf, %.2lf, %.2lf, average: %.2lf\n", stdu[i].s_name.fname, stdu[i].s_name.lname,
stdu[i].grade[0], stdu[i].grade[1], stdu[i].grade[2], stdu[i].average);
}
for(i = 0, total = 0; i < CSIZE; i++)
{
total += stdu[i].average;
}
class_average = total / CSIZE;
printf("The average score of the class is %.2f", class_average);
return 0;
}
6.看不懂題
7.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXTITL 41
#define MAXAUTL 31
#define MAXBKS 10
char * s_gets(char * st, int n);
struct book{
char title[MAXTITL];
char author[MAXAUTL];
float value;
int delete;
};
int main(void)
{
struct book library[MAXBKS] = { {'\0', '\0', 0.0, 0} };
int count = 0;
int index, filecount;
FILE *pbooks;
int size = sizeof(struct book);
if ((pbooks = fopen("book.dat", "r+b")) == NULL)
{
fputs("Can't open book.dat file\n", stderr);
exit(-1);
}
rewind(pbooks); //定位至檔案開始處
while(count < MAXBKS && fread(&library[count], size, 1, pbooks) == 1) //fread返回值為1表示讀取成功,不成功則返回0
{
if(count == 0)
puts("current contents of book.dat");
printf("%s by %s : $%.2f\n",library[count].title, library[count].author, library[count].value); //顯示檔案資訊
count++;
}
filecount = count; //標記原本檔案中所含的結構個數
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.");
while(count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL && library[count].title[0] != '\0')
{
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;
if(count < MAXBKS)
puts("Enter the next title.");
}
if(count > 0)
{
puts("Here is the list of your books : ");
for(index = 0; index < count; index++)
printf("%s by %s : $%.2f\n", library[index].title, library[index].author, library[index].value);
fwrite(&library[filecount], size, count - filecount, pbooks); //已有filecount個檔案已存在,則從第filecount+1個檔案的地址開始寫入,且每個單元大小為size,一共寫入count-filecount個單元到pbooks指定的檔案中
}
else
puts("No books? Too bad.\n");
while(1)
{
int choice;
char ch;
printf("Which book do you want to delete or modify (-1 to quit)?\n");
scanf("%d", &choice);
getchar();
if(choice == -1)
{
break;
}
printf("[D]elete or [M]odify?\n");
scanf("%c",&ch);
getchar();
ch = toupper(ch);
if(ch == 'D')
{
library[choice-1].delete = 1;
printf("The information has been deleted.\n");
}
if(ch == 'M')
{
printf("Please enter the book title.\n");
s_gets(library[choice-1].title, MAXTITL);
printf("Now enter the author.\n");
s_gets(library[choice-1].author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library[choice-1].value);
while (getchar() != '\n')
{
continue;
}
}
}
fclose(pbooks);
if((pbooks = fopen("book.dat", "w")) == NULL)
{
fputs("Can't open the file book.dat\n",stderr);
exit(-1);
}
for(int i = 0; i < count; i++)
{
if(library[i].delete != 1)
fwrite(&library[i], size, 1, pbooks); //檔案清空了,但是資料流還在記憶體中,可以再向檔案中寫入
}
puts("Done.\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;
}
8.
#include <stdio.h>
#include <string.h>
#define LEN 64
struct information{
char seat_num[LEN];
int sold;
char fname[LEN];
char lname[LEN];
}; //sold表示票有沒有售出,售出為1,未售出為0
void ShowEmptySeats(struct information *);
void ShowList(struct information *);
void ShowAlphabetical(struct information *);
void AssignSeat(struct information *);
void DeleteSeat(struct information *);
int main(void)
{
struct information info[12] = {{"", 0, "", ""}};
char choice;
while(1)
{
printf("To choose a function, enter its letter lable:\n");
printf("a) Show number of empty seats\n");
printf("b) Show list of empty seats\n");
printf("c) Show alphabetical list of seats\n");
printf("d) Assign a customer to a seat assignment\n");
printf("e) Delete a seat assignment\n");
printf("f) Quit\n");
scanf("%c", &choice);
getchar();
if(choice == 'f')
break;
switch (choice)
{
case 'a':
ShowEmptySeats(info);
break;
case 'b':
ShowList(info);
break;
case 'c':
ShowAlphabetical(info);
break;
case 'd':
AssignSeat(info);
break;
case 'e':
DeleteSeat(info);
break;
default:
break;
}
}
return 0;
}
void ShowEmptySeats(struct information * pt)
{
int i;
int seats = 0;
for(i = 0; i < 12; i++)
{
if((*pt).sold == 0)
{
seats++;
}
pt++;
}
printf("Flight still gets %d empty seats.\n", seats);
}
void ShowList(struct information * pt)
{
int i;
for(i = 0; i < 12; i++)
{
if((*pt).sold == 0)
{
printf("Flight %d still gets empty seats.\n", i);
}
pt++;
}
}
void ShowAlphabetical(struct information * pt) //應該是按照名字的順序排序
{
struct information temp;
int i;
for(i = 0; i < 12; i++)
{
if(strcmp(pt[i].fname, pt[i+1].fname) > 0)
{
temp = pt[i];
pt[i] = pt[i+1];
pt[i+1] = temp;
}
}
for(i = 0; i < 12; i++)
{
printf("%s %s : %s\n", pt[i].fname, pt[i].lname, pt[i].seat_num);
}
}
void AssignSeat(struct information * pt)
{
int i;
printf("Choose a airplane :");
scanf("%d", &i);
printf("Enter the first name of the customer :");
scanf("%s", pt[i].fname);
printf("Enter the last name of the customer :");
scanf("%s", pt[i].lname);
printf("Choose a seat :");
scanf("%s", pt[i].seat_num);
}
void DeleteSeat(struct information * pt)
{
char num[LEN];
int i;
struct information temp = {"", 0, "", ""};
int whether = 0;
printf("Enter the seat number you want to delete :");
scanf("%s", num);
for(i = 0; i < 12; i++)
{
if(strcmp(pt[i].seat_num, num) == 0)
{
pt[i] = temp;
whether = 1;
}
}
if(whether)
{
printf("%d seat has been deleted.\n", i);
}
else
{
printf("No seat has been found.\n");
}
}
9.
#include <stdio.h>
#include <string.h>
#define LEN 64
struct information{
char seat_num[LEN];
int sold;
char fname[LEN];
char lname[LEN];
}; //sold表示票有沒有售出,售出為1,未售出為0
void ShowEmptySeats(struct information *);
void ShowList(struct information *);
void ShowAlphabetical(struct information *);
void AssignSeat(struct information *);
void DeleteSeat(struct information *);
int main(void)
{
struct information info[4][12] = {{{"", 0, "", ""}}};
char choice;
int flight;
int num;
printf("Choose a flight 102 311 444 or 519 (0 to quit): ");
while(1)
{
scanf("%d", &flight);
getchar(); //接收換行符
if(flight == 0)
break;
if (flight == 102 || flight == 311 || flight == 444 || flight == 519)
{
if(flight == 102)
num = 1;
if(flight == 311)
num = 2;
if(flight == 444)
num = 3;
if(flight == 519)
num = 4;
while (1)
{
printf("To choose a function, enter its letter lable:\n");
printf("a) Show number of empty seats\n");
printf("b) Show list of empty seats\n");
printf("c) Show alphabetical list of seats\n");
printf("d) Assign a customer to a seat assignment\n");
printf("e) Delete a seat assignment\n");
printf("f) Back to the upper menu\n");
scanf("%c", &choice);
getchar();
if (choice == 'f')
break;
switch (choice) {
case 'a':
ShowEmptySeats(info[num]);
break;
case 'b':
ShowList(info[num]);
break;
case 'c':
ShowAlphabetical(info[num]);
break;
case 'd':
AssignSeat(info[num]);
break;
case 'e':
DeleteSeat(info[num]);
break;
default:
break;
}
} //內層while結束處
printf("Choose another flight (0 to quit) : ");
scanf("%d", &flight);
getchar();
if(flight == 0)
break;
}
else
{
printf("No flight has been found, please choose again (102 311 444 or 519) : ");
continue;
}
}
return 0;
}
void ShowEmptySeats(struct information * pt)
{
int i;
int seats = 0;
for(i = 0; i < 12; i++)
{
if((*pt).sold == 0)
{
seats++;
}
pt++;
}
printf("Flight still gets %d empty seats.\n", seats);
}
void ShowList(struct information * pt)
{
int i;
for(i = 0; i < 12; i++)
{
if((*pt).sold == 0)
{
printf("Flight %d still gets empty seats.\n", i);
}
pt++;
}
}
void ShowAlphabetical(struct information * pt) //應該是按照名字的順序排序
{
struct information temp;
int i;
for(i = 0; i < 12; i++)
{
if(strcmp(pt[i].fname, pt[i+1].fname) > 0)
{
temp = pt[i];
pt[i] = pt[i+1];
pt[i+1] = temp;
}
}
for(i = 0; i < 12; i++)
{
printf("%s %s : %s\n", pt[i].fname, pt[i].lname, pt[i].seat_num);
}
}
void AssignSeat(struct information * pt)
{
int i;
printf("Choose a airplane :");
scanf("%d", &i);
printf("Enter the first name of the customer :");
scanf("%s", pt[i].fname);
printf("Enter the last name of the customer :");
scanf("%s", pt[i].lname);
printf("Choose a seat :");
scanf("%s", pt[i].seat_num);
}
void DeleteSeat(struct information * pt)
{
char num[LEN];
int i;
struct information temp = {"", 0, "", ""};
int whether = 0;
printf("Enter the seat number you want to delete :");
scanf("%s", num);
for(i = 0; i < 12; i++)
{
if(strcmp(pt[i].seat_num, num) == 0)
{
pt[i] = temp;
whether = 1;
}
}
if(whether)
{
printf("%d seat has been deleted.\n", i);
}
else
{
printf("No seat has been found.\n");
}
}
10.
#include <stdio.h>
#include <string.h>
int SumUp(int, int);
int main(void)
{
int result1, result2;
int (*pt)(int, int); //申明一個指向SumUp函式的指標
pt = SumUp;
result1 = pt(5,6);
printf("%The sum of 5 and 6 is %d\n", result1);
result2 = (*pt)(3,4);
printf("The sum of 3 and 4 is %d", result2);
return 0;
}
int SumUp(int a, int b)
{
return a+b;
}
11.
#include <stdio.h>
double sqrt(double);
void transform(double *, double *, int, double (*fun)(double));
int main(void)
{
double source[5] = {2.2,4,5,6.3,0.1};
double target[5];
transform(source, target, 5, sqrt);
for(int i = 0; i < 5; i++)
{
printf("Target[%d] = %.4f\n", i, target[i]);
}
return 0;
}
double sqrt(double x)
{
return (x * x);
}
void transform(double * sou, double * tar, int n, double (*fun)(double))
{
int i;
for(i = 0; i < n; i++)
{
tar[i] = fun(sou[i]);
}
}