Porównywanie liczb oddzielonych przecinkami w dwóch stringach

2014-02-11 19:20

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

0

Witam

Mam problem z zadaniem:

Napisz program który przyjmuje dwa ciągi liczb naturalnych oddzielonych przecinkiem typu string. Porównaj ze sobą dwa ciągi i wypisz na ekran te liczby które się powtarzają w obu ciągach.

Tutaj przedstawiam moje wypociny. Otóż jestem dopiero początkujący wiec nie znam wszystkich komend itp wiec jeżeli macie jakiś pomysł na skrócenie tego kodu bądź "ulepszenie" czy nawet dorzucenie jakiś rad byłbym bardzo wdzięczny. Mam jeszcze problem, czy jest jakiś znak który oznacza koniec stringu ? W programie nie zczytuje mi ostatniej liczby gdyż nie ma tam przecinka i zamiast tego chciałbym wskazać koniec stringa.

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(int argc, char* argv[])
{
    string a ("12,13,34,35,67,78");
    string b ("11,14,54,163,78,23,87,13,12");
    string c, z;
    int j, q, k=1, f=0, v=0, x=1;
    for(int i=0; i<a.length();i++)
    {
        if(ispunct(a[i]))
        {
            x++;
        }
    }

    for(int i=0; i<b.length();i++)
    {
        if(ispunct(b[i]))
        {
            k++;
        }
    }
    int *tab=new int[x];
    int *tab2=new int[k];
    c=a[0];
    z=b[0];

    for(int i=1;i<a.length();i++)
    {

        if(a[i]!=',')
        {
            c+=a[i];
        }
        else if(a[i]==',' || a[i]=='\0') //tutaj mam problem bo chce zeby if sie wykonal jesli napotka przecinek lub koniec stringu
        {
            istringstream m(c);
            m>>j;
            tab[f]=j;
            f++;
            c.clear();
            c=a[i+1];
            i++;
        }
    }
    c.clear();

    for(int i=1;i<b.length();i++)
    {

        if(b[i]!=',')
        {
            z+=b[i];
        }
        else if(b[i]==',')
        {
            istringstream g(z);
            g>>q;
            tab2[v]=q;
            v++;
            z.clear();
            z=b[i+1];
            i++;
        }
    }
    z.clear();

    for(int i=0;i<x;i++)
        for(int j=0;j<k;j++)
        {
            if(tab[i]==tab2[j])
                cout<<tab[i]<<", ";

        }

    system("PAUSE");
    return 0;
} 

Pozostało 580 znaków

2014-02-11 19:35

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

0

używasz stringstream i string to czemu nie użyć vector?

int v;
vector<int> va,vb;
for(istringstream ss(a);ss>>v;ss.getchar()) va.push_back(v);
sort(va.begin(),va.end());
for(istringstream ss(b);ss>>v;ss.getchar()) vb.push_back(v);
sort(vb.begin(),vb.end());

dalej to już wiadomo.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
to pewnie zadanie do jakiejś szkoły - jak on się z tego wytłumaczy? :D - Ola Nordmann 2014-02-11 19:44
że zajrzał do podręcznika? - _13th_Dragon 2014-02-11 20:14
albo skorzystał z internetu ? :D - Shulder 2014-02-11 20:40
to chyba już nie te czasy kiedy to studentom informatyki zabraniano używać komputera do nauki ;D - _13th_Dragon 2014-02-11 20:43
dokładnie, teraz wszystko kodzi się na kartce :P - Shulder 2014-02-11 20:51

Pozostało 580 znaków

kq
2014-02-11 19:35
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 16 godzin temu

Lokalizacja: Szczecin

0

Koniec wpisywania - Zabezpieczenie przed wpisywaniem liter zamiast ignorować inne znaki, po prostu uznaj je za zakończenie podawania liczb.

Co do porównywania zawartości, to jest raptem kilka linijek kodu, jeśli użyjesz std::set i std::set_intersection http://en.cppreference.com/w/cpp/algorithm/set_intersection


Pozostało 580 znaków

2014-02-11 19:42

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

1

Co do problemu w kodzie. Usuń stamtąd else.

Skrócenie kodu (nie używam takich hardcore'owych rzeczy jak iteratory) - to każdy początkujący zrozumieć MUSI:

string liczba1, liczba2;

int i = 0;
int j = 0;
while( i < string1.length() ) 
{
   while( string1[i] != ',' && string1[j] != '\0' )
      liczba1 += string1[++i];

   ++j;  //omiń przecinek

   while( j < string2.length() )
   {
          while( string2[j] != ',' && string2[j] != '\0' )
             liczba2 += string2[++j];

          ++j;  //omiń przecinek

          if( liczba1 == liczba2 ) cout<<liczba1<<endl;

          liczba2.clear();
   }

   liczba1.clear();
}

edytowany 1x, ostatnio: Ola Nordmann, 2014-02-11 19:43

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0