| Autor | Správa |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 | Zaslal: Št 02.02.12 19:58 |   |
Mám za úlohu: Vstupom je reťazec a pole celých čísel. Funkcia vypisuje reťazec znak po znaku, pričom ak natrafí na znak '*', vypíše nasledujúci znak (môže byť aj '*') toľkokrát, aké číslo nasleduje v poli.
Mám ten problém, že keď chcem hodnotu z poľa priradiť do premennej pom, tak mi nepriradí jej číselnú hodnotu, ale jej ASCII hodnotu. Nechápem prečo, keďže tam mám int
| kód: | void vypis_retazca_nasobkom_pola(char retazec[], int pole[], int dlzka_retazca, int dlzka_pola)
{
int i, j = 0, k;
int pom;
for(i = 0; i < dlzka_retazca; i++)
{
if(retazec[i] == '*')
{
if(pole[j] <= dlzka_pola) //zacne sa pole odznova
j = 0;
pom = pole[j];
for(k = 0; k < pom; k++)
putchar(retazec[i + 1]);
i++;
j++;
}
putchar(retazec[i]);
}
} |
|
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Št 02.02.12 20:22 |   |
Tuto cast:
| kód: | if(pole[j] <= dlzka_pola) //zacne sa pole odznova
j = 0; |
si nemyslel nahodou takto:
| kód: | if( j >= dlzka_pola) //zacne sa pole odznova
j = 0; |
???
Po dalsie, neviem isto, ale ja chapem zadanie tak, ze nasledujuci znak sa ma vypisat x-krat, nie x-krat + 1, ako to mas ty. Cize si este mozes upravit cyklus:
| kód: | | for(k = 0; k < pom; k++) |
napriklad takto:
| kód: | | for(k = 1; k < pom; k++) |
|
| |
   |
 |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 | Zaslal: Št 02.02.12 22:11 |   |
To su zatial len malickosti, s ktorými som sa ešte nezaoberal. Každý program si krokujem, tak by som nato došiel. To if som tam doplnil len teraz a hej, máš pravdu, takto by to robilo vkuse zacinalo na prvom prvku v poli. A aj to k má byť od 0. Ale ako vravím, stýmto som sa netrápil zatial, bolo to písané v rýchlosti. Problém mi robí to čo som napísal hore. Do premennej pom sa mi neuloži hodnota prvku ale ascii hodnota. To si mi zabudol poradiť  |
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Št 02.02.12 22:19 |   |
Tak ja som si to skusil a ak to mas tak, ako som to upravil, funguje to spravne. Zalezi teda, ake pole predavas funkcii. Pre ilustraciu, moj priklad vyzeral takto:
| kód: | #include <stdio.h>
#include <string.h>
void vypis_retazca_nasobkom_pola(char retazec[], int pole[], int dlzka_retazca, int dlzka_pola)
{
int i, j = 0, k;
int pom;
for(i = 0; i < dlzka_retazca; i++)
{
if(retazec[i] == '*')
{
if( j >= dlzka_pola) //zacne sa pole odznova
j = 0;
pom = pole[j];
for(k = 1; k < pom; k++)
putchar(retazec[i + 1]);
i++;
j++;
}
putchar(retazec[i]);
}
}
int main()
{
char s[] = "skus*ka vypisov*ania tex*tu";
int p[] = { 3, 5, 2 }; /* moje pole, ktore davam funkcii ako argument */
vypis_retazca_nasobkom_pola( s, p, strlen( s ), 3 );
putchar( '\n' );
return 0;
} |
Vypis:
| citácia: | | skuskkka vypisovaaaaania texttu |
Je mozne, ze nejakym sposobom nespravne zadavas pole. |
| |
   |
 |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 | Zaslal: Št 02.02.12 23:39 |   |
Program ide, len mi zobere zlú hodnotu. Tu mám funkciu načítavania
| kód: | int nacitanie_cisiel_v_poli(int pole[])
{
int i;
int pom;
int pocet = 0;
for(i= 0; i < max; i++)
{
pom = getchar();
if(pom == '\n')
break;
pole[i] = pom;
pocet++;
}
return pocet;
} |
|
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Št 02.02.12 23:51 |   |
Cize ty touto funkciou nacitavas cisla do premennej pole? Preto tie ASCII hodnoty. Totizto getchar() vracia ASCII hodnoty znaku nacitaneho zo vstupu. Darmo ty napises cislo, stale sa jedna o znak. Mozes ho treda prekonvertovat takto jednoducho, bez pouzitia nejakych externych funkcii:
| kód: | pom = getchar();
pom -= 0x30;
if ( ( pom > 9 ) || ( pom < 0 ) )
/* osetrit na nespravny vstup */
break; |
0x30 je hexa vyjadrenie znaku '0'. Ak teda zadas povedzme cislo '5', jeho ascii v hexa sustave je 0x35. 0x35 - 0x30 je 0x05. Cize dostal si zo znaku '5' ciselnu hodnotu 5. Teraz by ti to malo fungovat spravne. |
| |
   |
 |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 |
Aha, díky. Tieto súvislosti programovania a sústav budeme preberat až teraz v lete. Takže ten môj if je tam zbitočný, nahradím ho tým tvojím. |
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. Nemôžete odpovedať na témy v tomto fóre. Nemôžete upravovať svoje príspevky v tomto fóre. Nemôžete mazať svoje príspevky v tomto fóre. Nemôžete hlasovať v tomto fóre.
|
|