目录
structure { char itable; int num[20]; char * togs }
3.设计一个结构模板储存一个月份名、该月份名的3个字母缩写、该月的天数以及月份号
4.定义一个数组,内含12个结构(第3题的结构类型)并初始化为一个年份(非闰年)
5.编写一个函数,用户提供月份号,该函数就返回一年中到该月为止(包括该月)的总天数。假设在所有函数的外部声明了第3题的结构模版和一个该类型结构的数组
a.假设有下面的 typedef,声明一个内含 10 个指定结构的数组。然后,单独给成员赋值(或等价字符串),使第3个元素表示一个焦距长度有500mm,孔径为f/2.0的Remarkata镜头。
b.重写a,在声明中使用一个待指定初始化器的初始化列表,而不是对每个成员单独赋值
b.如何用结构表示法(两种方法)表示"Gwolkapwolk"?
a.用willie标识符标识willie结构的born成员。
c.调用scanf()读入一个用willie标识符标识的born成员的值。
d.调用scanf()读入一个用pt标识符标识的born成员的值。
e.调用scanf()读入一个用willie标识符标识的name成员中lname成员的值。
f.调用scanf()读入一个用pt标识符标识的name成员中lname成员的值。
g.构造一个标识符,标识willie结构变量所表示的姓名中名的第3个字母(英文的名在前)。
h.构造一个表达式,表示willie结构变量所表示的名和姓中的字母总数。
9.定义一个结构模板以储存这些项:汽车名、马力、EPA(美国环保局)城市交通MPG(每加仑燃料行驶的英里数)评级、轴距和出厂年份。使用car作为该模版的标记。
a.设计一个函数,接受struct gas类型的参数。假设传入的结构包含distance和gals信息。该函数为mpg成员计算正确的值,并把值返回该结构。
b.设计一个函数,接受struct gas类型的参数。假设传入的结构包含distance和gals信息。该函数为mpg成员计算正确的值,并把该值赋给合适的成员。
11.声明一个标记为choices的枚举,把枚举常量no、yes和maybe分别设置为0、1、2
12.声明一个指向函数的指针,该函数返回指向char的指针,接受一个指向char的指针和一个char类型的值
13.声明4个函数,并初始化一个指向这些函数的指针数组。每个函数都接受两个double类型的参数,返回double类型的值。另外,用两种方法使用该数组调用带10.0和2.5实参的第2个函数
1.重新编写复习题 5,用月份名的拼写代替月份号(别忘了使用 strcmp())。在一个简单的程序中测试该函数
2.编写一个函数,提示用户输入日、月和年。月份可以是月份号、月份名或月份名缩写。然后该程序应返回一年中到用户指定日子(包括这一天)的总天数
3.修改程序清单 14.2 中的图书目录程序,使其按照输入图书的顺序输出图书的信息,然后按照标题字母的声明输出图书的信息,最后按照价格的升序输出图书的信息。
a.第1个成员是社会保险号,第2个成员是一个有3个成员的结构,第1个成员代表名,第2个成员代表中间名,第3个成员表示姓。创建并初始化一个内含5个该类型结构的数组。该程序以下面的格式打印数据:
Dribble, Flossie M.–– 302039823 如果有中间名,只打印它的第1个字母,后面加一个点(.);如果没有中间名,则不用打印点。编写一个程序进行打印,把结构数组传递给这个函数。
a.外部定义一个有两个成员的结构模板name:一个字符串储存名,一个字符串储存姓。
b.外部定义一个有3个成员的结构模板student:一个name类型的结构,一个grade数组储存3个浮点型分数,一个变量储存3个分数平均数。
c.在main()函数中声明一个内含CSIZE(CSIZE = 4)个student类型结构的数组,并初始化这些结构的名字部分。用函数执行g、e、f和g中描述的任务。
d.以交互的方式获取每个学生的成绩,提示用户输入学生的姓名和分数。把分数储存到grade数组相应的结构中。可以在main()函数或其他函数中用循环来完成。
6.一个文本文件中保存着一个垒球队的信息。每行数据都是这样排列:
世界棒球统计与之相关。例如,一次走垒和触垒中的失误不计入上场次数,但是可能产生一个RBI。但是该程序要做的是像下面描述的一样读取和处理数据文件,不会关心数据的实际含义。
8.巨人航空公司的机群由 12 个座位的飞机组成。它每天飞行一个航班。根据下面的要求,编写一个座位预订程序。
a.该程序使用一个内含 12 个结构的数组。每个结构中包括:一个成员表示座位编号、一个成员表示座位是否已被预订、一个成员表示预订人的名、一个成员表示预订人的姓。
c.该程序能成功执行上面给出的菜单。选择d)和e)要提示用户进行额外输入,每个选项都能让用户中止输入。
10.编写一个程序,通过一个函数指针数组实现菜单。例如,选择菜单中的 a,将激活由该数组第 1个元素指向的函数
transform(source, target, 100, sin);
复习题
1.下面的结构模板有什么问题:
structure { char itable; int num[20]; char * togs }
- 关键词是struct
- 花括号后面缺少分号
2.下面是程序的一部分,输出是什么
#include <stdio.h>
struct house
{
float sqft;
int rooms;
int stories;
char address[40];
};
int main(void)
{
struct house fruzt = {1560.0, 6, 1, "22 Spiffo Road"};
struct house *sign;
sign = &fruzt;
printf("%d %d\n", fruzt.rooms, sign->stories);
printf("%s \n", fruzt.address);
printf("%c %c\n", sign->address[3], fruzt.address[4]);
return 0;
}
6 1
22 Spiffo Road
S p
3.设计一个结构模板储存一个月份名、该月份名的3个字母缩写、该月的天数以及月份号
struct month
{
char name[15];
char ab[4];//留一个位置给\0
int days;
int num;
};
4.定义一个数组,内含12个结构(第3题的结构类型)并初始化为一个年份(非闰年)
struct month list[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
}
};
5.编写一个函数,用户提供月份号,该函数就返回一年中到该月为止(包括该月)的总天数。假设在所有函数的外部声明了第3题的结构模版和一个该类型结构的数组
int DAYS(int n)
{
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += list[i].days;
}
return sum;
}
6.
a.假设有下面的 typedef,声明一个内含 10 个指定结构的数组。然后,单独给成员赋值(或等价字符串),使第3个元素表示一个焦距长度有500mm,孔径为f/2.0的Remarkata镜头。
LENS list[10];
list[2].foclen = 500;
list[2].fstop = 2.0;
strcpy(list[2].brand, "Remarkata");
b.重写a,在声明中使用一个待指定初始化器的初始化列表,而不是对每个成员单独赋值
LENS list[10] = {[3] = {500, 2.0, "Remarkata"}};
7.考虑下面程序片段:
struct name {
char first[20];
char last[20];
};
struct bem {
int limbs;
struct name title;
char type[30];
};
struct bem * pb;
struct bem deb = { 6, { "Berbnazel", "Gwolkapwolk" }, "Arcturan" };
pb = &deb;
a.下面的语句分别打印什么?
printf("%d\n", deb.limbs);
printf("%s\n", pb->type);
printf("%s\n", pb->type + 2);
6
Arcturan
cturan
b.如何用结构表示法(两种方法)表示"Gwolkapwolk"?
deb.title.last
pb->title.last
c.编写一个函数,以bem结构的地址作为参数,并以下面的形式输出结构的内容(假定结构模板在一个名为starfolk.h的头文件中): Berbnazel Gwolkapwolk is a 6-limbed Arcturan.
void Print(const struct bem *a)
{
printf("%s %s is a %d-limbed %s\n", a->title.first, a->title.last, a->limbs, a->type);
}
8.考虑下面的声明:
struct fullname
{
char fname[20];
char lname[20];
};
struct bard
{
struct fullname name;
int born;
int died;
};
struct bard willie;
struct bard *pt = &willie;
a.用willie标识符标识willie结构的born成员。
willie.born
b.用pt标识符标识willie结构的born成员。
pt->born
c.调用scanf()读入一个用willie标识符标识的born成员的值。
scanf("%d", willie.born);
d.调用scanf()读入一个用pt标识符标识的born成员的值。
scanf("%d", pt->born);
e.调用scanf()读入一个用willie标识符标识的name成员中lname成员的值。
scanf("%s", willie.name.lname);
f.调用scanf()读入一个用pt标识符标识的name成员中lname成员的值。
scanf("%s", pt->name.lname);
g.构造一个标识符,标识willie结构变量所表示的姓名中名的第3个字母(英文的名在前)。
willie.name.fname[2]
h.构造一个表达式,表示willie结构变量所表示的名和姓中的字母总数。
strlen(willie.name.fname) + strlen(willie.name.lname)
9.定义一个结构模板以储存这些项:汽车名、马力、EPA(美国环保局)城市交通MPG(每加仑燃料行驶的英里数)评级、轴距和出厂年份。使用car作为该模版的标记。
struct car
{
char name[30];
float horsepow;
float MPG;
float wbase;
int year;
};
10.假设有如下结构:
struct gas
{
float distance;
float gals;
float mpg;
};
a.设计一个函数,接受struct gas类型的参数。假设传入的结构包含distance和gals信息。该函数为mpg成员计算正确的值,并把值返回该结构。
struct gas getmpg(struct gas a)
{
if(a.gals > 0)
{
a.mpg = a.distance / a.gals;
}
else
{
a.mpg = -1.0;
}
return a;
}
b.设计一个函数,接受struct gas类型的参数。假设传入的结构包含distance和gals信息。该函数为mpg成员计算正确的值,并把该值赋给合适的成员。
struct gas getmpg(struct gas *a)
{
if(a->gals > 0)
{
a->mpg = a->distance / a->gals;
}
else
{
a->mpg = -1.0;
}
}
11.声明一个标记为choices的枚举,把枚举常量no、yes和maybe分别设置为0、1、2
enum choices = {no, yes, maybe};
12.声明一个指向函数的指针,该函数返回指向char的指针,接受一个指向char的指针和一个char类型的值
char* (*func)(char*, char);
13.声明4个函数,并初始化一个指向这些函数的指针数组。每个函数都接受两个double类型的参数,返回double类型的值。另外,用两种方法使用该数组调用带10.0和2.5实参的第2个函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double f1(double, double);
double f2(double, double);
double f3(double, double);
double f4(double, double);
double (*func[4])(double, double) = {f1, f2, f3, f4};
int main(void)
{
(*func[1])(10, 2.5);
func[1](10, 2.5);
return 0;
}
编程练习
1.重新编写复习题 5,用月份名的拼写代替月份号(别忘了使用 strcmp())。在一个简单的程序中测试该函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct month
{
char name[15];
char ab[4];//留一个位置给\0
int days;
int num;
}list[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 a[])
{
int sum = 0;
for (int i = 0; i < 12; ++i) {
sum += list[i].days;
if(!strcmp(list[i].name, a))
{
return sum;
}
}
return sum;
}
int main(void)
{
printf("%d\n", days("July"));
printf("%d\n", days("November"));
return 0;
}
2.编写一个函数,提示用户输入日、月和年。月份可以是月份号、月份名或月份名缩写。然后该程序应返回一年中到用户指定日子(包括这一天)的总天数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct month
{
char ab[4];
int days;
int num;
}list[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)
{
int year, month, day, flag = 0;
char mon[15];
char mid[4];
int sum = 0;
printf("Input the year num:");
scanf("%d", &year);
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
list[1].days = 29;
}
printf("Inpur the month:");
if(scanf("%d", &month) == 1) {}
else if(scanf("%s", mon) == 1)
{
mid[0] = toupper(mon[0]);
mid[1] = toupper(mon[1]);
mid[2] = toupper(mon[2]);
mid[3] = '\0';
for (int i = 0; i < 12; ++i) {
if(!strcmp(mid, list[i].ab))
{
month = i + 1;
}
}
}
printf("Input the day:");
scanf("%d", &day);
for (int j = 0; j < month - 1; ++j) {
sum += list[j].days;
}
sum += day;
printf("%d days in all\n", sum);
return 0;
}
3.修改程序清单 14.2 中的图书目录程序,使其按照输入图书的顺序输出图书的信息,然后按照标题字母的声明输出图书的信息,最后按照价格的升序输出图书的信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * s_gets(char * st, int n);
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 100 /* 书籍的最大数量 */
struct book /* 简历 book 模板 */
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
int (* funcp)(const void*, const void*);
int sortByAscii(const void* a, const void* b)//格式要符合qsort,函数内再转换
{
if(strcmp(((struct book*)a)->title, ((struct book*)b)->title) > 0)
{
return 0;
}
return 1;
}
int sortByPrice(const void* a,const void* b)
{
if(((struct book*)a)->value < ((struct book*)b)->value)
{
return 0;
}
return 1;
}
int main(void)
{
struct book library[MAXBKS]; /* book 类型结构的数组 */
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; /* 清理输入行*/
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);
printf("Here is the list sorted by ASCII of your books:\n");
funcp = sortByAscii;
qsort(library, count == MAXBKS ? MAXBKS - 1 : count, sizeof(library[0]), funcp);//第二个参数应该用数组当前写入了数据长度,不然会是一堆乱码
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 sorted by price of your books:\n");
funcp = sortByPrice;
qsort(library, count == MAXBKS ? MAXBKS - 1 : count, sizeof(library[0]), funcp);
for (index = 0; index < count; index++)
printf("%s by %s: $%.2f\n", library[index].title,library[index].author, library[index].value);
}
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) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else while (getchar() != '\n')
continue; // 处理输入行中剩余的字符
}
return ret_val;
}