Hledání sudého prvku v poli C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hledání sudého prvku v poli C – C / C++ – Fórum – Programujte.comHledání sudého prvku v poli C – C / C++ – Fórum – Programujte.com

 

CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #1
-
0
-

Zdravím vás,

mám menší problém u pole. Potřebuju napsat program, kde funkce vyhledá první sudé číslo v dynamickém 10prvkovém poli, následně ho odstraní, prvky přepíše a pole zmenší na 9 prvků.

Mám tohle:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define N 10


int _tmain(int argc, _TCHAR* argv[])
{
    unsigned int *a;
    unsigned int *za;
    int i;
    int prvek;

    a = (unsigned int *)malloc(sizeof(unsigned int)*N);

    printf("Nacti deset cisel:\n", i);

    for(i=0; i<N; i++){
        scanf("%d", &a[i]);
    }
    for(i=0; i<N; i++) printf("%d", a[i]);


    for(i=0; i<N; i++){
        if (a[i]%2 == 0){
            prvek = a[i];
            for (i=prvek; prvek<N-1; i++){
                a[i] = a[i+1];
            }
        }
        za = (unsigned int *)malloc(sizeof(unsigned int)*9);
        za = a;
        printf ("%d", za[i]);

        free(a);
        a = NULL;
    }

    system("PAUSE");
    return 0;
}

Program mi vyhodí nějakou šílenou chybu u if (a[i]%2 == 0).

Díky předem za jakékoliv rady.

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
15. 11. 2012   #2
-
0
-

nebolo by lepsie len posunut vsetky prvky nachadzajuce sa za neparnym prvkom a tym padom prepisat ten neparny?

nemusel by si vobec dynamicky alokovat pamet.

Nahlásit jako SPAM
IP: 194.160.104.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #3
-
0
-

chybu to hlasi protoze sis pod sebou podrezal vetev...  s tim free v cyklu

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #4
-
0
-

#2 vitamin
máme to alokovat dynamicky

#3 KIIV
oukej, spraveno

Nahlásit jako SPAM
IP: 93.187.106.–
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #5
-
0
-

Jinak ještě jsem spravil u druhého for cyklus:

for(i=0; i<N; i++){
        if (a[i]%2 == 0){
            prvek = a[i];
            for (i=prvek; prvek<N-1; i++){
                prvek = a[i+1];
            }
        }
        za = (unsigned int *)malloc(sizeof(unsigned int)*9);
        za = a;
        printf ("%d", za[i]);
	}

prvek = a[i+1] a jedou mi tam do nekonečně samé 9 :))

Nahlásit jako SPAM
IP: 93.187.106.–
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #6
-
0
-

Nejspíše z důvodu toho, že alokuju paměť v cyklu, takže to jsem taky vyhodil mimo cyklus:

for(i=0; i<N; i++){
        if (a[i]%2 == 0){
            prvek = a[i];
            for (i=prvek; prvek<N-1; i++){
                prvek = a[i+1];
            }
        }
}
za = (unsigned int *)malloc(sizeof(unsigned int)*9);
za = a;

for (i=0; i<N-1; i++) printf ("%d", za[i]);

free(a);
a = NULL;

a teď už mi to nevypisuje to nové pole vůbec

Nahlásit jako SPAM
IP: 93.187.106.–
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #7
-
0
-

Tak po pár úpravách už v pohodě, jen mám problém s for


    for(i=0; i<N; i++){
        if (a[i]%2 == 0){
	    prvek = a[i];
            for (i=prvek; prvek<N; i++){
                prvek = a[i+1];
            }
        }
}

Pole odstraní poslední prvek.

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #8
-
0
-

ja moc nechapu proc si prepisujes i pomoci hodnoty v "prvek" ...

byt tebou vyuziju spis stavovy automat...  dva stavy "nenalezeno" a "posouvame o jedna zpet"

neco jako:  int stav=0;   for ( ... ) { if ( stav ) { a[i-1]=a[i]; } else { stav = (a[i]%2 == 0); } }

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #9
-
0
-

Mě už se to nechce ten program moc překopávat, mám to takhle:


for(i=0; i<N; i++){
    if (a[i]%2 == 0){
	prvek = a[i];
        for (j=prvek; j<N; j++){
            a[j] = a[j+1];
        }
    }
}

Nešlo by to v tomhle nějak popachtit? Když program spustím a napíšu pole:

1 3 5 7 6 4 5 7 8 5

vypíše mi to:

1 3 5 7 4 5 5 7 5

První sudý prvek to odstraní, ale pak se následující číslice zdvojí a prostě moc nechápu co se tam děje.

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #10
-
0
-

kdyz nevis co se deje pouzij vypisy ...

for(i=0; i<N; i++){
    printf(">> a[%d] = %u\n",i,a[i]);
    if (a[i]%2 == 0){
	prvek = a[i];
        for (j=prvek; j<N; j++){
            printf(">>>> j=%d a[j]=%u a[j+1]=%u prvek=%u\n",j,a[j],a[j+1],prvek);
            a[j] = a[j+1];
        }
    }
}
Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
15. 11. 2012   #11
-
0
-

popravdě se mi tam moc nelíbí ten vnořenej cyklus.. na tvém místě bych to udělal jednoduše po krocích, je to pak přehlednější :) např. takto 

int main()
{
    int i, j, iSude = -1;
    int* pole = (int*)calloc(N, sizeof(int));
    int* novePole = NULL;

    // 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
    for (i = 0; i < N; i++)
        *(pole + i) = i + 5;

    // najde prvni sude cislo
    for (i = 0; i < N; i++)
    {
        if (!(*(pole + i) % 2))
        {
            iSude = i;
            break;
        }
    }
    
    // pokud bude nejaky sudy cislo
    if (iSude != -1)
    {
        novePole = (int*)calloc(N - 1, sizeof(int));
        
        for (i = 0, j = 0; i < N; i++)
        {
            if (i != iSude)
                *(novePole + j++) = *(pole + i);
        }
        free(pole);
    }

    if (novePole)
        free(novePole);

    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #12
-
0
-

#11 ingiraxo
ja mu navrhoval ten stavovej automat.. zvladl by to v jednom cyklu a jeste by to fungovalo :D

co dela ten vnorenej cyklus + co dela to indexovani od hodnoty na nejaky pozici, kterou dava do j to mu presne ukazou ty vypisy ... (samozrejme jeden vetsi nesmysl nez druhej)

(proste se mu to prej nechce prekopavat.. stejne bude muset :D)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #13
-
0
-

#12 KIIV
Jasně, funguje, jenže programování není mojí silnou stránkou, C jazyk už vůbec ne, navíc se ho učím asi 2 měsíce a ještě sám a musím plnit úkoly, kdy některé jsou pro mě bohužel složité, to znamená že se vyhýbám pro mě "složitějším" řešením i když jsou třeba kratší a vypadají líp, protože to budu muset obhajovat.

Můžeš mi prosímtě ještě vysvětlit jak funguje ten stav? Ještě jsem nikde neviděl, že je v podmínce čistě jen číslo a pak, že stavu přiřazuju hodnotu ...

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #14
-
0
-

no funguje jako rozliseni jestli jeste hledas prvni sude cislo nebo uz bylo nalezene a maji se jen posouvat prvky o jedno zpet... na tom sudym prvku se nastavi stav=1 a vsechny dalsi kola uz se zpracovavaji prvni casti podminky (a dokud se nenaslo sudy cislo tak se to zpracovavalo vetvi v else

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
15. 11. 2012   #15
-
0
-

řešení do jednoho cyklu (podle mě kratší už nejde) 

int main()
{
    int i, j, tmp = 0;
    int* pole = (int*)calloc(N, sizeof(int));
    int* novePole = (int*)calloc(N - 1, sizeof(int));

    // predpokladam, ze je pole naplneny
    for (i = 0, j = 0; i < N; i++)
    {
        // pokud bude sudy cislo, tak zvedne tmp o 1
        if (!(*(pole + i) % 2)) tmp++;
        // pokud tmp nebude 1 (nebude prvni sudy cislo)
        if (tmp != 1) *(novePole + j++) = *(pole + i);
        else tmp++; // popkud tmp bude prvni sudy cislo, tak opet zvedne o 1
    }
    free(pole);
    free(novePole);
    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #16
-
0
-

#15 ingiraxo
No, tenhle cyklus mi maže poslední prvek.

#14 KIIV
Noo, tak nějak mi to pořád nedává smysl :)) Nechápu jak se může tvořit podmínka stylem - jestliže 0 pak ... Kdybys to mohl rozebrat ještě více, úplně nějak polopaticky jak pro blbečka :))

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #17
-
0
-

tak tam dej  stav != 0 ... je to to same

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
15. 11. 2012   #18
-
0
-

#16 CrazyWolf
nemůže ti to mazat poslední prvek... pokud ano, máš někde jinde chybu, cyklus je v pořádku

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #19
-
0
-

#17 KIIV
No ..... to chápu, ale, nevím jak to napsat, možná nad tím až moc přemýšlím :)) Prostě nechápu jak ten cyklus může poznat, že je stav různý od 0, když je zrovna nastaven na 0, opravdu bych to potřeboval vysvětlit celý ten cyklus úplně polopaticky.

#18 ingiraxo
Dobře, zkusím si to pak ještě prokontrolovat. Děkuju :)

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2012   #20
-
0
-

cyklus nepozna... ten if uvnitr ano... a pokud je to nula tak se testuje, jestli neni cislo sude.. jakmile je tak se nastavi stav na 1 a jde to do jiny vetve (uz se dal netestuje sudy ale jen se presouvaji prvky na predchozi pozici)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CrazyWolf
~ Anonymní uživatel
11 příspěvků
15. 11. 2012   #21
-
0
-

#20 KIIV
aaha dobře, výborně, to už vcelku chápu :)

Tak jo, děkuju vám moc všem :)

Nahlásit jako SPAM
IP: 93.187.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 83 hostů

Podobná vlákna

Hledání umístění prvku v poli — založil Laura a Naty

Počet prvků poli — založil suchla12

Sčítání prvků v poli — založil vazbok

Kombinace prvků polí — založil JIRKAS

Počet prvků v poli — založil Hmm

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý