30/09/2018, 16:23

Do while nó không lặp lại?

Nhập vào danh sách gồm n học sinh. Sau đó thực hiền các công việc sau.
1,Chuẩn hóa tên hoc sinh,(Xóa các khoảng trắng không cần thiết,Viết hoa các chữ cái đầu tiên)
2.Viết hàm tính điểm trung bình của 1 HS bất kì

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct HocSinh
{
	char Hoten[30];
	float Toan,Li,Hoa;
};
struct NgaySinh
{
	int Ngay,Thang,Nam;
};
//Khai báo nguyên mẫu hàm.
void Nhap(HocSinh x[],NgaySinh a[],int n);
float TinhDiemTrungBinh(HocSinh x[],int n);
bool KiemTraHS(HocSinh x[],int n,char Ten [30]);
void Diem_Ten(HocSinh x[],int n,char Ten[30]);
void Xoakhoangtrang(char *a);
void Chuanhoa(HocSinh x[],int n);
void NhapTenHS(char Ten[30]);
void Xuat(HocSinh x[],NgaySinh a[],int n);
//=============================================
void Nhap(HocSinh x[],NgaySinh a[],int n)
{
	printf("
-------------------------------");
	for(int i=0;i<n;i++)
	{
		
		fflush(stdin);
		printf("
Nhap ho ten: ");
		gets(x[i].Hoten);
		/*
		do
		{
		  printf("
Nhap ngay sinh: ");
		  scanf("%d",&a[i].Ngay);
		}
		while(a[i].Ngay<1 || a[i].Ngay>32);
		do
		{
			printf("
Nhap thang sinh: ");
			scanf("%d",&a[i].Thang);
		}
		while(a[i].Ngay<1 || a[i].Thang>12);
		do
		{
			printf("
Nhap nam sinh: ");
			scanf("%d",&a[i].Nam);
		}
		while(a[i].Nam<1950 || a[i].Nam>2050);
		printf("
Nhap diem toan: ");
		scanf("%f",&x[i].Toan);
		printf("
Nhap diem hoa: ");
		scanf("%f",&x[i].Hoa);
		printf("
Nhap diem li: ");
		scanf("%f",&x[i].Li);*/
		printf("
-------------------------------");
	}
}
float TinhDiemTrungBinh(HocSinh x[],int n)
{
	for(int i=0;i<n;i++)
	{
		return (x[i].Toan+x[i].Hoa+x[i].Li)*1.0/3;
	}

}
bool KiemTraHS(HocSinh x[],int n,char Ten [30])
{
	for(int i=0;i<n;i++)
	{
		if(strcmp(x[i].Hoten,Ten)==1)
		{
			return false;
		}
	}
	return true;
}
void Diem_Ten(HocSinh x[],int n,char Ten[30])
{
	
		do
		{
			NhapTenHS(Ten);
			if(KiemTraHS(x,n,Ten)==false)
			{
				printf("
Hoc sinh vua nhap khong co trong danh sach!");
			}
		}
		
		while(KiemTraHS(x,n,Ten)==false);
	    for(int i=0;i<n;i++)
	     {
			if(strcmp(x[i].Hoten,Ten)==0)
			{
				printf("
Diem TB cua HS %s: %.2f",x[i].Hoten,TinhDiemTrungBinh(x,n));
			}
	    }
}
void Xoakhoangtrang(char *a)
{
	int n=strlen(a);
	while(a[0]==' ')
	{
		strcpy(&a[0],&a[1]);
	}
	while(a[n-1]==' ')
	{
		strcpy(&a[n-1],&a[n]);
	}
	for(int i=0;i<n;i++)
	{
		if(a[i]==' ' && a[i+1]==' ')
		{
			strcpy(&a[i],&a[i+1]);
			i--;
		}

	}
}
void Chuanhoa(HocSinh x[],int n)
{
	for(int i=0;i<n;i++)
	{
		Xoakhoangtrang(x[i].Hoten);
		strlwr(x[i].Hoten);
		x[i].Hoten[0]=x[i].Hoten[0]-32;
		int m=strlen(x[i].Hoten);
		for(int j=0;j<m;j++)
		{
			if(x[i].Hoten[j]==' ')
			{
				x[i].Hoten[j+1]=x[i].Hoten[j+1]-32;
			}
		}
	}
}
void NhapTenHS(char Ten[30])
{
	fflush(stdin);
	printf("
Nhap ten HS: ");
	gets(Ten);
	Xoakhoangtrang(Ten);
	strlwr(Ten);
	Ten[0]=Ten[0]-32;
	int n=strlen(Ten);
	for(int i=0;i<n;i++)
	{
		if(Ten[i]==' ')
		{
			Ten[i+1]=Ten[i+1]-32;
		}
	}
}
void Xuat(HocSinh x[],NgaySinh a[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("
+Ten HS: %s",x[i].Hoten);
		printf("
+Ngay sinh: %d/%d/%d",a[i].Ngay,a[i].Thang,a[i].Nam);
		printf("
-------------------------------");
	}
}
void main()
{
	int n=2;
	HocSinh x[100];
	NgaySinh a[100];
	Nhap(x,a,n);
	Chuanhoa(x,n);
	char Ten[30];
	Diem_Ten(x,n,Ten);
	//Xuat(x,a,n);
	getch();
}

Dòng do while chỗ này có vẫn đề,nó không lập lại

void Diem_Ten(HocSinh x[],int n,char Ten[30])
{
	
		do
		{
			NhapTenHS(Ten);
			if(KiemTraHS(x,n,Ten)==false)
			{
				printf("
Hoc sinh vua nhap khong co trong danh sach!");
			}
		}
		
		while(KiemTraHS(x,n,Ten)==false);
	    for(int i=0;i<n;i++)
	     {
			if(strcmp(x[i].Hoten,Ten)==0)
			{
				printf("
Diem TB cua HS %s: %.2f",x[i].Hoten,TinhDiemTrungBinh(x,n));
			}
	    }
}
Trần Hồng Phong viết 18:33 ngày 30/09/2018
bool KiemTraHS(HocSinh x[],int n,char Ten [30])
{
	for(int i=0;i<n;i++)
	{
		if(strcmp(x[i].Hoten,Ten) == 0)
		{
			return true; //
		}
	}
	return false;
}

Sửa lại hàm này xem sao

Bài liên quan
0