发布网友 发布时间:2022-04-23 22:54
共1个回答
热心网友 时间:2023-10-12 19:46
/*该程序的作用是接收学生的生日,判断一共有多少种类型的生日(根据月和日划分),
输出有相同生日的人*/
#include<stdio.h>
#include<stdlib.h>
typedef struct a //定义一个结构体类型名称为struct a,别名为student
{
int month; //三个成员均为int类型
int day;
int flag;
}student;
void main()
{
int n,m,h=1;int k=0,j;
int N; /*定义变量*/
student *p=NULL; //定义一个student类型指针初始为空
printf("enter the number of student:\n"); /*输入有多少同学参与统计*/
scanf("%d",&N); /*输入并读取N*/
p=(student *)malloc(N*sizeof(student)); //申请N个student占用的内存,将首地址给p
for(m=0;m<=N-1;m++) //给申请内存后的每个学生赋值
{
p[m].flag=0; //将所有学生的flag位置为0
printf("enter the birthday of student %d:\n",m+1);
scanf("%d,%d",&p[m].month,&p[m].day); //从输入获得每个学生的出生月和日
}
for(m=0;m<=N-1;m++)
{
if(p[m].flag!=0) //如果该学生的flag标志位不为0则跳过去,作用是跳过已经检查过的学生
continue;
p[m].flag=h;
for(n=m;n<=N-2;n++)
{
if(p[n+1].flag!=0) //如果标志位flag不为0,说明已经检查过,则跳过
continue;
if((p[n+1].month==p[m].month)&&(p[n+1].day==p[m].day))//如果两个人的生日相同
p[n+1].flag=h; //设置标志位为h,h的值表示生日的类型,生日相同则h值一样
}
h++; //计算有多少种不同的生日日期
}
for(n=1;n<=h;n++) //访问每种类型的生日的人员
{
k=0;
for(m=0;m<=N-1;m++)
{
if(p[m].flag==n)
{
k++; //检查到一个学生的生日是这个类型则k+1
j=m; //将该种类型生日的学生的数组下标赋值为j
}
}
if(k>1) //打印出有相同生日的人员,如果生日不重,则不输出k>1说明该类型生日的人数超过1个人
printf("there are %d students born in %d, %d\n",k,p[j].month,p[j].day);
}
getchar();
}