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

Sumowanie wartości char

Object Storage Arubacloud
0 głosów
1,311 wizyt
pytanie zadane 2 kwietnia 2018 w C i C++ przez Scypyon Gaduła (3,450 p.)

Mam takie zadanie:

Napis pierwszy to taki napis, w którym suma kodów ASCII jest liczbą pierwszą.
Przykładowo, suma kodów ASCII w napisie ABB wynosi 197 i jest liczbą pierwszą,
co oznacza, że napis ABB jest napisem pierwszym. Podaj, ile jest napisów pierwszych
w pliku NAPIS.TXT.

Jak mam  sprawdzić, numer w tabeli ASCII jaki ma dana literka?

póki co kombinowałem coś w ten deseń:

#include <iostream>
#include <fstream>

using namespace std;

int czy_pierwsza(string c){

    int z=c.size();
    int x = 0;
    char y[25];

    for(int i=0;i<z;i++){

        c[i]=y[i];
        x+=y[i];
    }
    

    return x;
}

int main()
{
    fstream plik;

    plik.open("NAPIS.TXT", ios::in | ios::out);

    string c;
    char z;

    while(!plik.eof()){
        plik>>c;

        cout<<czy_pierwsza(c)<<endl;
    }

    return 0;
}

Jednak wyniki są na minusie, więc na pewno coś jest nie tak. Zależy mi na rozwiązaniu maturalnym, w sensie takim ,aby przeszło przez GNU kompilator i oczywiście na CodeBlocks.

Z góry dziękuje za pomoc :)

4 odpowiedzi

+1 głos
odpowiedź 2 kwietnia 2018 przez kuba1176 Początkujący (340 p.)
Nie potrzebujesz tej tablicy y. Wystarczy że zrobisz rzutowanie: x+=(int)c[i];

No i potem musisz tylko sprawdzić czy wartość zmiennej x jest pierwsza.
komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
możesz rozwinąć? W sensie pokazać w kodzie?
+1 głos
odpowiedź 2 kwietnia 2018 przez RafalS VIP (122,820 p.)

Typ char w c++ to liczba, domyślnie wyświetlana jako jej reprezentacja znakowa w tablicy ASCII, możesz np zrobić coś takiego char c = 'a' + 1; i masz 'b'. Wystarczy zsumować literki w liczniku typu int, bo charowi mogło by braknąć pojemności. Nie potrzebujesz żadnej konwersji.
Co do kodu to rozwiązanie na razie nie ma sensu, bo sumujesz jakieś śmieci (niezainicjalizowane wartości) z tablicy y. Po drugie nadpisujesz kolejne literki stringa tymi niezaiinicjalizowanymi śmieciami z tablicy y.
Jeśli nie wiesz o czym mówie to puść sobie taki kod:

#include <iostream>
int main()
{
    int tab[5];
    for(int i = 0; i <5; i++)
        std::cout<<tab[i]<<" ";
}


Nie podam Ci gotowego rozwiązania, bo to się mija z celem ;P

komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)

Czyli załóżmy ,że Zapisuje ASDAS jako string , podaje do funkcji również jako string i potem robię:

    int z=c.size();
    int x = 0;
    char y;

    for(int i=0;i<z;i++){

        y=c[i];
        x+=y;
    }

czy int y; ?

komentarz 2 kwietnia 2018 przez RafalS VIP (122,820 p.)
a jakbyś zsumował wartości z tablicy intów?
komentarz 2 kwietnia 2018 przez RafalS VIP (122,820 p.)
znaczy ten kod już ma większy sens, ale nie potrzebujesz wcale tego char y, spróbuj po prostu x+=z[i];
komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
wydaje się wporządku, liczby dodatnie, niektóre po parę tys, ale na pewno takie rozwiązanie jest dobre??
komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
można odczytywać szufladkę stringa jako int? i wtedy daje numer ascii?
komentarz 2 kwietnia 2018 przez niezalogowany
Możesz rzutować ją na int. Czasami dzieje się to domyślnie (automatycznie). Jak wyżej w przypadku x += y.
komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
W takim razie dokończę wieczorem zadanie i jeżeli wszystko będzie śmigało daje naj :) Dzięki
0 głosów
odpowiedź 2 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Zmienna typu char przechowuje właśnie numer w tablicy ASCII danego znaku. Błąd w kodzie jest w tym miejscu:

c[i]=y[i];

Przypisanie jest nie w tą stronę. Poza tym ta tablica jest do niczego niepotrzebna w tym zadaniu.

PS. Nazywaj jakoś sensownie zmienne. Nazywanie zmiennych literami a, b, c... jest bardzo złą praktyką.

komentarz 2 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
Zgadzam się, w językach które używam na co dzień tak nie robię. Tak wiem ,że tutaj jest błąd, jednak jak go naprawić?
0 głosów
odpowiedź 2 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

Poniżej przykladowy kod, który sumuje wartości  ASCII pojedynczych znaków w słowie "ABB".

U Ciebie słowem jest zmienna string c.

#include <iostream>
using namespace std;

 int main()
 {
  string slowo = "ABB";
  size_t licznik = 0;
  for (int i = 0; i < slowo.size(); i++)
  licznik = licznik + slowo[i];

  cout << licznik << endl;
 }
  

 

komentarz 4 kwietnia 2018 przez Scypyon Gaduła (3,450 p.)
size_t ? co to jest?
komentarz 4 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
'size_t'  jest typem zmiennej (jak np.: int, float, double), który stosuje się do liczb /zmiennych o wartościach całkowitych, dodatnich. Prosty licznik jest tego typu zmienną, nie przyjmuje wartości ujemnych.

Zamiast:  size_t licznik;  równie dobra będzie deklaracja:  int licznik.

Podobne pytania

0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 11 października 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)
+1 głos
2 odpowiedzi 438 wizyt
pytanie zadane 25 lutego 2021 w JavaScript przez MarcoPolo Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 27 kwietnia 2019 w SQL, bazy danych przez Shimeo7 Obywatel (1,910 p.)

92,575 zapytań

141,425 odpowiedzi

319,650 komentarzy

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

...