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

Zadanie maturalne

0 głosów
1,354 wizyt
pytanie zadane 21 sierpnia 2016 w C i C++ przez kkiermasz Użytkownik (680 p.)

Witam! 
Spotkał się ktoś z Was może z takim oto zadaniem:
http://kubakiermasz.jaw.pl/up/

Jestem po dwóch latach C++ w szkole, kursie pana Zelenta, a mimo wszystko nie bardzo wiem, jak to ugryźć. Jakieś sugestie podpowiedzi?

Przy okazji zapytam: 

Dlaczego w funkcji, przy wczytywaniu tej tablicy jest ta * oraz, dlaczego typ zmiennej to bool?

1
komentarz 21 sierpnia 2016 przez MichuDev Pasjonat (20,300 p.)
2F - Nie wolno wstawiać kodu źródłowego w formie obrazka!

3 odpowiedzi

+1 głos
odpowiedź 21 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

1. Zacznijmy od zadania.. Tak więc:
a) Aby zliczyć poszczególne powtórzenia potrzebujesz dwóch prostych pętli i tablicy zawierającej wiersze z dwoma kolumnami tj. [Słowo][Ilość powtórzeń]. Nazwijmy tą tablicę Tab.. Teraz sprawdzając wszystkie słowa po kolei, sprawdzasz, czy gdzieś już w tablicy Tab takie słowo nie zostało zapisane, jeżeli już takie słowo wystąpiło to dodajesz 1 do Ilości powtórzeń.. jeżeli okaże się, że takiego słowa jeszcze nie było to na końcu tablicy dodajesz nowe słowo, a potem w ilość powtórzeń wpisujesz 1. Resztę tego podpunktu zrobisz bez problemu, gdy już będziesz miał wypełnioną tablicę Tab.
b) Tutaj podpowiem ci, że w każdym systemie liczbowym (tj. oktalny, binarny, heksadecymalny, dziesiętny) podzielność przez dwa zawsze zależy od pierwszej cyfry. Przykładowo w systemie dziesiętnym.. jeżeli na końcu liczby jest 0,2,4,6,8 to oznacza, że jest ona podzielna przez dwa.. rozpisz sobie na kartce kilka liczb (np. od 1 do 24) w postaci szesnastkowej i przypatrz się im x)
c) Aby sprawdzić czy słowo jest palindromem wystarczy sprawdzać tablicę w ten sposób:
Text: ABCBA
[A][B][C][B][A] wielkość: 5
od i=0, póki i<wielkość/2, wykonuj i++
sprawdź, czy [i]!=[wielkosc-1-i],
jeżeli "prawda", to Text nie jest palindromem


2. Co do twojego drugiego pytania.. Od razu ostrzegam, że jeżeli nie masz pojęcia o czymś takim jak "wskaźnik" to prawdopodobnie nie zrozumiesz zapisu poniżej.. Obejrzyj najpierw jakiś tutorial dotyczący wskaźników, albo poczytaj gdzieś na ten temat (dużo tego w internecie.. wystarczy, że wpiszesz frazę w Google: "wskaźniki c++")
bool *Tab oznacza po prostu wskaźnik na zmienną typu bool..

Jeżeli mamy do czynienia z tablicą, to aby ją przesłać wystarczy mieś wskaźnik do jej pierwszego elementu.. tj Tab (lub jak kto woli &Tab[0]). Teraz możemy się odwołać do innych jej komórek:
bool Tablica[4];
bool *Tab=Tablica; //Lub bool *Tab=&Tablica[0];
Tab[0]=false;  // lub *Tab=false;
Tab[1]=true;   // lub *(Tab+1)=true;
Tab[2]=true;   // lub *(Tab+2)=true;
Tab[3]=false;  // lub *(
Tab+3)=false;

komentarz 24 sierpnia 2016 przez kkiermasz Użytkownik (680 p.)

Działa takie chce, chętnie wysłucham uwag i poddam to ocenie :D

 

#include <fstream>
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

main()
{
	string tab[1010];
	int ilosc_powtorzen[1010];
	int nr_linii=1;
	
	fstream plik1;
	plik1.open("dane.txt", ios::in);
	if(plik1.good()==false)
	{
		cout<<"Blad otwarcia pliku1"<<endl;
		exit(0);
	}else
	{														//wczytanie ciagow znakow i wyliczenie ich ilosci
		string tekst;
		while(getline(plik1, tekst))
		{
			tab[nr_linii] = tekst;
			
			nr_linii++;
		}
	}
	
	for(int j=1; j<nr_linii; j++){							//dodanie do tablicy zliczeniowej ile razy wystepuje
		for(int i=1; i<nr_linii; i++){
			if(tab[j]==tab[i]){
				ilosc_powtorzen[j]++;
			}
			
		}
	}
	
	fstream plik2;
	plik2.open("wyniki.txt", ios::out | ios::app);
			
		
		int wiecejniz1=0;									//zliczenie ile wystepuje wiecej niz raz
		
		for(int i=1; i<nr_linii; i++){
			if(ilosc_powtorzen[i]>1)
			wiecejniz1++;
		}
	
		plik2<<"a)"<<endl;
		plik2<<"Ilosc slow wystepujacych wiecej niz jeden raz: "<<wiecejniz1<<endl;
	
	int pom=0;
	string onaj;
		
	for(int i=1; i<nr_linii; i++){							//ilosc powtorzen naj, jaki to wyraz	
		if(ilosc_powtorzen[i]>pom){
			pom=ilosc_powtorzen[i];
			onaj=tab[i];
			
		}
		
	} 
	
	
	int ileparzystych;
	for(int i=1; i<nr_linii; i++){
	if((tab[i][tab[i].size()-1] == 'A') || (tab[i][tab[i].size()-1] == 'C') || (tab[i][tab[i].size()-1] == 'E')){
		ileparzystych++;
		}
	}
	
	string pom1;
	bool x;
	int palindromy;
	for(int i=1; i<nr_linii; i++){
	x=true;
	int dlugosc;
	pom1 = tab[i];
	dlugosc = pom1.size()-1;
	if(x==true){
		int j=0;
		for(int j=0; j<(dlugosc/2); j++){
		if(pom1[j]!=pom1[dlugosc-j] || x==false){
		x=false;
		}
			
		}
		if(x==true)palindromy++;	
	}
	}




		plik2<<"Slowo o najwiekszej liczbie wystapien: "<<onaj<<endl;
		plik2<<"Liczba jego wystapien: "<<pom<<endl;
		plik2<<"b)"<<endl;
		plik2<<"Ilosc liczb parzystych: "<<ileparzystych<<endl;
		plik2<<"c)"<<endl;
		plik2<<"Liczba palindromow: "<<palindromy<<endl;

	
	


	plik1.close();
	plik2.close();
	
	return 0;
}

 

komentarz 24 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Oto zawartość pliku wynik.txt:
a)
Ilosc slow wystepujacych wiecej niz jeden raz: 871
Slowo o najwiekszej liczbie wystapien: CADACDAFC
Liczba jego wystapien: 2130379299
b)
Ilosc liczb parzystych: 4312323
c)
Liczba palindromow: 60
}

Zwróć szczególną uwagę na podkreślone wartości.. przypominam, że w pliku znajduje się 1000 słów. Oraz, że jeżeli pierwsza wartość będzie większa od ilości słów to będzie oznaczać, że w pliku dane.txt znajduje się CO NAJMNIEJ pierwsza wartość*2 słów.

 

komentarz 24 sierpnia 2016 przez kkiermasz Użytkownik (680 p.)

Nie wiem skąd to wziąłeś, ale oto zawartość pliku wyniki.txt (generowany minutę temu)
a)
Ilosc slow wystepujacych wiecej niz jeden raz: 75
Slowo o najwiekszej liczbie wystapien: EBFAABCCBD
Liczba jego wystapien: 30
b)
Ilosc liczb parzystych: 482
c)
Liczba palindromow: 60

 

komentarz 24 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
W takim razie u mnie coś nie pykło.. wybacz.
Możliwe, że to przez złe skopiowanie danych.. zaraz zobaczę.
komentarz 24 sierpnia 2016 przez kkiermasz Użytkownik (680 p.)
0 głosów
odpowiedź 21 sierpnia 2016 przez kkiermasz Użytkownik (680 p.)
Domyślam  się, że będzie należało użyć fukcji getline(), ale nie do końca wiem, jak wczytać przy jej użyciu więcej niż jeden wierz danych
0 głosów
odpowiedź 21 sierpnia 2016 przez manjaro Nałogowiec (37,420 p.)
edycja 21 sierpnia 2016 przez manjaro
Ale o co z tym w ogóle chodzi?

To jest program na wypisywanie kolejnych liczb pierwszych do zadanego przedziału. Nikt ci nie każe robić dokładnie tak jak tutaj. Chociaż to jest bardzo szybki algorytm Eratostenesa. Zawsze to możesz zrobić po swojemu. Jak nie rozumiesz tego kodu to na tej stronie masz to bardzo dobrze wytłumaczone. https://pl.wikipedia.org/wiki/Sito_Eratostenesa.

Ja bym to zrobił bez wskaźników i bez boola bo po co. Najpierw robię tablicę int n elementów. Tablica na początku ma zera. Później metodą sita wykreślam te zera i wpisuję na przykład 1. I koniec zadania. Na wyjściu wystarczy wypisać wszystkie elementy zerowe.

Podobne pytania

0 głosów
2 odpowiedzi 1,379 wizyt
0 głosów
1 odpowiedź 1,257 wizyt
pytanie zadane 26 stycznia 2017 w C i C++ przez Matt987 Użytkownik (800 p.)
+1 głos
1 odpowiedź 3,687 wizyt

93,741 zapytań

142,677 odpowiedzi

323,294 komentarzy

63,325 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...