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

zadanie,problem

Object Storage Arubacloud
0 głosów
1,334 wizyt
pytanie zadane 16 marca 2018 w C i C++ przez Krystek102 Bywalec (2,440 p.)

W pliku binarne.txt znajduje się 500 napisów złożonych wyłącznie z zer i jedynek.
W każdym wierszu umieszczony jest jeden napis. Każdy napis ma długość podzielną przez 4.
Napisz program (lub programy), który da odpowiedzi do poniższych zadań. Odpowiedzi
zapisz w pliku zadanie4.txt, każdą odpowiedź poprzedź numerem odpowiedniego
zadania.
Zadanie 4.2

Napisy z pliku binarne.txt traktujemy jako binarne zapisy liczb dziesiętnych, w których
każdy segment złożony z 4 znaków jest reprezentacją binarnego zapisu jednej cyfry (zapis taki
nazywany jest kodem BCD).
Napis uznajemy za niepoprawny, gdy któryś z segmentów ma wartość większą niż 9 (czyli nie
jest zapisem cyfry dziesiętnej).
Przykład:
Napis 10010111 jest poprawny i reprezentuje liczbę 97, natomiast napis 11010000 nie jest
poprawny, gdyż jego pierwszy segment (1101) reprezentuje w zapisie binarnym większą od 9
liczbę 13. Podobnie nie jest poprawny napis 1110, ponieważ reprezentuje w zapisie binarnym
liczbę 14.
Podaj liczbę niepoprawnych napisów z pliku binarne.txt oraz najmniejszą długość
niepoprawnego napisu.

oto mój kod wychodzi mi 390 a powinno 359,ktoś widzi błąd? 

#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>

using namespace std;
bool czy_B(string s)
{
    int ile=0;
    for(int i=0;i<s.size();i++)
    {

        if((s[i]=='1'&& s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='1')||(s[i]=='1'&& s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='0')||(s[i]=='1'&& s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0')||(s[i]=='1'&& s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='1')||(s[i]=='1'&& s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='0')||(s[i]=='1'&& s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='1'))
   {

       ile++;

   }
  if(ile>0)return false;
  return true;

    }
}
int main()
{
   string s[500];

   int ile_A=0;
   ifstream we("ciag.txt");

   for(int i=0;i<500;i++)
   {
       we>>s[i];
  if(czy_B(s[i]))ile_A++;

   }
   cout<<ile_A<<endl;



    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Błąd jest w głównym if-e sprawdzającym.

Ponieważ cyfra 9 w kodzie binarnym ma postać:

1 0 0 1

Wystarczy sprawdzać czy pierwsza pozycja (ta od lewej) ma wartość 1. Jeśli tak, to trzeba sprawdzić ,dwie następne pozycję, czy któraś nie jest jedynką (używając OR).

Jeśli pierwsza pozycja jest zerem, trzeba od razu przerywać sprawdzanie komendą break.

P.S. Wczytywanie stringów do tablicy jest niepotrzebne. Każdy wczytany z pliku string sprawdzasz od razu na bieżąco.
1
komentarz 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
P.S. Poza tym w pętli for nie widzę, żebyś przeskakiwał sprawdzanie stringa co cztery pozycje. (Jedziesz po kolei - tak tutaj nie można).

Zrezygnował bym z tej funkcji zewnętrznej. Kod się o wiele uprości, jeśli całe sprawdzanie i liczenie umieścisz w main(). To są przecież krótkie, proste operacje.
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)
jak zrobiłem co 4 to nic się nie zmienia
1
komentarz 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Nie można brać znaków po kolei. Trzeba przeskakiwać co cztery pozycje, bo każda cyfra jest zapisana na kolejnych czterech bitach.

Zapisz dobrze warunek w głównym if-e, i musi dobrze liczyć!
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>

using namespace std;
bool czy_B(string s)
{
    int ile=0;
    for(int i=0;i<s.size();i=i+4)
    {

       if(s[i]=='1')
       {
           if(s[i+1]=='1'||s[i+2]=='1')
           {
               ile++;
           }
       }






   }
  if(ile>0)return false;
  return true;


}
int main()
{
   string s[500];

   int ile_A=0;
   ifstream we("c.txt");

   for(int i=0;i<500;i++)
   {
       we>>s[i];
  if(czy_B(s[i]))ile_A++;

   }
   cout<<ile_A<<endl;



    return 0;
}

chyba dobrze to poprawiłęm? 

1
komentarz 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Powinno być tak:

 if (s[ i ] == '1'  &&  (s[i+1] == '1'  OR  s(i + 2) == '1'))

           {

               ile++;

           )

Zwróć również uwagę, że popełniłeś błąd przy indeksowaniu. (Ponieważ indeksy stringa zaczynają się od zera.)

P.S. Nadaję z tabletu. Nawiasy i operator musisz sobie poprawić.
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>

using namespace std;
bool czy_B(string s)
{
    int ile=0;
    for(int i=0;i<s.size();i=i+4)
    {

     if(s[i]=='1'&&(s[i+1]=='1'||s[i+2]=='1'))
     {
         ile++;
     }
}
  if(ile>0)return false;
  return true;


}
int main()
{
   string s;

   int ile_A=0;
   ifstream we("cc.txt");

   for(int i=0;i<500;i++)
   {
       we>>s;
  if(czy_B(s))ile_A++;

   }
   cout<<ile_A<<endl;



    return 0;
}

"Zwróć również uwagę, że popełniłeś błąd przy indeksowaniu."-trochę nie wiem o co Ci chodziło,poprwiłem jak pisałeś i nadal zły jest wynik 

1
komentarz 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Teraz jest dobrze.

Wyjaśniam o co chodzi z indeksowaniem. Weźmy np. string:

1 0 1 0   1 0 0 1   0 0 1 1

Jego długość wynosi 12 znaków. Pierwsza jedynka, w pierwszej cyfrze ma indeks i = 0. Jeśli u Ciebie było (i + 1), to pomijałeś pierwszą jedynkę i brałeś od razu zero.

Jedynka w następnej cyfrze ma indeks: 4, itd.

Wyczyść ten cały kod - usuń tablicę i funkcję zewnętrzną, bo to zabagnia program (prosty), a w tym momencie utrudnia sprawdzanie.

Nie psuj tego, co masz. Zrób obok nowy, równoległy projekt. (Będzie prosty i o połowę krótszy).
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)
elegancko :).działa ,dzięki :)

Nie znaleziono podobnych pytań

92,615 zapytań

141,465 odpowiedzi

319,780 komentarzy

61,997 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!

...