Usuwanie elementu tablicy

Odpowiedz Nowy wątek
2011-10-15 14:24
0

Witam. Mam problem z pewnym programem. Program ma na celu usunięcie podanej cyfry z podanego ciągu liczb.

Przykładowe wejście:

5 1234512345
7 1234567
5 50000
7 777

Przykładowe wyjście:

12341234
123456
0
0

Pytania:

  1. Jak najprościej usunąć dany element z tablicy? Bo jak wstawię jakiś pusty znak to jest przerwa przy wypisywaniu, której ma nie być. Może da się coś wstawić zamiast danej cyfry, co nie będzie wyświetlane?
  2. Jak zrobić, żeby przy tablicy samych zer wypisało tylko jedno 0?

Pozostało 580 znaków

2011-10-15 14:39
0

1) Nie ma czegoś takiego jak usuwanie elementów tablicy, możesz co najwyżej przesunąć wszystkie elementy na prawo do usuwanego o jedną pozycję w lewo.
2) Sprawdzasz czy w tablicy są same '0' i jeżeli tak to wypisujesz tylko jedno '0'


Pozostało 580 znaków

2011-10-15 14:53
0

Co do 1 możesz go ominąć przy wypisywaniu instrukcją warunkową albo utworzyć nową tablice bez tego elementu?


// Ominięcie podanej 
using System;

class App
{
    static void Main()
    {
        int[] Tab = new int[] { 1,2,3,4,5,1,2,3,4,5 };
        Console.Write("Liczba do usunięcia: ");
        int U = Convert.ToInt32(Console.ReadLine());
        for (int i = 0; i < Tab.Length; i++)
        {
            if (Tab[i] == U)
                continue;

            Console.Write(Tab[i]);
        }
        Console.ReadLine();
    }
}

Co do 2 to sprawdzasz czy w tablicy są jakieś inne znaki prócz 0 jeśli nie to wypisujesz tylko jedno 0?

using System;

class App
{
    static void Main()
    {
        // int[] Tab = new int[5]; // Same zera
        int[] Tab = new int[5] { 0, 0, 0, 3, 0 };
        bool SameZera = true;

        for (int i = 0; i < Tab.Length; i++)
        {
            if (Tab[i] != 0)
            {
                SameZera = false;
                break;
            }
        }
        if (SameZera == false)
        {
            for (int i = 0; i < Tab.Length; i++)
            {
                Console.Write(Tab[i]);
            }
        }
        else
        {
            Console.Write(0);
        }
        Console.ReadLine();
    }
} 

Wiem, że temat jest pod C/C++ ale nie mam kompilatora c++ na kompie, żeby sprawdzić czy bym nie podał głupoty jakiejś:P
A C# jest od c++ i nie problem będzie przenieść.

edytowany 3x, ostatnio: nerf, 2011-10-15 15:06

Pozostało 580 znaków

2011-10-15 15:24
0

Nie możesz po prostu:
1) wczytać cyfrę do usunięcia
2) wczytać liczbę
3) wpisywać do listy kolejne cyfry, sprawdzając, czy wpisywana cyfra nie jest równa tej, którą masz usunąć (jeżeli tak - nie wpisuj)
4) utworzyć nową liczbę z cyfr z listy (wtedy ewentualne 0 z przodu same ci znikną) [wczytujesz 1 cyfrę, mnożysz przez 10, dodajesz kolejną, mnożysz przez 10 itd. dopóki tablica.size()!=0]
Ja bym tak zrobił.


edytowany 2x, ostatnio: merlinnot, 2011-10-15 15:25

Pozostało 580 znaków

2011-10-15 15:36
0

Ja bym zamienił na string'a i nie bawił się w tworzenie nowej tablicy.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-10-15 18:39
1

Dziękuję Wam wszystkim za pomoc.

Program działa. Jednak zapomniałem o jedym warunku, że jeśli podana cyfra będzie = 0 i jestli podany ciag licz tez bedzie zerem to program ma nic nie wypisywac. Probowałem róznych warunków, ale zawsze mi zero dawa na wyjsciu. jakas sugestia?

 #include <iostream>

using namespace std;

int main ()
{
char n;
int i=0,j,k=0,l,m;
char liczba[256];
char tab[256];
bool SameZera = true;

cin >> n;                   //podana cyfra
cin >> liczba;              //podany ciag cyfr

//sprawdzanie ilosci niepustych elementow tablicy
while (liczba[i] != '\0')
{
    i++;
}

//tworzenie nowej tablicy z cyframi roznymi od podanej
for (m=0; m<i; m++)
{
    if (liczba[m] != n)
    {
        tab[k]=liczba[m];
        k++;
    }
}

//sprawdzanie za pomoca funkcji czy tablica nie jest pelna zer
for (j = 0; j < k; j++)
{
    if (tab[j] != 48)
        {
            SameZera = false;
            break;
        }
}

//wypisanie nowej tablicy z poprawnymi cyframi
if (SameZera == false)
{
     for (l=0; l<k; l++)
     cout << tab[l];
}
//Wypisanie zera w przypadku samych zer w tablicy
else
{
    cout << 0;
}

return 0;
}

Pozostało 580 znaków

2011-10-15 19:24
0

dawa ;-D +1 za to ;]
Jak nie umiesz w inny sposób to sprawdz długość stringa, zarezerwuj pamięć dla następnego o tej samej długości, uzupełnij go zerami i porównaj stringi. Albo poprostu sprawdź czy pierwsza cyfra to 0, jeżeli tak, to sprawdź pozostałe za pomocą pętli, jeżeli jest któraś z cyfr rózna od 0, to wykonujesz program, jeżeli nie, to go kończysz.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-10-15 19:37
0

Program zrobiłem, moim zdaniem działa, jednak system sprawdzający go nie przyjmuje. Zwraca błąd - Wrong Answer

Polecenie zadanie:

 For years, all contracts of the Association of Contracts for Modernization (ACM) were typed using an old typewriter machine. 

 Recently Mr. Miranda, one of the accountants of the ACM, realized that the machine had a failure in one, and only one, numerical digit. More specifically, the flawed digit, when typed, is not printed on the sheet, as if the corresponding key was not pressed. He realized that this could have changed the numerical representation of contract values. Worried about accounting, Mr. Miranda wants to know, from the original values agreed for the contracts (which he kept in handwritten notes) which values are actually represented in the contracts. For example, if the failed digit in the machine is 5, an agreed value of 1500 would be represented in the corresponding contract as 100, because the digit 5 would not be printed. Note that Mr. Miranda wants to know the numeric value represented in the contract, ie, in the same machine, the number 5000 corresponds to the numeric value 0, not 000 (as it actually appears in the contract). 

 Input  
 The input consists of several test cases, each in one line. Each line contains two integers D and N ( 1D9 and 1N < 10100 ), representing, respectively, the digit that has failed in the machine and the number that was originally agreed for the contract (which can be very large because of hiperinflation). 

 The last test case is followed by a line which contains only two zeros separated by white space. 

 Output  
 For each test case in the input your program must print one line containing a single integer, the numeric value represented in the contract. 

 Sample Input  

5 5000000
3 123456
9 23454324543423
9 99999999991999999
7 777
0 0

 Sample Output  

0
12456
23454324543423
1
0

Moje rozwiązanie:

 #include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main ()
{
char n;
int i=0,j,k=0,l,m;
char liczba[256];
char tab[256];
bool SameZera = true;

cin >> n;
cin >> liczba;

while (liczba[i] != '\0')
{
    i++;
}

for (m=0; m<i; m++)
{
    if (liczba[m] != n)
    {
        tab[k]=liczba[m];
        k++;
    }
}

for (j = 0; j < k; j++)
{
    if (tab[j] != 48)
        {
            SameZera = false;
            break;
        }
}

if ((n==48) && tab[0]==0)
{
  exit(1);
}
else
{
    if (SameZera == false)
    {
        for (l=0; l<k; l++)
        cout << tab[l];
    }

    else
    {
    cout << 0;
    }
}

return 0;
}

Będę wdzięczny osobie, która naprowadzi mnie na błędy w moim rozwiązaniu...


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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