/*
*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;
}