Średni przebieg wczytywany z pliku

0

Witam, walczę z następującym zadaniem:
Wczytaj utworzony w zadaniu 1. plik, a następnie oblicz i wyświetl średni przebieg
wszystkich samochodów. Wykorzystaj funkcję fscanf.
Wygląda to tak


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
#include <stdio.h>

using namespace std;

int main()
{
	FILE *plik;
	plik = fopen("samochody.txt", "r");
	double suma = 0, przebieg = 0;

	if (plik == NULL)
	{
		cout << "Nie udalo sie odczytac pliku" << endl;
	}
	else
	{
		for (int i = 0; i < 100; i++)
		{
			fscanf(plik,"%*c%*c%*c%*d: %d km \n",
				&przebieg);
			suma += przebieg;
		}
		suma = suma / 100;
		cout << "Sredni przebieg wynosi: " << suma << endl;
	}
	fclose(plik);

	system("pause");
	return 0;
} 

Zaś kod z zadania 1 w funkcji zapisującej ma postać:
fprintf(plik, "%c%c%c%d: %d km \n"

I w 2 zadaniu dostaję jako wynik jakieś śmieci, np 9.17333e-320.
Z góry dziękuję za pomoc.

0
        int count=0,przebieg; /* przebieg - int nie double */
        for(;scanf(" %*c%*c%*c%*d: %d km",&przebieg)==1;++count) suma+=przebieg;
        suma/=count;
0

Aaa, jasne, wystarczyło zmienić z double na int.
Dzięki wielkie ;)

0

O ile w pliku zawsze będzie 100 rekordów to wystarczy, ale jak nie ...
Poza tym \n w scanf - nie zawsze zostanie poprawnie obsłużony, zależy od kompilatora - więc ta spacja wystarczy.

0

A właściwie co, jeślibyśmy chcieli obliczyć średnią czegoś zmiennoprzecinkowego? Normalnie mogę float używać?

0

Możesz ale wtedy nie %d

0

A w sumie, jeszcze jedno ostatnio à propos plików i odczytu/zapisu:

 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <fstream>

using namespace std;

class Osoba
{
	char imie[10];
	short data_urodzenia;
	char waga;
	 char wzrost;

public:
	Osoba(char *imie, short data_urodzenia, int waga, int wzrost)
	{
		strcpy(this->imie, imie);
		this->data_urodzenia= data_urodzenia;
		this->waga = waga;
		this->wzrost = wzrost;
	}
	void zdanie()
	{
		cout << imie << " wazy " << waga << " kg i ma " << wzrost << " cm wzrostu" << endl;
	}
};

int main()
{
	Osoba Jan;
	fstream file("osoba.bin", ios::binary | ios::in);
	file.read((char*)&Jan, sizeof(Osoba));
	
	Jan.zdanie();

	system("pause");
	return 0;
}

Ogl to ma wczytać plik binarny i wyświetlić na ekranie. Chyba w mainie coś się upsuło i jest taki error "'Osoba' : no appropriate default constructor available"

0

Wywal konstruktor lub dodaj konstruktor domyślny, ponieważ nie ma jak zbudować obiekt Jan.

0

Czyli po prostu Osoba() zamiast Osoba(char *imie, short data_urodzenia, int waga, int wzrost)? No i okej, kompiluje się, ale wzrost "krzaczy" i źle wypisuje wagę

0

Podejrzewam że waga i wzrost muszą być co najmniej int a może float lub double.

0

Powiedz co masz w tym pliku, jak został on zapisany?

0

Okej, trochę inaczej to udało mi się zrobić, ale najważniejsze, że działa ;)
A było tam coś takiego:

 
struct sOsoba
{
char imie[10];
short data_urodzenia;
unsigned char waga;
unsigned char wzrost;
};

I dane podane dla 3 osób.
Więc w sumie wyżej źle też były u mnie typy zmiennych.

0
Skipper11 napisał(a):

... ale wzrost "krzaczy" i źle wypisuje wagę
Zmieniłeś char na unsigned char i przestało krzaczyć? Chrzani Waść.

0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

class Osoba
{
public:
	char imie[10];
	short data_urodzenia;
	unsigned char waga;
	unsigned char wzrost;



	//        Osoba()
	//        {
	//            strcpy(this->imie, imie);
	//            this->data_urodzenia = data_urodzenia;
	//            this->waga = waga;
	//            this->wzrost = wzrost;
	//        }
	void zdanie()
	{
		cout << imie << " urodzil sie w " << data_urodzenia << ", wazy " << waga << " kg i ma " << wzrost << " cm wzrostu" << endl;
	}
};

int main()
{
	Osoba osoba;
	ifstream file("osoba.bin", std::ios::binary);
	while (!file.eof()) {
		file.read((char*)&osoba, sizeof(Osoba));
		osoba.zdanie();
	}

	system("pause");
	return 0;
}
 

W sumie zupełnie inna koncepcja i zakomentowane sporo, bo wczoraj przed oddaniem zmiany wprowadzane były i imie i rok normalnie wypisuje teraz urodzenia, ale wagę i wzrost i tak dalej psuło, ale to już nie mam pojęcia czemu.

0

Wg mnie powinno być:

    char imie[10];
    unsigned short data_urodzenia,waga,wzrost;

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