9.1定义一个结构体变量。计算该日在本年中是第几天,注意闰年问题。
#include<stdio.h>
struct
{intyear;
int month;
int day;
}date;
void main()
{int days;
printf("inputyear,mouth,day:");
scanf("%d,%d,%d",&date.year,&date.month,&date.day);
switch(date.month)
{case 1:days=date.day;break;
case2:days=date.day+31; break;
case3:days=date.day+59; break;
case4:days=date.day+90; break;
case5:days=date.day+120; break;
case6:days=date.day+151; break;
case7:days=date.day+181; break;
case8:days=date.day+212; break;
case9:days=date.day+243; break;
case10:days=date.day+273; break;
case11:days=date.day+304; break;
case12:days=date.day+334; break;
}
if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3)
days+=1;
printf("days=%dn",days);
}
9.2写一个函数days,实现第一题的计算。由主函数将年月日传递给days函数,计算后将日子数传回主函数输出。
#include<stdio.h>
struct dt
{intyear;
int month;
int day;
}date;
void main()
{
scanf("%d,%d,%d",&date.year,&date.month,&date.day);
printf("n%dn",days(date.year,date.month,date.day));
}
days(year,month,day)
intyear,month,day;
{int daysum=0,i;
static intdaytab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}
for(i=1;i<=13;i++)
daysum+=daytab[i];
daysum+=day;
if((year%4==0&&year%100!=0||year%400==0)&&month>=3)
daysum+=1;
return(daysum);
}
9.3编译一个函数ptint,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score【3】,用主函数输入这些记录,用print函数输出这些记录。
略
9.4在第三题的基础上,编写一个函数input,用来输入5个学生的数据记录。
程序设计如下
#define N 5
struct student
{charnum[6];
charname[8];
intscore[4];
}stu[N];
void main()
{
input(stu);
print(stu);
}
input(stu)
struct studentstu[];
{int i,j;
for(i=0;i<N;i++)
{printf("number");
scanf("%s",stu[i].num);
printf("name");
scanf("%s",stu[i].name);
for(j=0;j<3;j++)
{printf("nscoren");
scanf("%d",&stu[i].score[j]);
}
printf("n");
}
}
print(stu)
struct studentstu[];
{int i,j;
printf("nnumbername score1score2 score3 n");
for(i=0;i{printf("%8s%10s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%7d",stu[i].score[j]);
printf("n");
}
}
9.5有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总成绩,以及最高分的学生的数据。
#include<stdio.h>
#define N 10
struct student
{charnum[6];
charname[8];
intscore[4];
float avr;
}stu[5];
void main()
{inti,j,max,maxi,sum;
floataverage;
for(i=0;i<5;i++)
{printf("number");
scanf("%s",stu[i].num);
printf("name");
scanf("%s",stu[i].name);
for(j=0;j<3;j++)
{printf("nscoren");
scanf("%d",&stu[i].score[j]);
}
}
average=0;
max=0;
maxi=0;
for(i=0;i<5;i++)
{sum=0;
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].avr=sum/3.0;
average+=stu[i].avr;
if(sum>max)
{max=sum;
maxi=i;
}
}
average/=5;
printf("numbername score1score2 score3averagen");
for(i=0;i<5;i++)
{printf("%8s%10s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%7d",stu[i].score[j]);
printf("% 6.2fn",stu[i].avr);
}
printf("average=%5.2fn",average);
printf("The best student is%s,sum=%dn",stu[maxi].name,max);
}
9.6有13个人围成一圈,从第一人开始顺序报号1,2,3。凡报到3者推出圈子。找出最后留在圈子中的人的序号。
设计程序如下
解:
#define N 13
struct person
{int number;
int nextop;
}link[N+1];
main()
{int I,count,h;
for(I=1;I<=N;I++)
{if(I==N)
link[i].nextp=1;
else
link[i].nextp=I+1;
link[i].number=I;
}
printf(“n”);
count=0;
h=N;
printf(“sequence that person2 leave thecircle:n”);
while(count<N-1)
{I=0;
while(I!=3)
{h=link[h].nextp;
if(link[h].number)
I++;
}
printf(“%4d”,link[h].number);
link[h].number=0;
count++;
}
printf(“nThe last oneis”);
for(I=1;ii<=N;I++)
if(link[i].number)
printf(“%3d”,lin[i].number);
}
9.7编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。
解:new函数如下:
#define NULL 0
#define NEWSIZE 1000
char newbuf[NEWSIZE];
char *newp=newbuf;
char *new(int n)
{if (newp+n<=newbuf+NEWSIZE)
{ newp=newp+n;
return(newp-n);
}
else
return(NULL);
}
9.8写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。
程序设计如下
解:
#define Nullo
#defineNEWSIZE 1000
char newbuf[NEWSIZE];
char *newp=newbuf;
free(char *p)
{if((p>=newbuf)&&(p<newbuf+NEWSIZE))
newp=p;
}
9.9在例题9.9的基础上,写一个函数del,用来删除动态链表中指定的结点。
程序设计如下:略
9.10写一个函数insert,用一个动态链接表插入结点。
程序设计如下:略