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

Problem z zliczeniem elementów tablicy, których suma cyfr osiąga podaną wartość

VPS Starter Arubacloud
+1 głos
448 wizyt
pytanie zadane 19 lutego 2021 w C i C++ przez NukaNuka56 Obywatel (1,080 p.)

Witam,

Mam takie zadanie: 

Losuje tablicę 20 elementową z liczbami z zakresu 50-99  

Zlicza elementy tablicy, których suma cyfr osiąga podaną wartość

I mam taki kod:

 

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;
int sum_cyfr(int tab[],int liczba);

int main()
{
 int tab[20],i,liczba;
    srand(time(NULL));
    for(i=0;i<20;i++)
    {
        tab[i]=rand()%50+50;
        cout<<tab[i]<<"  ";
    }
    cout<<endl;
    cout<<"Podaj Liczbe: ";
    cin>>liczba;
    cout<<"Podana sume cyfr zlicza tyle elemntow tablicy: "<<sum_cyfr(tab,liczba)<<endl;
    return 0;
}
int sum_cyfr(int tab[],int liczba)
{
    int i,wynik=0;
    for(i=0;i<20;i++)
    do
{
    wynik=wynik+liczba%10;
    liczba=liczba/10;
}
    while(liczba!=0);
    return wynik;
}

 

Problem jest taki, że nie zlicza poprawnie elementów tablicy, których suma cyfr osiąga podaną wartość

Przykładowo:

Podaj liczbę 10, czyli elementy tablicy,ktory się składa na to to liczba np. 82, 91 itd.

I nie wyświetla tej liczby poprawnie.

Co muszę zmienić w kodzie?

1 odpowiedź

0 głosów
odpowiedź 19 lutego 2021 przez VBService Ekspert (255,840 p.)
wybrane 19 lutego 2021 przez NukaNuka56
 
Najlepsza
  1. W funkcji sum_cyfr nie "rozbijasz" na cyfry wartości z tablicy tab[], tylko liczbę podaną przez użytkownika liczba
  2. Po wyjściu z pętli do {...} while() - nie "zerujesz" zmiennej wynik

wink

int sum_cyfr(int tab[],int liczba)
{
    if (liczba == 0) return 0;
    if (liczba < 0) liczba *= (-1); // Pozbywamy sie minusa -9 = 9  ;-)
    
    int wynik, ile=0, temp=0;
    
    for (int i=0; i<20; i++)
    {
        temp = tab[i];
        wynik=0;
        
        do
        {
            wynik+=temp%10;
            temp/=10;
        }
        while (temp !=0 );
        
        if (liczba == wynik) ile++;
    }
        
    return ile;
}

 

komentarz 19 lutego 2021 przez NukaNuka56 Obywatel (1,080 p.)
Dzięki za pomoc!
komentarz 19 lutego 2021 przez VBService Ekspert (255,840 p.)
edycja 20 lutego 2021 przez VBService

wink

#include <iostream>
#include <ctime>
#include <vector>
 
using namespace std;

int sum_cyfr(int tab[], int liczba, vector<int> &test);
 
int main()
{
    int tab[20], i, liczba;
    vector<int> test;
    
    srand(time(NULL));
    for (i=0; i<20; i++)
        tab[i] = rand()%50+50;

    cout << endl
         << "Podaj Liczbe: ";
     cin >> liczba;
    cout << "Podana sume cyfr zlicza tyle elemntow tablicy: " 
         << sum_cyfr(tab, liczba, test) << endl << endl;
    
    for (int element: tab)
        cout << element << "  ";
            
    if (test.size() > 0) {
        cout << endl;

        for (i=0; i<20; i++) {
            bool arrow = false;

            for (int x=0; x<test.size(); x++)
                if (tab[i] == test[x]) {
                    arrow = true;
                    test.erase(test.begin() + x);
                    break;
                }
                else
                    arrow = false;
                    
            cout << ((arrow) ? "^^  " : "    ");
        }
    }

    return 0;
}

int sum_cyfr(int tab[],int liczba, vector<int> &test)
{
    if (liczba == 0) return 0;
    if (liczba < 0) liczba*=(-1); // Pozbywamy sie minusa -9 = 9  ;-)
    
    int wynik, ile=0, temp=0;
    
    for (int i=0; i<20; i++) {
        temp = tab[i];
        wynik=0;
        
        do {
            wynik+=temp%10;
            temp/=10;
        } while (temp !=0 );
        
        if (liczba == wynik) {
            ile++;
            test.push_back(tab[i]);
        }
    }
        
    return ile; // = test.size()
}

c++ foreach ]  [ c++ vector operations ]  [ vector::erase() ]

Podobne pytania

0 głosów
2 odpowiedzi 861 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez abcd Początkujący (290 p.)
0 głosów
0 odpowiedzi 253 wizyt
pytanie zadane 10 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)

93,005 zapytań

141,971 odpowiedzi

321,251 komentarzy

62,343 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...