dziwny błąd przy wpisywaniu danych do pliku

0

Hej

Męczę cały czas jeden program a mam kolokwium za kilka godzin.
Program ma za zadanie wczytać dane z pliku (imienia, nazwiska, numery indeksów, numer grup i wynik) do listy.
Posortować listę alfabetycznie po nazwiskach i imionach (jeżeli nazwiska są takie same)
Policzyć średnią arytmetyczną wyników.
I na koniec wpisać do pliku wynik.txt dane tych osób których wynik jest poniżej średniej.

Generalnie prawie wszystko działa ALE w pliku wynik.txt zamiast wyników mam 0.0000, w wynik.txt wpisują się te nazwiska które powinny ale nie wiem dlaczego nie wpisują się wyniki, przecież (chyba) ich nigdzie nie zmieniam.

Oto plik dane.txt:

Kowalski Piotr 12345 I2 13.5
Niezły Wojciech 12439 I4 18.6
Marcinkowska Eliza 12905 I3 20.0
Gackowski Tomasz 13004 I4 7.2
Zawisza Jan 13021 I1 3.8
Najgorszy Sebastian 12793 I4 2.2     
Najlepszy Adam 13179 I4 23.0
Sredni Zygmunt 12905 I5 15.3
Gackowski Krzysztof 12254 I4 7.2
Niezla Weronika 13189 I4 18.6
Kiepski Maksymilian 12807 I3 5.0
 

Oto program:

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <stdio.h>

using namespace std;

struct dane
{
	char nazwisko[30];
	char imie[30];
	int indeks;
	char grupa[3];
	float wynik;
};

struct lista
{
	dane x;
	lista *next;
};

dane WprowadzDane()
{
	dane d;
	cout<<"Podaj nazwisko imie indeks grupa wynik: ";
	scanf("%s %s %d %s %f",&d.nazwisko,&d.imie,&d.indeks,&d.grupa,&d.wynik);
	return d;
}


void DodajNaKoniec(lista *&head, lista *&end, dane d)
{
	lista *nowa=new lista;
	if(head==NULL)
	{
		nowa->next=NULL;
		nowa->x=d;
		head=nowa;
		end=nowa;
	}
	else
	{
		nowa->next=NULL;
		nowa->x=d;
		end->next=nowa;
		end=nowa;
	}
}

void WczytajPlik(lista *&head, lista *&end)
{
	FILE *stream;
	dane d;
	stream=fopen("dane.txt","r");
	if(stream==NULL)//sprawdzenie czy sie udalo otworzyc
	{
		cout<<"Blad otwarcia pliku"<<endl;
		return;
	}

	while(!feof(stream))
	{
		fscanf(stream,"%s %s %d %s %f",&d.nazwisko,&d.imie,&d.indeks,&d.grupa,&d.wynik);
		DodajNaKoniec(head,end,d);
	}
	fclose(stream);
}


int Porownanie(char *a, char *b, char *c, char *d, int size=30)
{
	for(int i=0;i<size;i++)
	{
		if(a[i]%32<b[i]%32)return 0;
		if(a[i]%32>b[i]%32)return 1;
	}
	for(int i=0;i<size;i++)
	{
		if(c[i]%32<d[i]%32)return 0;
		if(c[i]%32>d[i]%32)return 1;
	}
	return 2;
}//wynik=0 wstawic przed, wynik=1 wstawic za, wynik=2 wstawic na koniec bo takie samo

void Sortowanie3(lista *&head, lista *&end, int ile)
{
	lista *tmp=head;
	dane tym;
	do
	{
		for(int i=0;i<ile-1;i++)
		{
			if(Porownanie(tmp->x.nazwisko,tmp->next->x.nazwisko,tmp->x.imie,tmp->next->x.imie)==1)
			{
				tym=tmp->x;
				tmp->x=tmp->next->x;
				tmp->next->x=tym;
			}
			tmp=tmp->next;
		}
		tmp=head;
		ile--;
	}while(ile>1);
}

float Srednia(lista *head, int ile)
{
	float srednia=0;
	lista *tmp=head;
	while(tmp!=NULL)
	{
		srednia=srednia+tmp->x.wynik;
		tmp=tmp->next;
	}
	srednia=srednia/ile;
	return srednia;
}

void WyswietlListe(lista *head)
{
	lista *tmp;
	tmp=head;
	cout<<"Nazwisko\tImie\tIndeks\tGrupa\tWynik"<<endl;
	while(tmp!=NULL)
	{
		cout<<tmp->x.nazwisko<<"\t"<<tmp->x.imie<<"\t"<<tmp->x.indeks<<tmp->x.grupa<<"\t"<<tmp->x.wynik<<endl;
		tmp=tmp->next;
	}
}

void ZapiszDoPliku(lista *head, float srednia)
{
	FILE* stream;
	stream=fopen("wynik.txt","w");
	lista *tmp=head;
	dane d;
	while(tmp!=NULL)
	{
		d=tmp->x;
		if(tmp->x.wynik<srednia)
		{
			fprintf(stream,"%s %s %d %s %f\n",&d.nazwisko,&d.imie,&d.indeks,&d.grupa,&d.wynik);
		}
		tmp=tmp->next;
	}
	fclose(stream);
}

int main(int argc, _TCHAR* argv[])
{
	lista *head=NULL;
	lista *end=NULL;
	lista *head2=NULL;
	lista *end2=NULL;
	cout<<"Chcesz wprawadzac dane z klawiatury czy odczytac z pliku dane.txt (k/p)? ";
	char odp2;
	cin>>odp2;
	if(odp2=='k')//wczytywanie z klawiatury
	{
		char odp;
		dane tym;
		cout<<"Czy chcesz wpisac wynik (t/n) ";
		cin>>odp;
		while(odp=='t'||odp=='T')
		{
			tym=WprowadzDane();
			DodajNaKoniec(head,end,tym);
		
			cout<<"Czy chcesz dodać kolejny wynik (nazwisko imie indeks grupa wynik)? (t/n) ";
			cin>>odp;
		}
	}
	else if(odp2=='p')//wczytywanie z pliku
	{
		WczytajPlik(head,end);
	}
	cout<<"Oto to co wprowadzono:"<<endl;
	WyswietlListe(head);

	int iledanych=0;//licze ile lista ma elementow;
	lista *tymczas=head;
	while(tymczas!=NULL)
	{
		iledanych++;
		tymczas=tymczas->next;
	}
	tymczas=head;
	cout<<endl<<endl<<"Lista ma "<<iledanych<<" elementow"<<endl;

	Sortowanie3(head,end,iledanych);
	cout<<endl<<endl<<"Posortowana lista: "<<endl;
	WyswietlListe(head);

	float srednia=Srednia(head,iledanych);
	cout<<endl<<endl<<"Srednia arytmetyczna wynikow wynosi ";
	printf("%.2f\n",srednia);
	ZapiszDoPliku(head,Srednia(head,iledanych));



	system("pause");
	return 0;
}
 

I teraz to co otrzymuje w pliku wynik.txt

Gackowski Krzysztof 3930144 I4 0.000000
Gackowski Tomasz 3930144 I4 0.000000
Kiepski Maksymilian 3930144 I3 0.000000
Najgorszy Sebastian 3930144 I4 0.000000
Zawisza Jan 3930144 I1 0.000000
 

Czyli te nazwiska których wyniki są poniżej średniej - tak powinno być
I pytanie - dlaczego są 0.000000 zamiast wyników?

Bardzo proszę o pomoc!

1
 
fprintf(stream,"%s %s %d %s %f\n",&d.nazwisko,&d.imie,&d.indeks,&d.grupa,&d.wynik);

zamień na

 
fprintf(stream,"%s %s %d %s %f\n",d.nazwisko,d.imie,d.indeks,d.grupa,d.wynik);
0

DZIĘKUJĘ! ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1