• 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
380 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 (251,210 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 (251,210 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 799 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez abcd Początkujący (290 p.)
0 głosów
0 odpowiedzi 167 wizyt
pytanie zadane 10 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...