NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jednoduchá artimetika ukazatelů v C

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
martin nemecek:7.10.2024 7:49

Ahoj potřeboval byh poradit jak překousnout sčítaní a odčítání ukazatlů více způsoby. dělám příklady na hackerrank a narazil na začátečnický problém. snažím se vyřešit viz obrázek níže. myslel sem že už řešení mám ale asi ne jak je vidět z obrázku...ze zadání sem pochopil,že mám sečíst hodnoty na adresách ukazatelů a součet dát do a,potom odečíst a rozdíl abolutní hodnoty dát do b. a tak se chci zeptat jestli je ještě nějaký jiný způsob jak to udělat ?...
vypadá to totiž že na hackerank se ode mě čeká nejspíš jiné řešení zadání...snad to je pochopitelné ze screenshotu.
díky za každý dobrý tip.

martin

Zkusil jsem: zkusil sem různé weby jako :
https://www.w3schools.com/…pointers.php
https://cplusplus.com/…al/pointers/

.. spoustu dalších.

Chci docílit: snažím se pořádně naučit C. abych měl kratší a rychlejší kód.

 
Odpovědět
7.10.2024 7:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2024 9:02

Ja teda cecko moc neovladam, ale, na tom obrazku zadnou absolutni hodnotu neresis? A take mi prijde divne, ze si prepisujes acko

*a = *a + *b nebo *a += *b - ok, mohlo by mu vadit, ze mas zkraceny zapis
*b = (*a - *b - *b)* - 1 - to mi prijde jako nesmysl

a = 5, b = 3
a = 5 + 3
b = a - 3 - 3 - 1 = 5 + 3 - 3 - 3 - 1

Google tvrdi teda neco jineho...
google = absolute value of pointers cpp
https://stackoverflow.com/…ative-number

int origa = *a;
*a = abs(origa + *b);
*b = abs(origa - *b);

int temp=*a;
*a = temp+*b;
*b = abs(temp-*b);

int origa = *a;
*a = origa + *b;
*b = origa - *b;
if (*b <0)
{
    *b=-1*(*b);
}

Hacker, a neumi si najit reseni na google, hmm... :)

 
Nahoru Odpovědět
7.10.2024 9:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2024 9:07

Ale je teda zvlastni, ze test tvrdi, ze se vysledky shoduji. Asi fakt ocekava jiny kod. Chtelo by to zjistit, co ten test case 3 dela. Treba je problem v tom, ze krome zadani 4 5 zkusou take 5 4 a tvuj kod vyhodi zaporne hodnoty.

 
Nahoru Odpovědět
7.10.2024 9:07
Avatar
DarkCoder
Člen
Avatar
Odpovídá na martin nemecek
DarkCoder:7.10.2024 9:25

Máš chybu ve výpočtu, nemůžeš násobit rozdíl -1.

Řešení jsou dvě:

1. pomocí abs

void update(int* a, int* b) {
    *a += *b; // *a = *a + *b;
    *b = abs(*a - 2 * (*b));
}

2. pomocí if

void update(int* a, int* b) {
    *a += *b; // *a = *a + *b;
    *b = *a - 2 * (*b);
    if (*b < 0) *b = -*b;
}
Nahoru Odpovědět
7.10.2024 9:25
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
martin nemecek:7.10.2024 9:55

díky za rychlou odezvu..
.............­.............­.............­.............­..
void update(int* a, int* b) {
a += b; // *a = *a + *b;
*b = abs(*a - 2 * (*b));
}.........toto nefunguje..pre­kladac mi podtrhava to abs() cervene
.............­.............­.............­.............­..
...ale toto funguje prefektne s tim if
void update(int
a, int
b) {
*a += *b; // *a = *a + *b;
*b = *a - 2 * (*b);
if (*b < 0) *b = -*b;
}

...trochu me ale zaskočilo že sem -1 nasobil a výsledek proběhl..akorát po sumbmit code mi to vyhodilo chybu.

díky

VYŘEŠENO !

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
7.10.2024 9:55
Avatar
DarkCoder
Člen
Avatar
Odpovídá na martin nemecek
DarkCoder:7.10.2024 10:08

.........toto nefunguje..pre­kladac mi podtrhava to abs() cervene

To je pochopitelné, vložil jsem pouze úryvek kódu pro funkci update(). Abys mohl pracovat s absolutní hodnotou, respektive funkcí abs(), musíš vložit hlavičkový soubor stdlib.h.

Tvůj kód:

*b = (*a - *b - *b) * -1;

Bude pracovat jen v případě kde výraz v závorce bude 0 nebo záporný. Proto Ti vyhodnocení neprochází.
Výsledek totiž musí být vždy 0 nebo kladné číslo.

Zde máš úplnou variantu s abs().

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

void update(int* a, int* b);

int main(void) {
    int a, b;

    scanf("%d %d", &a, &b);
    update(&a, &b);
    printf("%d\n%d\n", a, b);
    return 0;
}

void update(int* a, int* b) {
    *a += *b;
    *b = abs(*a - 2 * (*b));
}

Označ řešení pokud Ti to pomohlo, pomůžeš tak i ostatním kterým vyřeším problém..

Nahoru Odpovědět
+1
7.10.2024 10:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
martin nemecek:7.10.2024 11:02
*b = (*a - *b - *b) * -1;

Bude pracovat jen v případě kde výraz v závorce bude 0 nebo záporný. Proto Ti vyhodnocení neprochází.
Výsledek totiž musí být vždy 0 nebo kladné číslo.

ono to na té stránce heckerrank bylo nejspíš nastavené na a < b,to jest že výsledek v závorce byl vždycky negativní, proto mi výsledek sice prošel ,ale vyhodnocení ne. přesně jak píšeš

toto taky pochopitelně funguje 😚

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

void update(int* a, int* b);

int main(void) {
    int a, b;

    scanf("%d %d", &a, &b);
    update(&a, &b);
    printf("%d\n%d\n", a, b);
    return 0;
}

void update(int* a, int* b) {
    *a += *b;
    *b = abs(*a - 2 * (*b));
}

...
díky za řešení

 
Nahoru Odpovědět
7.10.2024 11:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na martin nemecek
DarkCoder:7.10.2024 11:15

Nemáš zač. Pokud budeš potřebovat něco ohledně C, hoď dotaz do fóra jako v tomto případě.

Nahoru Odpovědět
7.10.2024 11:15
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.