Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 16. 12. 2010 15:01

DeMidix
Příspěvky: 63
Reputace:   
 

pomoc s C++/C

Zdravim,

napsal jsem tři přiklady do C ale ve vysledku mi to haše jiny vysledek než by mělo a vubec nevim kde mam chyvu:
přikald 1
Zadanim je napsat řetezec a vypsat řtezec bez opakovani slov
když zadam např. aaaaaaaaddddddddeeeeeeeeee tak by mi to melo vypsat "ade" ale me to vypiše "aaddee" což by němelo.


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


char *rozsahStr (int n){
  char *p;
  p=(char*)malloc(sizeof(char)*n);
  return p;
}
void bezOpak (char p[]){
  int i, m, j, d=strlen(p);
  char zn;
  for (i=0; i<d; i++){
    zn=p[i];
    for (m=i+1; m<d; m++)
        if (p[m]==zn) {
        for (j=m; j<=d; j++) p[j]=p[j+1];
        d=strlen(p);
      }
    }
}
int main(void) {
  char *str, n;
  printf ("Zadejte pocet znaku, ktere bude retezec obsahovat: ");
  scanf ("%d",&n);
  str=rozsahStr(n);
  printf("Zadej retezec:\n");
  scanf ("%s",str);
  bezOpak(str);
  printf("\nRetezec bez opakovani znaku:\n");
  printf ("%s",str);
  printf ("\n");
  system("PAUSE");
  return 0;
}

přiklad 2
Napište funkci, která ze dvou množin kladných čísel daných prvními dvěma parametry vytvoří v poli daném třetím parametrem množinu, která je sjednocením množin daných prvními dvěma parametry.

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


void seradPole (int p[], int d){
  int i, m, min=0, pom;
  for (m=0; m<d;  m++){
    min=m;
    for (i=m+1; i<d; i++) if (p[i]<p[min]) min=i;
    if (min!=m){
      pom=p[m];
      p[m]=p[min];
      p[min]=pom;
    }
  }
}

void sjednoceni (int p[], int p2[], int p3[]){
  int i=0, d1=0, d2=0, j=0, t=0;
  while (p[d1]!=0) d1++;
  while (p2[d2]!=0) d2++;
  seradPole(p,d1);
  seradPole(p2,d2);   
  while ((p[i]!=0) && (p2[j]!=0)){
    if (p[i]<p2[j]) {
      p3[t]=p[i];
      i++;}
    else{
      p3[t]=p2[j];
      j++;}
    t++;
  }
  if (p[i]==0){
    while (p2[j]!=0){
      p3[t]=p2[j];
      j++; t++;}
  }
  else{
    while(p[i]!=0){
      p3[t]=p[i];
      i++; t++;}
  }
  p3[t]=0;
}
int main(void) {
  int i, pole1[100], pole2[100], pole3[200]; 
  printf ("Zadejte 1. serii hodnot zakoncenou 0\n");
  for (i=0; i<100; i++){
    scanf("%d",&pole1[i]);
    if (pole1[i]==0) break;}
  printf ("Zadejte 2. serii hodnot zakoncenou 0\n");
  for (i=0; i<100; i++){
    scanf("%d",&pole2[i]);
    if (pole2[i]==0) break;}
  sjednoceni (pole1, pole2, pole3); 
  printf ("\n");
  for (i=0; pole3[i]!=0; i++) printf (" %d ",pole3[i]); 
  printf ("\n");
  system("PAUSE");
  return 0;
}

zadam třeba do prvni množiny "1 2 3 0" a do druhy "1 2 4 0" tak by se ta 1 a 2 nemela opakovat v te vysledny ale me se opakuje..

Přiklad 3
Předchozí příklad řešte za předpokladu, že množiny jsou v polích reprezentovány rostoucími posloupnostmi. Funkce pro vytvoření sjednocení musí mít lineární složitost.

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


void sjednoceni (int p[], int p2[], int p3[]){
  int i=0, j=0, t=0;
  while ((p[i]!=0) && (p2[j]!=0)){
    if (p[i]<p2[j]) {
      p3[t]=p[i];
      i++;
    }
    else {
      p3[t]=p2[j];
      j++;
    }
    t++;
  }
  if (p[i]==0){
    while (p2[j]!=0){
      p3[t]=p2[j];
      j++; t++;}
  }
  else{
    while(p[i]!=0){
      p3[t]=p[i];
      i++; t++;}
  }
  p3[t]=0;
}
int main(void) {
  int i, pole1[100], pole2[100], pole3[200]; 
  printf ("Zadejte 1. serii hodnot zakoncenou 0\n");
  for (i=0; i<100; i++){
    scanf("%d",&pole1[i]);
    if (pole1[i]==0) break;}
  printf ("Zadejte 2. serii hodnot zakoncenou 0\n");
  for (i=0; i<100; i++){
    scanf("%d",&pole2[i]);
    if (pole2[i]==0) break;}
  sjednoceni (pole1, pole2, pole3); 
  for (i=0; pole3[i]!=0; i++) printf ("%d ",pole3[i]); 
  printf ("\n");
  system("PAUSE");
  return 0;
}

a tady je stejny problem jak u toho druhyho přikladu.

Mohli by jste se na to mknout a podivat se kde je tam chybu, ja na to nemužu přijit..:(

Diky

Offline

 

#2 16. 12. 2010 17:04

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

V tom prvnim co treba misto tohoto:

    for (m=i+1; m<d; m++)
        if (p[m]==zn) {
        for (j=m; j<=d; j++) p[j]=p[j+1];

napsat tohle:

    while (p[i+1]==zn) {
        for (j=i+1; j<=d; j++) p[j]=p[j+1];

Dalo se to napsat i efektivneji ale nechci ti do rypat :-) Netestoval jsem to, tak kdyztak dej vedet, jestli to funguje.

Mozna se podivam i na ty dalsi.

Offline

 

#3 17. 12. 2010 10:57

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

Jo,

ted to dunguje spravě. Diky moc. Kdyby jsi mel čas se jeste mrknout na ty druhy :).

Jsem v C tak trochu ješte novaček tak je možne že to pišu jinak než by bylo lepši to napsat efektivněji.

Diky

Offline

 

#4 17. 12. 2010 12:17

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

Jak tam mas tu podminku:

    if (p[i]<p2[j]) {
      p3[t]=p[i];
      i++;}
    else{
      p3[t]=p2[j];
      j++;}

Tak musi brat v uvahu i pripad, kdy p[i] a p2[j] jsou stejna. Takhle napriklad kdyz obe jsou 1, tak p2[j] se sice posune dal, ale v p[i] ti porad zustane ta jednicka, takze v pristim kroku se ulozi do p3 znova jednicka.

Dalo by se to upravit treba takhle:


    if (p[i]<p2[j]) {
      p3[t]=p[i];
      i++;}
    else{
      p3[t]=p2[j];
      if (p[i]==p2[j])i++;
      j++;}
    t++;

Offline

 

#5 17. 12. 2010 12:41

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

Diky moc za rady a pomoc asi bych na to nepřišel, čuměl jsem na to ješte s kamošem a nemohli jsme to tam najit.Diky

Ješte by jsme potřebovali poradit s kamošem s timhle:

1.je zadana posloupnost 100 cisel..pak prvky pole serad tak aby zacatek poslopnosti tvorily nezaporna cisla a pak aby byly uz jen zaporna

2.najdi v posloupnsoti min, které se tam objevuje 2x.


napadlo nas že u toho prvniho by jsme je načetli nebo  udělat to s desitkou a pak ji přepsat na 100.seřadili by jsme je BubbleSortem ale nevime jestli by to bylo dobře nebo jak to vubec napsat.

a u ty 2 nevime vubecm.

mohl by jsi nam nějak poradit jak začit, jak to napsat nebo pisni na d12@centrum.cz tam by jsme se poradili:)

Diky moc za tvuj čas

Offline

 

#6 17. 12. 2010 13:21

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: pomoc s C++/C

Zajímavý styl programování... ;-)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#7 17. 12. 2010 13:41

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ RePRO:

tak neni to žadna extratřidy..obecně s programovanim jsem se setkal poprvi a v C delam max 4 mesice tak to teprve tak se jeste trochu učim..:)

Vědel by jsi mi poradit s tema dvema přiklady?

Diky

Offline

 

#8 17. 12. 2010 16:44

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

↑ DeMidix:
U te 1. moc nerozumim tomu zadani, ma to byt cele setridene - od nejvetsiho po nejmensi, nebo staci na zacatek dat nezaporna a na konec zaporna? Kazdopadne bublesort by podle me vyresil oba pripady, i kdyz pro ten jednodussi pripad to jde napsat jednoduseji.

U te 2. jestli se ma najit nejmensi prvek, ktery je tam dvakrat, tak to by slo treba tak, ze bys to nejdriv cele setridil a pak sel od nejmensiho a nasel dve stejna cisla za sebou.

(ale nevim, jestli jsem spravne pochopil ty zadani)

Offline

 

#9 17. 12. 2010 17:18

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

U ty 1 to ma byt tak že mam danou posloupnost 100, čili si  asi ty čisla načtu a pak je seřadim do pole tak aby tvořili posloupnost a nejdřiv aby byla posloupnost zapornych čisel a potom posloupnost nezapornych čisel.

napadlo mě že bych to nědělal tak že bych si načital každy čislo do 100, na začatku bych to omezil, že zadam čisla n(posloupnost) kde max počet bude 100 (n <= 100).Pak bych je seřadil do toho pole..

třeba

int prectiPrvky(int pole[100]) {
    int i = 0;
    int pocet;
    printf("Vlozte pocet cisel n: ");
    scanf("%d", &pocet);
    if(pocet > 100) {
             printf("Muzete vlozit maximalne 100 cisel");
    }
    else {
         printf("Nyni vlozte %d cisel: ", pocet);
    }
   
    for(i = 0; i < pocet; i++) {
            scanf("%d", &pole[i]);
    }
    return pocet;
}

jen nevim jak to napsat tak aby nejdřiv posloupnost začinala nezapornyma čislama a pak už jen zapornyma..to nevim jak na to..


a u ty 2.

napsal jsem zdrojak že zadam posloupnost čisel n(n <= 100) a že mi to najde nejmenši čislo a vypiše kolikrat v dane posloupnosti je obsazeno....Ale ja bych potřeboval najit nejmenši čislo ktery je tam dvakrat...např mam 1 2 2 3 4 5 6 7 tak to vypiše nim je 2 a je tam 2-krat...jenže u toho myho by to vypsalo ze nim je 1 a je tam 1-krat....Tak potřebuju najit ten druhy zpusob..

Offline

 

#10 17. 12. 2010 18:26

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

Porad nejak nemuzu pochopit to prvni zadani :-)

Kdyz zadas treba cisla  -2 4 7 3 -1 0 -6 tak nevim, ktere z nasledujicich to ma vypsat:

tohle?
-2 -1 -6
4 7 3 0

nebo tohle?
-6 -2 -1 0 3 4 7

nebo tohle?
7 4 3 0 -1 -2 6

(nebo oba dva predchozi pripady?)

nebo tohle?
-6 -2 -1
0 3 4 7


Radsi primo napis, co by to melo vypsat u tech cisel co jsem psal.

Offline

 

#11 17. 12. 2010 18:32

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:


když zadam třeba -2 4 7 3 -1 0 -6

tak by to mělo vypsat tohle 0 3 4 7 -6 -2 -1 (nejdřive posloupnost nezapornych a pak zapornych)

tedy:

-6 -2 -1
0 3 4 7

jen v opačnem pořadi..

Offline

 

#12 17. 12. 2010 18:57 — Editoval Lumikodlak (17. 12. 2010 18:58)

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

Hmm, to je zajimave :-)

Nejjednodussi moznost je asi: normalne nacist ty cisla jako integer, a potom s nima pocitat jako 'unsigned' - cili nezaporna cisla. Takze je setridis jako unsigned od nejmensiho po nejvetsi, a pak je zas vypises jako normalni integer se znamenkem. Ten kod by mohl vypadat nejak takhle:

int prectiPrvky(int pole[100]);
void setridVzestupne(unsigned pole[], int Pocet);
void vypisPrvky(int pole[], int Pocet);

...

main(){

...

  n = prectiPrvky(pole);
  setridVzestupne((unsigned*)pole, n);
  vypisPrvky(pole, n);
...


Je to mozne proto, ze x86 procesory (i nektere jine) pouzivaji 'Two's complement' (je to tam az trochu nize).

Ale nejsem si jisty, jestli je to korektni, a jestli to takhle muzete psat, nebo co jste se ucili. Jestli se ti to nezda, tak rekni. Jine moznosti nebudou o moc slozitejsi nez tohle.

Offline

 

#13 17. 12. 2010 19:03

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

Tak musim řict že ten integer a unsigned je pro mě novinka s tim bych to asi nezvladl napsat..

Zkusil jsem to takhle:

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

#define max 4

int serad(int *pole, int n)
{
    int m;
    int i, k, j, pom;
   
    printf("Inicializace: \n");   
    for (i=0;i<n;i++)
          printf("%2i ",pole[i]);

    for (k=1; k<n; k++)
    {//průchod pole pro každý prvek
       for (j=n-1; j>=k; j--)
       {    // hledání všech následujících prvků
           if (pole[j-1]>=pole[j])
           {    //je-li předchůdce větší než aktuální prvek --> záměna
              pom=pole[j-1];
              pole[j-1]=pole[j];
              pole[j]=pom;
           }
        }
    }
    printf("\nSerazene: \n");
     for (i = 0; i < n; i++)        //výpis pole po porovnání jednoho prvku
          printf("%2i ",pole[i]);
     
}   

int main(void)
{
    int pole[max]={2,3,1,5};
    serad(pole,max);
         
    printf("\n\n");
    system("PAUSE");
    return 0;
}

jako že bych to dal natvrdo do pole..Ale vyučujici je zase haklivej na ty pole, že to moc nema rad, takhle "natvrdo".. ale stejně mi to nezeřadi tak jak by mělo..nejdřiv nezaporna a pak zaporna..sakra :D

Offline

 

#14 17. 12. 2010 19:07

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ DeMidix:



A jak bych tam ješte zakomponoval do toho myho programu do toho pole ješte zaporna čisla?..pač když je tam zadam tak mi to hlasi chybu..

Offline

 

#15 17. 12. 2010 19:28

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

S tim unsigned stacilo by prepsat:

           if (pole[j-1]>=pole[j])

na toto:

           if ((unsigned)pole[j-1]>=(unsigned)pole[j])

ale vyucujicimu by se to nemuselo libit no, to nevim.

Co se mu nelibi na tom poli? To spis ze bys mel pouzit malloc? Nebo seznam?


Jinak dalo by se to napsat podobne:

...
    printf("\nSerazene: \n");
     for (i = 0; i < n; i++)        //výpis kladnych
          if(pole[i]>=0) printf("%2i ",pole[i]);
     for (i = n-1; i >= 0; i--)        //vypis zapornych
          if(pole[i]<0) printf("%2i ",pole[i]);
...

Ale vyucujicimu by se to take nemuselo libit :-)

Jestli ani to predchozi neni ok, tak bude potreba nejspis vytvorit si dalsi pole a do nej ty cisla postupne ulozit, podobne jak jsem psal nejdrive ten vypis kladnych a pak zapornych, a pak je vypsat.

Offline

 

#16 17. 12. 2010 19:34

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

↑ DeMidix:
Kde to hlasi chybu? Pri kompilaci, nebo pri spusteni? Neni problem v tom, ze 'max' mas definovane jako 4, a pak tam pridas dalsi cisla:

    int pole[max]={2,3,1,5,-1,-4};

takze pak jich je tam treba sest a do ctyr se nevejdou uz?

Offline

 

#17 17. 12. 2010 20:01

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

Ju, mas pravdu..ja jsem vul..pak jsem na to ppřišel že tam mam max 4 a v poli vic čisel než 4.. Ale jinak to docela jde ne..

a co k ty 2, vedel by jsi neco?

Dik

Offline

 

#18 17. 12. 2010 20:25

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pomoc s C++/C

No k te dvojce napriklad - Kdyz uz mas to pole cele setridene, tak to budes vypisovat podobnym zpusobem jako:

    printf("\nMin 2x: \n");
    for (i = 0; i < n - 1; i++){
      if (pole[i] == pole[i+1]){
        printf("%2i ",pole[i]);
        break;
      }
    }

Offline

 

#19 18. 12. 2010 11:05

DeMidix
Příspěvky: 63
Reputace:   
 

Re: pomoc s C++/C

↑ Lumikodlak:

Tak jsem to tam zapracoval a facha to..Diky moc za rady :)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson