《C Primer Plus(第五版)中文版》第14章第1至11题

/*
 *1.重做复习题3,但用月份名的拼写代替月份号(别忘记了可以使用strcmp())。
 *2.编写一个程序,请求用户键入日,月,年,月份可以月份号、月份名或是月份缩写,然后
 *程序返回一年中给定的日子(包括这一天)的总天数。
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
void delffush();// 删除多余的缓冲区字符
int mtoi(char *s); //将月份转换为数字编号
char * stolower(char *s); //将字符串转换为小写
int main(int argc, char * argv[]) {
	enum NUMBER{January=1,February,March,April,May,June,July,August,September,October,November,December};     //月份号
	struct MONTH{
		char name[20];  //月份名称
		char xname[4];  //月份缩写
		int days;       //本月天数
		enum NUMBER numbers; //月份号
		int total;      //一年中到这一月的总天数
	};
	struct MONTH mymonth[12] = {
		{"January", "Jan", 31, January,0},
		{"February", "Feb", 28, February,31},
		{"March", "Mar", 31, March,59},
		{"April", "Apr", 30, April,90},
		{"May", "May", 31, May,120},
		{"June", "Jun", 30, June,151},
		{"July", "Jul", 31, July,181},
		{"August", "Aug", 31, August,212},
		{"September","Sep", 30,September,243},
		{"October", "Oct", 31, October,273},
		{"November", "Nov", 30, November,304},
		{"December", "Dec", 31, December,334}
	};

	char youmonth[20];
	int years = 0;
	int day = 0;
	printf("请输入指定日期的年份:");
	while(scanf("%d",&years) != 1 || years <= 2000){
		printf("输入错误,请重新输入,注意格式\n");
		printf("请输入指定日期的年份:");
		delffush();
	}
	delffush();
	printf("请输入指定日期的月份:");
	while(scanf("%s",youmonth) == 0){
		printf("输入错误,请重新输入,注意格式\n");
		printf("请输入指定日期的月份:");
	}
	delffush();
	printf("请输入指定日期的日号:");
	while(scanf("%d",&day) != 1 || day > 31){
			printf("输入错误,请重新输入,注意格式\n");
			printf("请输入指定日期的日号:");
			delffush();
	}
	printf("%d,%s,%d\n",years,youmonth,day);
	printf("%d年%d月%d日,总天数为:%d",years,mtoi(youmonth),day,mymonth[mtoi(youmonth)-1].total+day);
	return 0;
}
void delffush(){
	char ch;
	while((ch = getchar()) != '\n'){
		continue;
		}
}
int mtoi(char *s){
	char t[12][20] = {
		"January",
		"February",
	    "March",
        "April",
		"May",
	    "June",
	    "July",
		"August",
        "September",
		"October",
        "November",
		"December"
	};
	int m;
	char *n="0123456789";
	if(strchr(n,s[0]) != NULL){
		m = atoi(s);
		return m;
	}else{
		for(int i=0;i<12;i++){
			if(strncmp(stolower(s),stolower(t[i]),3) == 0)
				return i+1;
		}
	}
	return 0;
}
char * stolower(char *s){
	for(int i= 0;i<strlen(s);i++){
		s[i]=tolower(s[i]);
	}
	return s;
}
/*
 *3.修改程序清单14.2中书目列表程序,使它首先输入的顺序输出图书的描述,然后按照标题的字符升序输出图书的描述,最后按照value值的升力序输出图书描述
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS  100
void delffush();// 删除多余的缓冲区字符
struct book{
	char title[MAXTITL];
	char author[MAXAUTL];
	float value;
};

void stsrt(struct book *book[],int num); //按照标题升序排列
void valsrt(struct book *book[],int num); //按照价值升序排列
void show(struct book *book[],int num); //显示结构体
int main(void) {
	struct book library[MAXBKS];
	struct book *p1[MAXBKS];
	struct book *p2[MAXBKS];
	int count = 0;
	int index;
	printf("Please enter the book title.\n");
	printf("Prease [enter] at ther start of aline 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);
		delffush();
		if(count < MAXBKS)
			printf("Enter the next book title.\n");
	}
	for(int i=0;i<MAXBKS;i++){
		p1[i] = &library[i];
		p2[i] = &library[i];
	}
	printf("按照输入顺序显法:\n");
	show(p1,count);
	printf("按照value价值升序排序显示:\n");
	valsrt(p1,count);
	show(p1,count);
	printf("按照标题字母升序排序显示:\n");
	stsrt(p2,count);
	show(p2,count);
	return 0;
}
void delffush(){
    char ch;
    while((ch = getchar()) != '\n'){
        continue;
    }
}
void show(struct book *book[],int num){
	if(num >0){
			printf("---------------------------:\n");
			for(int index=0;index<num;index++){
				printf("%s by %s: $%.2f\n",book[index]->title,book[index]->author,book[index]->value);
			}
		}else{
			printf("No books?Too bad.\n");
		}
}
void valsrt(struct book *book[],int num){
	struct book *temp;
		int top,seek;
		for(top=0;top<num-1;top++){
			for(seek = top;seek<num;seek++){
				if(book[top]->value > book[seek]->value){
					temp = book[top];
					book[top] = book[seek];
					book[seek] = temp;
				}
			}
		}
}
void stsrt(struct book *book[],int num){
	struct book *temp;
	int top,seek;
	for(top=0;top<num-1;top++){
		for(seek = top;seek<num;seek++){
			if(strcmp(book[top]->title,book[seek]->title) >0){
				temp = book[top];
				book[top] = book[seek];
				book[seek] = temp;
			}
		}
	}
}

/*
 *4.编写一个程序,按照下列要求,创建一个含有两个成员的结构模板
 *a.第一个成员是社会保障号,第二个成员是一个含有三个成员的结构,它的第一个成员是名,第二个成员
 *是名和姓中间的名字,最后第一个成员是姓,创创建并初始化一个含有5个此类结构的数组,程序以下列
 *形式输出数据:
 *Driblle,Flossie M. -302039823
 *名和姓中间名字只输出了它的第一个字母,后面加了一个句点。如果姓名中间名字是空,那么它的第一个字母
 *和句点都不会输出,写一个函数实现输出的,把结构传递给这个函数。
 *b.修改a部份,传递结构的值,而不是结构的地址
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct fullname {
	char xing[20];
	char center[20];
	char last[20];
} NAME;
typedef struct person {
	int number;
	NAME name;
} PERSON;

void show(PERSON ff[], int n);
void vshow(PERSON ff); //b的实现
int main(void) {
	PERSON ff[5] = { { 302039823, { "Dribble", "Mama", "Flossie" } }, {
			402039825, { "Jacktss", "Ktsds", "Nacktss" } }, { 222039821, {
			"Calliy", "Dack", "Dtsd" } }, { 121344434,
			{ "Jactstd", "", "Wolsds" } }, { 893232535,
			{ "jing", "Xiao", "Ning" } }, };
	show(ff, 5);
	printf("伟递结构的值,而不是地址\n");
	for (int i = 0; i < 5; i++) {
		vshow(ff[i]);
	}
	return 0;
}
void show(PERSON ff[], int n) {
	for (int i = 0; i < n; i++) {
		if (ff[i].name.center[0] != '\0') {
			printf("%s,%s %c. - %d\n", ff[i].name.xing, ff[i].name.xing,
					ff[i].name.center[0], ff[i].number);
		} else {
			printf("%s,%s - %d\n", ff[i].name.xing, ff[i].name.xing,
					ff[i].number);
		}
	}
}

void vshow(PERSON ff) {
	if (ff.name.center[0] != '\0') {
		printf("%s,%s %c. - %d\n", ff.name.xing, ff.name.xing,
				ff.name.center[0], ff.number);
	} else {
		printf("%s,%s - %d\n", ff.name.xing, ff.name.xing, ff.number);
	}
}
/*
 * 5.写一个程序,满足下列要求
 * a.外部定义一个name结构模板,它含有两个成员:一个字符串用于存放名字,另一个字符串用于存放姓氏
 * b.外部定义一个student结构模板,它含有三个成员:一个name结构,一个存放3个浮点数分数的grade数组,以及一个
 * 存放这3个分数的平均分的变量
 * c.使main()函数声明一个具有CSIZE(CSIZE=4)个student结构的数组,并随意初始化这构的名字部份,使用d,e,f,g
 * 描述的任务。
 * d.请求用户输入学生的姓名和分数,以交互经获取每个学生的成绩,将分数放到相应结构的grade数组成员中,您可以
 * 自主选择在main()一个函数中实现这个循环。
 * e.为每个结构计算平均分,并把这个值赋值给合适的成员
 * f.输出每个结构的信息
 * g.输出结构的每个数值成员的班级平均分。
 */
#include <stdio.h>
#include <string.h>

#define CSIZE 4
struct NAME{
	char firstName[20];
	char secondName[20];
};
struct STUDENT{
	struct NAME name;
	float grade[3];
	float ave;
};
void getgrade(struct STUDENT p[],int num);
void getave(struct STUDENT p[],int num);
int main(void){
	struct STUDENT class[CSIZE] = {
	        { "Flip", "Snide"},
	        { "Clare", "Voyans"},
	        { "Bingo", "Higgs"},
	        { "Fawn", "Hunter"}
	    };
	getgrade(class,CSIZE);
	getave(class,CSIZE);
	return 0;
}
void getgrade(struct STUDENT p[],int num){
	char ch = 0;
	printf("输入学生的成绩:\n");
	for(int i=0;i<num;i++){
		printf("第%d个学生%s %s:\n",i+1,p[i].name.firstName,p[i].name.secondName);
		for(int j=0;j<3;j++){
			printf("成绩%d:",j+1);
			while(scanf("%f",&p[i].grade[j]) == 0){
				printf("输入错误,请重新输入:\n");
				while((ch=getchar()) !='\n') continue;
			}
		}
	}
}
void getave(struct STUDENT p[],int num){
	float temp = 0;
	printf("计算每个学生的平均成绩:\n");
		for(int i=0;i<num;i++){
			printf("第%d个学生%s %s:",i+1,p[i].name.firstName,p[i].name.secondName);
			for(int j=0;j<3;j++){
				temp +=p[i].grade[j];
			}
			p[i].ave = temp/3.0;
			printf("%.2f\n",p[i].ave);
		}
}

/*
 * 6.一个文本文件中存放着一个棒球队的信息,每一行的数据都是这样排列的:
 * 4 Jessie Joybat 5 2 1 1
 * (P422 后面内容省略)
 * 本题,由于对棒球一问三不知,所以我只做了读取记录到结构数组中,并统计每个球员参加的总场数
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
	int number;
	char fisrtname[20];
	char lastname[20];
	int sc;
	int jz;
	int zl;
	int pd;
	int totalsc; //累计参加了多少场
} BALLSR;

int main(void){
	int i = 0;
	BALLSR ballsr[19];// 一共19个球员 ,对应0~18编号
	BALLSR temp;
	FILE *fp = fopen("1.txt","r");
	memset(ballsr,0,sizeof(ballsr));
	while(!feof(fp)){
		fscanf(fp,"%d",&temp.number);
		fscanf(fp,"%s",&temp.fisrtname);
		fscanf(fp,"%s",&temp.lastname);
		fscanf(fp,"%d",&temp.sc);
		fscanf(fp,"%d",&temp.jz);
		fscanf(fp,"%d",&temp.zl);
		fscanf(fp,"%d",&temp.pd);
		ballsr[temp.number].number = temp.number;
		strcpy(ballsr[temp.number].fisrtname,temp.fisrtname);
		strcpy(ballsr[temp.number].lastname,temp.lastname);
		ballsr[temp.number].sc=temp.sc;
		ballsr[temp.number].jz+=temp.jz;
		ballsr[temp.number].zl+=temp.zl;
		ballsr[temp.number].pd+=temp.pd;
		ballsr[temp.number].totalsc++;
		i++;
	}

	for (int k = 0; k < 19; k++) {
		if (ballsr[k].sc != 0) {
			printf("%d %s %s %d %d %d %d %d\n", ballsr[k].number,
					ballsr[k].fisrtname,
					ballsr[k].lastname,
					ballsr[k].sc,
					ballsr[k].jz,
					ballsr[k].zl,
					ballsr[k].pd,
					ballsr[k].totalsc);
		}
	}

	fclose(fp);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值