Rzutowanie pojedynczego elementu tablicy stringow do int

0

Witam. Problem jak z tematu a zadanko z matury z poprzedniego roku. Musze:
-Wypisac najwieksza i najmniejsza liczbe z pliku
-Napisac ile jest parzystych
-Wypisac liczby ktore tworza ciag rosnacy //tu jest problem
Oto moj prosty i szybki kodzik:

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>

int main()
{
     using namespace std;
     fstream plik;
     string tekscik;
     bool ciag;
     int max=0,min=100000,tmp,parzyste;
     plik.open("cyfry.txt", ios::in | ios::binary);
     if(plik.good()==true)
     {
       cout<<"Otwarty"<<endl;
     }
     while(!plik.eof())
     {
       
       getline(plik,tekscik);
       tmp=atoi(tekscik.c_str());
       cout<<tekscik[0]<<endl;
       for(int i=0;i<tekscik.length();i++)
       {
          if(atoi(tekscik[i].c_str()) < atoi(tekscik[i+1].c_str())) ciag=true; //tu mamy blad poniewaz nie mozna rzutowac tylko jednego elementu tablicy
          else ciag=false;
       }
       if(tmp%2==0)parzyste++;
       if(max<tmp)max=tmp;
      if(tmp!=0){ if(min>tmp)min=tmp;}
      } 
  
     cout<<"Max: "<<max<<" Min: "<<min<<" Parzyste: "<<parzyste<<endl;
   return 0;
}

Dziekuje z gory za pomoc :)

0
string zmienna, zmienna2;
for(int i=0;i<tekscik.length();i++)
       {
           zmienna = tekscik[i];
           zmienna2 = tekscik[i+1];
          if(atoi(zmienna.c_str()) < atoi(zmienna2.c_str())) ciag=true; //tu mamy blad poniewaz nie mozna rzutowac tylko jednego elementu tablicy
          else ciag=false;
       } 
0

Az mi sie glupio zrobilo :/. A jak juz pytam to moze ma ktos pomysl dlaczego kodzik nie znajduje tych ciagow ?

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>

int main()
{
     using namespace std;
     fstream plik;
     string tekscik;
     bool ciag;
     int max=0,min=100000,tmp,parzyste;
     plik.open("cyfry.txt", ios::in | ios::binary);
     if(plik.good()==true)
     {
       cout<<"Otwarty"<<endl;
     }
     while(!plik.eof())
     {
       
       getline(plik,tekscik);
       ciag=false;
       tmp=atoi(tekscik.c_str());
       
       for(int i=0;i<tekscik.length();i++)
       {
          string x,y;
          x=tekscik[i];
          y=tekscik[i+1];
          if(atoi(x.c_str()) < atoi(y.c_str())) ciag=true;
          else ciag=false;
       }
       if(ciag==true)cout<<tmp;
       if(tmp%2==0)parzyste++;
       if(max<tmp)max=tmp;
      if(tmp!=0){ if(min>tmp)min=tmp;}
      } 
  
     cout<<"Max: "<<max<<" Min: "<<min<<" Parzyste: "<<parzyste<<endl;
   return 0;
}
0

Ja Ci powiem, ze wgle nie rozumiem Twego zamyslu dotyczacego tego programu, chociazby w jakim celu ustawisz przy kazdym wywolaniu petli for zmienna ciag na cokolwiek jak potem nigdzie z tego nie korzystasz?

0

Tak wiem to bylo glupie juz sobie poradzilem. Dla przyszlych pokolen :

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>

int main()
{
     using namespace std;
     fstream plik;
     string tekscik,x,y;
     bool ciag;
     int max=0,min=100000,tmp,parzyste;
     plik.open("cyfry.txt", ios::in | ios::binary);
     if(plik.good()==true)
     {
       cout<<"Otwarty"<<endl;
     }
     while(!plik.eof())
     {
       
       getline(plik,tekscik);
       int tekst=tekscik.length()-1;
       ciag=false;
       tmp=atoi(tekscik.c_str());
       
       for(int i=0;i<tekst;i++)
       {
          
          x=tekscik[i];
          y=tekscik[i+1];
          
          if(atoi(x.c_str()) < atoi(y.c_str())) ciag=true;
          else {ciag=false; break;}
         
       }
       
    
       if(ciag==true)cout<<tmp<<endl;
       if(tmp%2==0)parzyste++;
       if(max<tmp)max=tmp;
      if(tmp!=0){ if(min>tmp)min=tmp;}
      } 
  
     cout<<"Max: "<<max<<" Min: "<<min<<" Parzyste: "<<parzyste<<endl;
   return 0;
}
0

Całe zadanie z wykorzystaniem STL i C++11:

#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>

int main()
{
	using namespace std;

	ofstream result("zadanie4.txt");
	ifstream input("cyfry.txt");
	istream_iterator<int> begin(input), end;
	vector<int> numbers(begin, end);
	
	int evens = count_if(numbers.begin(), numbers.end(), not1(bind2nd(modulus<int>(), 2)));
	result << "a) " << evens << "\n";
	
	auto sumOfDigits = [](int number)
	{
		int result = 0;
		for(; number; number /= 10)
			result += number % 10;
		return result;
	};
	auto sumCompare = [&](int first, int second) { return sumOfDigits(first) < sumOfDigits(second); };
	auto minmax = minmax_element(numbers.begin(), numbers.end(), sumCompare);
	result << "b) min = " << *minmax.first << " max = " << *minmax.second << "\n";

	auto areDigitsAscending = [](int number)
	{
		do
		{
			int previous = number % 10;
			number /= 10;
			if(previous <= number % 10) return false;
		} while(number);

		return true;
	};

	vector<int> ascendings;
	
	result << "c) ";
	copy_if(numbers.begin(), numbers.end(), ostream_iterator<int>(result, " "), areDigitsAscending);

	return 0;
}
0
Leszczowy napisał(a):
if(plik.good()==true)

bool jest wartością logiczną. Nie trzeba jej przyrównywać do true albo false. Zamiast if(costam==true) dawaj if(costam). Zamiast if(costam==false) dawaj if(!costam). Zamaist

if (costam > cosinnego) {
    zmienna = true;
} else {
    zmienna = false;
}

dawaj

zmienna = (costam > cosinnego);

itp.

Leszczowy napisał(a):
while(!plik.eof())
{
    getline(plik,tekscik);
    // ...
}

Nie tak się czyta pliki. Najpierw musi być próba odczytu, dopiero potem sprawdzenie czy się udało czy też nie bo np. doszliśmy do końca pliku. Odczyt pliku linijkami powinien wyglądać w ten sposób:

while(getline(plik,tekscik)) {
   // ...
}
Leszczowy napisał(a):
for(int i=0;i<tekst;i++)
{
    x=tekscik[i];
    y=tekscik[i+1];

Wychodzisz poza zakres. Pętla powinna być wykonywana do elementu przedostatniego ponieważ porównujesz ten element z następnikiem. Czyli for(int i=0;i<tekst-1;i++)

Leszczowy napisał(a):
x=tekscik[i];
y=tekscik[i+1];
if(atoi(x.c_str()) < atoi(y.c_str())) //...<cpp>

Nie potrzebnie konwertujesz na liczbę. Znakom kolejnych cyfr przyporządkowane są kolejne liczby. I tak np. znak cyfry '0' to liczba 48, znak cyfry '1' to liczba 49 itd (zob. ASCII). Tak więc wystarczy porównać same znaki:

if(tekscik[i] < tekscik[i+1]) //...
Leszczowy napisał(a):
if(atoi(x.c_str()) < atoi(y.c_str())) ciag=true;
else {ciag=false; break;}

To przypisanie ciag=true jest tutaj zbędne. Wstępnie przyjmujemy dla ciag wartość true. Iterujemy po kolejnych cyfrach i jak się coś nie zgodzi to wtedy przypisujemy ciag=false i przerywamy pętlę. Więcej razy tej wartości zmieniać nie trzeba. Zatem:

ciag = true;
for (int i = 0; ciag && i < tekscik - 1; i++) {
   if(tekscik[i] >= tekscik[i+1]) {ciag=false; break;}
}

a najlepiej jeszcze inaczej:

ciag = true;
for (int i = 0; ciag && i < tekscik - 1; i++) { // Zauważ, że doszło "ciag &&". spowoduje to przerwanie pętli jeśli wartość "ciag" zmieni się na false
   ciag = (tekscik[i] < tekscik[i+1]); // wynik porównania możemy od razu przypisać do zmiennej typu bool
}

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