首页 > 试题广场 >

编写程序,要求实现以下功能: (1)请从文件中读入两个班同学

[问答题]
成绩排名
假设每个班的同学人数最多不超过10人。每个同学的档案信息包括:学号(最大为10个字符)、姓名(最大为20个字符)、班级(最大为6个字符)、成绩1(float 型)、成绩2(float型)。
有两个磁盘文件class1.txt 和 class2.txt,分别存放两个班同学的学习成绩档案。文件为文本文件,每行存放一位同学的档案信息,各信息项之间用空格间隔。
编写程序,要求实现以下功能:
(1)请从文件中读入两个班同学的档案信息。
(2)将所有的同学,按照平均成绩进行全部排名。排名规则如下:
  • 按照平均成绩、成绩1、成绩2的优先顺序进行比较排名。
  • 即:平均成绩高的同学排名靠前;如果平均成绩相同,则成绩1高的同学排名靠前。
  • 如果各项成绩都相同,则排名也相同。
  • 对于同学A,按照上述排序规则,如果有K个同学的排名在其前面,则该同学的总排名则为K+1。
(3)输入一个同学的学号,如果该学号存在,输出该名同学的排名及档案信息;如果该学号不存在,则输出“Error”;输入end,查询结束。
输入格式:读入文件。 键盘依次输入学号200911019,200910105,200911005,200911002,最后输入end。
输出格式要求:
输出查询结果,每行输出一个同学的信息,依次为名次,学号,姓名,班级,平均成绩,成绩1,成绩2,各数据项之间用一个逗号“,”隔开。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
    int round;
    char snum[10];
    char name[20];
    char cla[6];
    float mark1;
    float mark2;
    float mid;
};
int read(char filename1[12],char filename2[12],struct student class1[20])
{
    FILE *fp;
    int i=0;
    fp=fopen(filename1,"r");
    if (fp==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    while (!feof(fp))
    {
        fscanf(fp,"%s %s %s %f %f",class1[i].snum,class1[i].name,class1[i].cla,&class1[i].mark1,&class1[i].mark2);
        i=i+1;
    }
    fclose(fp);
    fp=fopen(filename2,"r");
    if (fp==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    while (!feof(fp))
    {
        fscanf(fp,"%s %s %s %f %f",class1[i].snum,class1[i].name,class1[i].cla,&class1[i].mark1,&class1[i].mark2);
        i=i+1;
    }
    return (i);
    fclose(fp);
}
void paimin(struct student clas[20],int n)
{
    int i,j;
    for (i=0;i<n;i++)
        clas[i].mid=(clas[i].mark1+clas[i].mark2)/2;
    for (i=0;i<n;i++)
        clas[i].round=1;
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            if ((clas[j].mid>clas[i].mid)||(clas[j].mid==clas[i].mid&&clas[j].mark1>clas[i].mark1)||(clas[j].mid==clas[i].mid&&clas[j].mark1==clas[i].mark1&&clas[j].mark2>clas[i].mark2))
                clas[i].round=clas[i].round+1;
        }
    }
}
void search(struct student clas[20],char num[10],int n)
{
    int i,t=0;
    for (i=0;i<n;i++)
    {
        if (strcmp(clas[i].snum,num)==0)
        {
            printf("%d,%s,%s,%s,%f,%f,%f\n",clas[i].round,clas[i].snum,clas[i].name,clas[i].cla,clas[i].mark1,clas[i].mark2,clas[i].mid);
            t=1;
        }
    }
    if (t==0)
        printf("Error\n");
}
void main()
{
    struct student clas[20];
    int n;
    char file1[12]={'\0'},file2[12]={'\0'},num[10]={'\0'};
    printf("请输入读入文件:\n");
    scanf("%s %s",file1,file2);
    n=read(file1,file2,clas);
    paimin(clas,n);
    printf("请输入要查找学生的学号(输入End时停止):\n");
    scanf("%s",num);
    while (strcmp(num,"End")!=0)
    {
        search(clas,num,n);
        printf("请输入要查找学生的学号(输入End时停止):\n");
        scanf("%s",num);
    }
}

字母统计
请编写程序实现以下功能。
(1)假设有一串英文文字,存储在字符串str 中。
(2)编写函数lettercount(),统计在字符串str中每个字母和数字字符出现的次数,统计结果形成一个链表,函数返回指向头结点的指针head。
(3)编写函数listcount(head),在屏幕上输出统计结果链表中,每个字母出现的次数,输出格式见示例。
要求:请使用链表实现上述两个函数的功能。
  假设str初始为:  aaa	bbb	cc	sss	123	4567 abc 456 4567
屏幕输出:
  a(4),b(4),c(3),s(3),1(1),2(1),3(1),4(3),5(3),6(3),7(2)
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define LEN sizeof(struct node)
struct node
{
	char l;
	int c;
	struct node *next;
};
struct node *lettercount(char str[100])
{
	struct node *p1,*p2,*head;
	char letter[100]={'\0'};
	int ci[100]={0},n1,n2=1,n=0,i,j,t=0;
	n1=strlen(str);
	letter[0]=str[0];
	for (i=1;i<n1;i++)
	{
		for (j=0;j<n2;j++)
		{
			if (str[i]==letter[j])
			{
				ci[j]=ci[j]+1;
				break;
			}
			else
				t=t+1;
		}
		if (t==n2)
		{
			n2=n2+1;
			letter[n2-1]=str[i];
		}
		t=0;
	}
	p1=p2=(struct node *)malloc(LEN);
	if (letter[0]!=' ')
	{
		p1->l=letter[0];
		p1->c=ci[0]+1;
	}
	head=NULL;
	for (i=1;i<n2+1;i++)
	{
		n=n+1;
		if (n==1)
			head=p1;
		else 
			p2->next=p1;
		p2=p1;
		p1=(struct node *)malloc(LEN);
        if (letter[i]!=' ')
		{
		    p1->l=letter[i];
		    p1->c=ci[i]+1;
		}
		else
		{
			i=i+1;
			if (i!=n2)
			{
				p1->l=letter[i];
				p1->c=ci[i]+1;
			}
		}
	}
	p2->next=NULL;
	return(head);
}
void listcount(struct node *head)
{
	struct node *p;
	p=head;
	while (p!=NULL)
	{
		printf("%c(%d) ",p->l,p->c);
		p=p->next;
	}
	printf("\n");
}
void main()
{
	struct node *head;
	char str[100]={"aaa bbb cc   sss  123 4567 abc 456 4567"};
	head=lettercount(str);
	listcount(head);
}


发表于 2017-05-17 02:25:28 回复(0)