Podmínky pro pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Podmínky pro pole – C / C++ – Fórum – Programujte.comPodmínky pro pole – C / C++ – Fórum – Programujte.com

 

Karel
~ Anonymní uživatel
167 příspěvků
6. 12. 2019   #1
-
0
-

 Zdravím potřeboval bych poradit jak dostat výsledek do pole a udělat pro něj podmínku? Třeba definovat pole o velikosti 3 a výsledek bude 60 a podmínka tedy bude if aby vypsal 1 jakože se do pole vleze, potom else když se do pole nevejde 0. Děkuji Vám za pomoc

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

int main(void)
{
    char src[] = "50 10";
    char *data = src;
    int pocet;
    int n;
    int compute = 0;

    while (sscanf(data, " %d%n", &n, &pocet) == 1)
    {
        compute += n;
        data += pocet;
        printf("cislo: %5d; compute = %5d; pocet = %5d\n", n, compute, pocet);
    }

    printf("compute = %d\n", compute);

    int num = compute;
    char snum[5]="XXX";
    itoa(num, snum, 5);

    if(snum < 5) {
      printf("pravda");
      } else {
      printf("lez");
   }

    return 0;
}
Nahlásit jako SPAM
IP: 37.48.43.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2019   #2
-
0
-

Az dokazes presne popsat, co to ma delat, pak to das mozna i dohromady sam.

Z toho, co si tu popsal vubec nechapu co to sakra ma delat.

Na co pole, pripadne kde vemes tu velikost? Jakejch 60, kde se to veme? Jak poznat (nebo podle ceho), jestli se to nekam vleze ci ne?

A z kodu taky nechapu co to ma delat. Napriklad tahle podminka:

    int num = compute;
    char snum[5]="XXX";
    itoa(num, snum, 5);

    if(snum < 5) {        // porovnavas pointer snum s cislem 
                          // -> vzdy vyleze "lez" jelikoz je nepravdepodobne,
                          // ze by snum skoncil v pameti na adrese mensi nez 5
      printf("pravda");
   } else {
      printf("lez");
   }
Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Karel
~ Anonymní uživatel
167 příspěvků
6. 12. 2019   #3
-
0
-

#2 KIIV
Program má sečíst čísla v řetězci a vypsat je to výsledku compute. A chtěl bych jej zapsat do pole o nějaké velikosti s tím že když čísla v řetězci budou velká a nevejdou se do definovaného pole tak to vypíše 1. Díky 

Nahlásit jako SPAM
IP: 37.48.25.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2019   #4
-
0
-

#3 Karel
Takze chces jen vysledek prevest do retezce, ten zahodit a vypsat 1, pokud byl buffer dost velky nebo 0 pokud byl mensi.

#define BUFF_LEN 3
char buffer[BUFF_LEN];

int celkemZnaku = snprintf(buffer, BUFF_LEN, "%d", compute);
if (celkemZnaku < BUFF_LEN) {
  printf("Vejde se");
} else {
  printf("Nevejde se. Misto v bufferu je %d znaku ale je potreba %d", BUFF_LEN - 1, celkemZnaku);
}


snprint ceka ukazatel na buffer, celkovou velikost bufferu (ale vevnitr pocita s jednim znakem na ukoncovaci znak) a pak uz jen klasicky format a parametry... Vrati celkovy pocet znaku potrebnych k vygenerovani podle formatu a parametru (tentokrate bez ukoncovaciho znaku). Pokud tedy bude vysledne cislo vetsi nebo rovno velikosti bufferu, tak se to uz nevlezlo.

Ale moc nechapu, proc to resis, int ma urcity rozsah (maximalne muzes detekovat, jestli je 16b/32b nebo 64b a podle toho pripravit velikost bufferu)

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #5
-
0
-

#4 KIIV
Děkuji. Zeptám se je možné sečíst (+) 2 čísla v řetězci oddělené mezerou bez použití while a sccanf? Např. char src "10 20", vysledek se zapíše do nového řetězce char výsledek a uplatní se na něj tyto dvě podmínky? Musí se znaky se src převést pomocí ASCII? Díky

Nahlásit jako SPAM
IP: 37.48.34.–
gna
~ Anonymní uživatel
1853 příspěvků
9. 12. 2019   #6
-
0
-

#5 Karel
Ne, vždycky musíš ten řetězec nějak převést na čísla. Pokud v něm mají být jen 2 čísla, tak prostě tím sscanfem načti 2 čísla. While k ničemu nepotřebuješ.

Nahlásit jako SPAM
IP: 213.211.51.–
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #7
-
0
-

#6 gna
a bez funkce sscanf to je možné? Jelikož dána hlavička programu  

 int compute(char src[], char result[], int n);
Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:907e:692d:5969:f16f...–
gna
~ Anonymní uživatel
1853 příspěvků
9. 12. 2019   #8
-
0
-

#7 Karel
Z toho nějak vyplývá, že tu funkci nemůžeš implementovat pomocí standardních funkcí?

Nahlásit jako SPAM
IP: 213.211.51.–
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #9
-
0
-

#8 gna
To si myslím že ne, spíše bych jen potřeboval poradit jak ji tam implementovat. PS: zeptám se máte něco jiného mail,... abych Vás neotravoval tady, děkuji za Váš čas.

Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:907e:692d:5969:f16f...–
gna
~ Anonymní uživatel
1853 příspěvků
9. 12. 2019   #10
-
0
-

Úplně stejně, jako v mainu.

Nahlásit jako SPAM
IP: 213.211.51.–
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #11
-
0
-

#10 gna
Dobře díky 

Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:a40b:a11e:24a5:7462...–
gna
~ Anonymní uživatel
1853 příspěvků
9. 12. 2019   #12
-
0
-

#10 gna 

int compute(char src[], char result[], int n)
{
	int soucet = 0, cislo, pocet;
	char *data = src;

	while (sscanf(data, " %d%n", &cislo, &pocet) == 1)
	{
		soucet += cislo;
		data += pocet;
	}

	int celkemZnaku = snprintf(result, n, "%d", soucet);
	if (celkemZnaku < n)
		return 0;
	else
		return 1;
}

int main(void)
{
	char src[] = "10 20 30";
	char result[10];

	printf("soucet %s\n", src);
	if (compute(src, result, (int)sizeof result) == 0)
		printf("= %s\n", result);
	else
		printf("%d znaku nestaci\n", (int)sizeof result);
	return 0;
}
Nahlásit jako SPAM
IP: 213.211.51.–
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #13
-
0
-

#12 gna
Aha, tyjo díky moc. Tak koukám že to jde docela jednoduššeji než co jsem dělal já :)

Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:6538:5a35:f7b3:7ddc...–
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #14
-
0
-

#12 gna
a kdyby funkce neměla používat scanf (ani jiné pro vstup) ani printf (ani pro výstup), tak v tom případě ty 2 čísla z řetězce nenačtu ale budu je muset převést a pak sečíst?

Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:6538:5a35:f7b3:7ddc...–
KIIV
~ Moderátor
+43
God of flame
9. 12. 2019   #15
-
0
-

Cisla jde samozrejme secist i jako ascii, jen budes muset pekne od zadu znak po znaku, pripocitavat i prenos do dalsiho radu a tak dale. Presne jak se to uci na zakladce.

Akorat si moc neumim predstavit co mate teda povolene na to nacteni? Ci to mate proste zadane jako retezec v poli a je to na vas? V tomhle pripade by se to jeste dalo zvladat.

Nahlásit jako SPAM
IP: 46.135.108.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Karel
~ Anonymní uživatel
167 příspěvků
9. 12. 2019   #16
-
0
-

#15 KIIV
myslím že je to zadané jen jako řetězec a žádné funkce na vystup a vstup se nesmí použit 

Nahlásit jako SPAM
IP: 2a00:1028:83cc:3a3e:d9d0:47e1:4a60:8314...–
MilanL+1
Grafoman
10. 12. 2019   #17
-
0
-

#16 Karel
no pak si ty funkce musíš udělat vlastní.

 např nějak takto

int scancisla(const char *str, int *cislo, int *pocet){

	int ret = 0;
	*cislo = 0;
	*pocet = 0;

	int cisl = (int)str[*pocet];
	
	while (cisl) {
		*pocet += 1;
		if ((cisl > 47) && (cisl < 58)){
			*cislo = *cislo*10 + cisl-48;
			ret = 1;
		}
		else if (*cislo) return ret;
		cisl = (int)str[*pocet];
	}
	return ret;
}

a pak v compute nahradit scanf(.....)

scancisla(data, &cislo, &pocet) 

Nahlásit jako SPAM
IP: 91.139.9.–
Karel
~ Anonymní uživatel
167 příspěvků
10. 12. 2019   #18
-
0
-

#17 MilanL
Děkuji Vám za radu. Furt v tom nějak tápu, zkusím to nějak udělat.

Nahlásit jako SPAM
IP: 109.81.211.–
MilanL+1
Grafoman
10. 12. 2019   #19
-
0
-

#18 Karel
ten můj kod funguje je to odzkoušeno, jen to pochopit, kdyby se prófa ptal.

prochází to řetězec znak po znaku dokud nenarazí na začátek čísla, při dalším čísle to předchozí výsledek násobí 10 a přičte novou číslici, když už je nějaké číslo a za ním jakýkoliv znak tak to vrátí číslo a počet znaků což hodí posun startovní pozice pro další hledání.

V té druhé podmínce by možná bylo lepší testovat ret to by ošetřilo i případnou 0.

Jinak to sečte čísla v jakémkoliv textu tzn např, "Kuba měl v kasičce 10 korun, Pepík 20 a Maruška 30, kolik měli celkem?"

Nahlásit jako SPAM
IP: 185.112.167.–
Karel
~ Anonymní uživatel
167 příspěvků
10. 12. 2019   #20
-
0
-

#19 MilanL
ahá, to zní logicky možná už jsem to trochu pochopil, díky. Nemáte náhodou e-mail kde bych se Vás mohl zeptat ještě na pár věci? 

Nahlásit jako SPAM
IP: 37.48.49.–
KIIV
~ Moderátor
+43
God of flame
11. 12. 2019   #21
-
0
-

#20 Karel
Ono by stacilo, kdyby to nenapsal tak prasacky. Ja C/C++ umim a musim sakra premejslet, co tam dela (a to je naprosto trivialni algoritmus). Ale je to C, o moc lepe to proste nejde.

S trochou uprav by to mohlo byt trochu citelnejsi takto (hlavne se zbavit krypticky pojmenovanych promennych, magickych konstant - at je aspon jasne, ze se to porovnava se znakem, nejakej bug fix):

int scancisla(const char *str, int *cislo, int *pozice) {
  int nacteno = 0;
  *cislo  = 0;
  pozice = 0;

  while (str[*pozice])
  {
    char cislice = str[(*pozice)++]; // jen pro zprehledneni zbytku

    if ((cislice >= '0') && (cislice <= '9'))
    {
      *cislo = *cislo*10 + cislice - '0';
      nacteno = 1;
    }
    else if (nacteno)
    {
      return nacteno;
    }
  }
  return nacteno;
}

#19 MilanL
ten můj kod funguje je to odzkoušeno, jen to pochopit, kdyby se prófa ptal.

Schvalne zkus nacist  "0 1 2 3"

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Karel
~ Anonymní uživatel
167 příspěvků
11. 12. 2019   #22
-
0
-

#21 KIIV
Teď už se v tom vůbec nevyznám, natož abych to implementoval do mého zdrojáku      Ale díky, nějak to zkusím, v programování jsem začáteční a ten můj zdroják jsem dal stěží dohromady

Nahlásit jako SPAM
IP: 109.81.211.–
MilanL+1
Grafoman
11. 12. 2019   #23
-
0
-

#21 KIIV
jestli myslíš do toho mého kodu, tak mě to "0 1 2 3" spočetlo správně =6

já v C příliš nedělám, nevím, kde fungují/nefungují implicitní konverze
 

a míchat začátečníkovi do kódu pre nebo post inkrement je docela blbost

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
11. 12. 2019   #24
-
0
-

#22 Karel
ten kod od KVII je skoro tootžný, jen tam přejmenoval návratovou hodnotu ret na načteno a splácal pár věcí co jsem měl rozdělěno do profi kodu, např já převádím znaky na ascii kody on počítá s implicitní konverzí co provádí překladač na základě typu cílové proměnné.

#21 KIIV
možná to máš lépe pojmenovaný (tu proměnnou cisl jsem taky měl puvodne cislice, ale zdálo se mi to dlouhé), ale ten tvůj kod nefunguje máš tam chybu u nulování pozice.
 

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
11. 12. 2019   #25
-
0
-

#22 Karel
ještě pokud jde o ty ostatní funkce printf je možno nahradit pomocí cout, jen pozor u resultu je třeba definovat 1 znak navíc pro koncový znak kod 0, definoval bych dopředu tu délku resultu do constanty a pole pak délka+1.

převod čísla to result pole uděláš zpětným cyklem, kvůli zarovnání a určení délky je to skoro složitější než ten scan
zkus něco spáchat sám pak ti poradíme, co s tím dál.

Já tu e.mail mám veřejný (do práce, když jsem cosi řešil), musíš do mého profilu, jen nevím jestli bys nemusel být přihlášený.

Nahlásit jako SPAM
IP: 185.112.167.–
KIIV
~ Moderátor
+43
God of flame
12. 12. 2019   #26
-
0
-

#24 MilanL
Jo, chyba tam je, nekde zmizela ta dereference pri upravach tady na strance.

Ta tvoje chyba, co sem zminoval, tak je v tom, ze neumis nacist 0. Takze pokud bys delal napriklad prumer, tak z toho tvyho by z "0 0 0 2 0 0 0" vylezl prumer 2.

A nejde o to ze je dlouhej kod, muzu to napsat na radek. Jde hlavne o citelnost, rozsiritelnost a aby byly videt bloky. Automaticky pridavam blok i kolem jedineho prikazu u else if, jelikoz je to zase odolnejsi vuci chybam. Pride nekdo jinej (nebo klidne ty po tydnu), pripise tam dalsi prikaz a pak se divi, ze se vykonava porad a ne jen pokud se ma vykonat else. Ono uz jen ty zatraceny predavani parametru pointerama sou nachylny na chyby, sak se mi tam hned jedna dereference vyparila (bez ni bych to ani neotestoval).

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
12. 12. 2019   #27
-
0
-

Automaticky pridavam blok i kolem jedineho prikazu u else if, jelikoz je to zase odolnejsi vuci chybam. Pride nekdo jinej (nebo klidne ty po tydnu), pripise tam dalsi prikaz a pak se divi, ze se vykonava porad a ne jen pokud se ma vykonat else.

Tesat do kamene

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
12. 12. 2019   #28
-
0
-

#26 KIIV
oki tu připomínku k původnímu kódu o 0 beru, však jsem také ve vysvětlovací odpovědi #19 psal

V té druhé podmínce by možná bylo lepší testovat ret to by ošetřilo i případnou 0.

Nahlásit jako SPAM
IP: 91.139.9.–
KIIV
~ Moderátor
+43
God of flame
12. 12. 2019   #29
-
0
-

#28 MilanL
moc daleko :D  No proste sem poresil tu nulu, ctu povrchne a v C se ten kod moc zprehlednit neda. Urcite ne pokud se clovek snazi napasovat na ten prototyp sscanf.

K implicitni konverzi - problem by to byl, pokud bych mel treba 16b int (na jednocipu napriklad) a udelal neco jako  1 << 30, tady to uz bez explicitniho urceni typu u konstanty nebude fachat, tj musi byt neco jako  UINT32_C(1) << 30. Tamto uz je spis pesimizace.

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 11 hostů

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ý