Che Posted June 8, 2014 Report Posted June 8, 2014 Salut !Vreau sa fac un program care sa-mi analizeze un grup de x numere si sa-mi zica cate din ele au aceeasi terminatie.M-am gandit sa fac doar pentru 6 ca sa nu ma complic cu prea multe si m-am cam impotmolit.Programul este pe clase.int basic::sameterm(int unu, int doi,int trei,int patru,int cinci,int sase){ //incarcam numerele in vector: int a[10]; a[1] = unu; a[2] = doi; a[3] = trei; a[4] = patru; a[5] = cinci; a[6] = sase; //ciclam prin numere ca sa vedem cate au aceeasi terminatie: int term1, term2; int same_term = 0; for (int z = 1; z <= 3; z++) //verificam doar prima jumatate 6:3=3 de unde si z<=3; for (int i = z + 1; i <= 6; i++) { term1 = a[z] % 10; term2 = a[i] % 10; if (term1 == term2) same_term++; } if(same_term) //in cazul in care sunt doar doua numere cu aceeasi terminatie same_term va fi egal cu 1 si programul va intoarce 1 in loc sa zica ca de fapt sunt doua numere, de asta am adaugat acest if same_term++; return same_term;}Nu stiu cum sa fac sa-mi returneze rezultatul corect. Inital m-am gandit ca daca verific doar prima jumatate din grup (adica primele 3 in cazul in care am un grup de 6 numere) acuma dupa cateva testari se pare ca nu prea iese ceea ce am vrut eu sa fac. Spre exemplu daca le bag pe toate 6 cu aceeasi terminatie imi da rezultatul 13. Cred ca am gasit unde ar fi problema insa nu stiu cum sa o rezolv: daca verifica primele trei numere sa zicem si acestea au toate aceeasi terminatie, atunci same_term va fi 3, chestia e ca programul apoi va verifica si cel de-al doilea numar sa vada daca gaseste vreo terminatie comuna si astfel numerele 2 si 3 vor fi contabilizate de 2 ori (prima oara la verificarea primului numar si a doua oara la verificarea celui de-al doilea numar). Cred ca asta e problema. Nu stiu sigur.Iata si main.cpp:#include <cstdlib>#include <iostream>#include <stdio.h>#include <fstream>#include <basic.h>using namespace std;int main(){ int N1, N2, N3, N4, N5, N6; cout<< "Primul termen este: "; cin>>N1; cout<<"Al doilea termen este: "; cin>>N2; cout<< "Al treilea termen este: "; cin>>N3; cout<<"Al patrulea termen este: "; cin>>N4; cout<< "Al cincilea termen este: "; cin>>N5; cout<<"Al saselea termen este: "; cin>>N6; //incarcam numerele in vector: int a[10]; a[1] = N1; a[2] = N2; a[3] = N3; a[4] = N4; a[5] = N5; a[6] = N6; basic MyObj; int p = MyObj.sameterm(a[1],a[2],a[3],a[4],a[5],a[6]); cout<<"Numere care au aceeasi terminatie: "; cout<<p<<endl; return 0;}Nu stiu vectori si alte tipuri de containeri specifici C++, stiu doar matrici ex. a[x];Ma ajuta cineva ?Multumesc mult ! Quote
Active Members dancezar Posted June 8, 2014 Active Members Report Posted June 8, 2014 Acelasi terminatie adica?123 si 223 au acelasi terminatie?Poti sa imi dai un exemplu?MS:) Quote
Ganav Posted June 8, 2014 Report Posted June 8, 2014 template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); }Codul de mai sus converteste numerele in string-uri. Urmatoarea secventa le inverseaza:#include <algorithm>std::reverse(str.begin(), str.end());Acum poti pune string-urile intr-o matrice:std::vector<std::string> mat = {"123", "223"};Cum poti intera prin prima litera a fiecarui string. Iei prima valoare si o retii. Pe masura ce treci prin matrice verfici care se potrivesc si memorezi indexul. Quote
Che Posted June 8, 2014 Author Report Posted June 8, 2014 (edited) Acelasi terminatie adica?123 si 223 au acelasi terminatie?Poti sa imi dai un exemplu?MS:)Da, au aceeasi terminatie. La fel ca 11,21,31,41,51 si 55,95,105,305.template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); }Codul de mai sus converteste numerele in string-uri. Urmatoarea secventa le inverseaza:#include <algorithm>std::reverse(str.begin(), str.end());Acum poti pune string-urile intr-o matrice:std::vector<std::string> mat = {"123", "223"};Cum poti intera prin prima litera a fiecarui string. Iei prima valoare si o retii. Pe masura ce treci prin matrice verfici care se potrivesc si memorezi indexul.Nu poti face, te rog, o clasa, fara vectori ca eu nu stiu vectori ?Sau daca nu, poate reconstruiesti cu vectori (daca nu poti altfel) clasa data de mine mai sus dar care sa faca ceea ce trebuie, fara buguri, adica sa imi zica exact cate numere au aceeasi terminatie ?Multumesc mult ! Edited June 8, 2014 by Che Quote
H3xoR Posted June 8, 2014 Report Posted June 8, 2014 bool Numere_cu_terminatie_egala(int a, int { return a % 10 == b % 10;} Quote
Che Posted June 8, 2014 Author Report Posted June 8, 2014 bool Numere_cu_terminatie_egala(int a, int { return a % 10 == b % 10;}Pai si cand ai mai mult de doua numere cum faci ? Eu am de verificat 6 spre exemplu. Algoritmul asta al tau pare sa verifice doar doua, nu ? Ia doar doi parametri... Quote
1337 Posted June 8, 2014 Report Posted June 8, 2014 (edited) Poftim ceva foate basic:#include <iostream>using namespace std;int main(){ int n,terminatie,i,numere[50],x=0; cout << "n:"; cin >> n; cout << "terminatie:"; cin >> terminatie; for(i=1;i<=n;i++) { cout << i << ":"; cin >> numere[i]; } for(i=1;i<=n;i++) { if(terminatie==numere[i]%10) x++; } cout << x << " numere se termina in " << terminatie;} Edited June 8, 2014 by 1337 Quote
H3xoR Posted June 8, 2014 Report Posted June 8, 2014 (edited) #include <cstdarg>bool Numere_cu_terminatie_egala(int k, ...){ va_list argumente; va_start(argumente, k); int ultima_cifra_a_primului_nr = va_arg(argumente, int) % 10; for (int i = 1; i < k; i++) if (ultima_cifra_a_primului_nr != (va_arg(argumente, int) % 10)) return false; va_end(argumente); return true;}?i se folose?te a?a:int nr_numere = 4;int a = 234;int b = 34;int c = 4;int d = 2424;if (Numere_cu_terminatie_egala(nr_numere, a, b, c, d)) cout << "Toate numerele au terminatia egala!";else cout << "Nu toate numerele sunt egale!"; Edited June 8, 2014 by H3xoR Quote
nedo Posted June 8, 2014 Report Posted June 8, 2014 In cazul in care am inteles corect, tu vrei sa vezi cate numere au aceeasi terminatie, nu care numere au aceeasi terminatie, corect?In cazul asta iata ce am facut eu.In codul meu trebuie sa creezi matricea cu int-urile doar o singura data, restul se trimite prin pointeri unde trebuie. De asemenea daca vrei sa iti afiseze si acolo unde exista 1 singur numar cu terminatia respectiva modifica linia :if(terminatii <= 1)cu if(terminatii == 0)#include <iostream>using namespace std;class terminatie{public: terminatie(int* matrice, int marime_matrice); terminatie(const terminatie& t); void aceeasiTerminatie();private: int* m_matrice; int m_marime_matrice;};terminatie::terminatie(int* matrice, int marime_matrice) : m_matrice(matrice), m_marime_matrice(marime_matrice){}terminatie::terminatie(const terminatie& t){ m_matrice = t.m_matrice; m_marime_matrice = t.m_marime_matrice;}void terminatie::aceeasiTerminatie(){ int terminatii[10] = {}; for(int i = 0; i < m_marime_matrice;i++) { terminatii[m_matrice[i] % 10]++; } cout << "Printam cate terminatii sunt pentru fiecare cifra. Unde este unul sau nici un numar se trece peste.\n"; for(int i = 0; i < 10;i++) { if(terminatii[i] <= 1) { continue; } cout << "Exista " << terminatii[i] << " cu terminatia " << i << endl; }}int main(){ int matr[] = {15, 24, 32, 11, 65, 55, 42, 44, 18, 55}; terminatie t(matr, 10); t.aceeasiTerminatie(); //cout << "Hello world\n"; return 0;} Quote