• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja C++ ukazująca największą wartość

Object Storage Arubacloud
0 głosów
658 wizyt
pytanie zadane 9 listopada 2020 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

Witam, potrzebuję pomocy w jednym zadaniu. Sprawa wygląda tak, że mam dwa pliki, w pierwszym (doskonale.txt) jest zbiór liczb, a w drugim (doskonale2.txt) wpisane są liczby doskonałe z pierwszego pliku oraz, obok nich, linijki w których występują. Muszę napisać funkcję, która wyświetli największą liczbę doskonałą z tego drugiego pliku.

 

#include<iostream>
#include<fstream>
#include<cstdlib>
#include <string>
#include<cmath>
using namespace std;
fstream plik1,plik2, wynik, wynik2;
int a, b,c,d,e,f ,licz=0, liczw=0,liczw2=0, suma=0, minx, maxx;

bool czy_doskonala(int a) // zad 1 b)
{
	int s = 1, p = sqrt(a);
	for(int i=2; i<=p; i++)
		if(a%i == 0)
	//dodajemy do sumy dwa dzielniki
			s+= i + a/i;
	
	//jesli mamy do czynienia z liczbą kwadratową
	//to dwa razy dodalismy jej pierwiastek
	//więc musimy go raz odjąć
	if(a == p*p) s-=p;
	
	//jesli suma dzielników jest równa danej liczbie
	//do podana liczba jest doskonała
	if(a == s) return 1;
	
	return 0;	
}




void dzielniki(int a)  // zad1 f) // inny podpunkt z zadania wyświetlający dzielniki
{
	for(int i = 1; i <= a; i++)
	{
    	if (a % i == 0)
     	{
	   		wynik2<<i<<" "; 
		}
	}
	wynik2<<" - "<<a<< endl;
	
}


int main(){
	
	plik1.open("doskonale.txt",ios::in);
	wynik.open("doskonale2.txt", ios::out);
	while(!plik1.eof())
	{
		plik1>>a;
		liczw++;  // zad 1 c)
		if(czy_doskonala(a))
		{
			licz++; // zad1 a)
			wynik<<a<<" "<<liczw<<endl; // zad 1 b) i c)
		}
		
	}
	cout<<licz<<endl; // zad1 a)  // inny podpunkt z zadania wyświetlający ile jest liczb doskonałych
	wynik.close();
	plik1.close();
	
	plik2.open("doskonale2.txt",ios::in);
	wynik2.open("doskonale3.txt", ios::out); // jest to plik, do którego mam wypisać dzieliniki liczb doskonałych
	while(!plik2.eof())
	{
		plik2>>c>>d;
		liczw2++;
		dzielniki(c);  //zad1 f)
		
		
		for(int i = 0; i<liczw2; i++) // zad1 d)  wyświetlenie najmniejszej liczby
		{
			if(i==0)
			{
				minx=c;
			}
			else if(c<minx)
			{
				minx=c;
			}
			
		}
		
	
		
		
	}
	cout<<"najmniejsza: "<<minx<<endl; //zad1 d)
	
	wynik2.close();
	plik2.close();
	
	
	system("start doskonale2.txt");
	system("start doskonale3.txt");
	system("pause");
	return 0;
}

Jak widać udało mi się napisać kod, który wyświetli najmniejszą liczbę. Niestety nie jest on w postaci funkcji. Jeśli ktoś pomógłby mi w stworzeniu funkcji wybierającej także najmniejszą wartość to byłbym bardzo wdzięczny.

1 odpowiedź

+1 głos
odpowiedź 9 listopada 2020 przez TOM_CPP Pasjonat (22,640 p.)
wybrane 9 listopada 2020 przez MKolaj15
 
Najlepsza

Kilka sugestii

  • Nie używaj zmiennych globalnych. Wiem, że w tym przypadku łatwiej operuje się na zmiennych globalnych, które dostępne z każdego miejsca w programie, ale jeżeli chcesz nauczyć się porządnie programować musisz ich unikać zobacz
  • Używaj nazw zmiennych które coś znaczą. Nazwy typu a,b,c,d niczego nie mówią i wcześnie czy później nie będziesz wiedział do czego one służą.

Funkcja wyliczająca minimum/maksimum z liczb w pliku może wyglądać w następujący sposób:

int maximum( const string& file_name )
{
    fstream file {file_name};

    if( !file.is_open() ) throw runtime_error("Could not open file"); // gdy nie można otworzyć pliku rzucany jest wyjątek

    int number {0};
    int line {0};
    int maximum {numeric_limits<int>::min()}; // ustawiamy maksimum na najmnieszą mozliwa wartosc typu int - wymaga #include <limits>

    while( !file.eof() )
    {
        file >> number >> line;
        if( maximum<number ) maximum = number;
    }

    return maximum;
}

 

komentarz 9 listopada 2020 przez MKolaj15 Bywalec (2,270 p.)
Dziękuję bardzo za pomoc i cenne rady!
komentarz 9 listopada 2020 przez tkz Nałogowiec (42,000 p.)

@TOM_CPP, eof możesz użyć do sprawdzenia stanu, czy próbowałeś odczytać odczytać poza końcem pliku. Nie powinieneś używać go do sprawdzenia, czy jest więcej danych do wczytania. 
Poprawniejszy zapis:

  while(file >> number >> line)
  {
      if( maximum<number ) maximum = number;
  }

 

Podobne pytania

+1 głos
1 odpowiedź 1,375 wizyt
pytanie zadane 20 listopada 2017 w C i C++ przez artur96 Początkujący (250 p.)
0 głosów
0 odpowiedzi 979 wizyt
+1 głos
2 odpowiedzi 303 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...