Operator trójargumentowy nie chce działać?

Odpowiedz Nowy wątek
2011-08-22 14:23
0

Mam taką linijkę:

printf("(%d)+%d=((a+b)>0?%d:(%d))", a, b, (a+b));

. Jak widać, chodzi mi o to, żeby w przypadku sumy a i b większej od zera wynik był "goły", a przy <0 - w nawiasie. Wiem, że można zrobić dając przy wartościach w przypadku prawdy i fałszu operatora całość: printf((a+b)>0?"(%d)+%d=%d":"(%d)+%d=(%d)", a, b, (a+b));

, ale czy nie ma sposobu na ujęcie tylko ostatniego %d? Wyjęcie za cudzysłów<code class="cpp">printf("(%d)+%d="((a+b)>0?"%d":"(%d)")", a, b, (a+b));

też nie działa.

edytowany 3x, ostatnio: madmike, 2011-08-22 16:50

Pozostało 580 znaków

2011-08-22 14:34
Kumashiro
0
Tigro napisał(a)

Mam taką linijkę:

printf("(%d)+%d=((a+b)>0?%d:(%d))", a, b, (a+b));

Od kiedy kompilator kompiluje kod wewnątrz cstringów?

c = a + b;
printf(c ? "(%d)+%d=%d" : "(%d)+%d=(%d)", a, b, c);

może zadziała...

Pozostało 580 znaków

2011-08-22 14:39

Łączenie łańcuchów odbywa się na etapie preprocesora ZTCW, a więc musisz posłużyć się dyrektywami preprocesora, oraz użyć stałych, które są znane w czasie kompilacji, np:

#include <cstdio>
#include <cstdlib>
 
int main() {
 
#define a 5
#define b -8
    const char *formatString = "(%d)+(%d)="
#if (a + b) >= 0
    "%d"
#else
    "(%d)"
#endif
    ;
    printf(formatString, a, b, (a+b));
 
    return 0;
}

Jeśli to nie są stałe znane w czasie kompilacji, to musisz posłużyć się strcat() albo std::string + std::string.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-08-22 14:41
Żeś wymyślił :D. - Rev 2011-08-22 14:41
A co? Źle? :p - Wibowit 2011-08-22 14:43
Przekombinowałeś :p - byku_guzio 2011-08-22 16:29

Pozostało 580 znaków

2011-08-22 14:46
0

Dzięki :)

edytowany 1x, ostatnio: Tigro, 2011-08-22 14:46

Pozostało 580 znaków

2011-08-22 16:27
1

Kumashiro - prawie dobrze: fałsz jest wtedy i tylko wtedy gdy wartość wyrażenia wynosi 0, w każdym innym przypadku wyrażenie jest prawdą.

printf(a+b > 0 ? "(%d)+%d=%d" : "(%d)+%d=(%d)", a, b, a+b);

edytowany 1x, ostatnio: byku_guzio, 2011-08-22 16:28
Racja... Pythonowe przyzwyczajenia... - Kumashiro 2011-08-22 20:03

Pozostało 580 znaków

2011-08-22 16:46
0

Rozwiązanie z ?: się nie skaluje :P

#include <cstdio>
#include <cstdlib>
 
int main() {
 
#define a1 5
#define b1 -2
#define a2 5
#define b2 -8
#define a3 7
#define b3 -2
#define a4 5
#define b4 2
    const char *formatString = "(%d)+(%d)+(%d)+(%d)+(%d)+(%d)+(%d)+(%d)="
#if (a1 + b1) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a2 + b2) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a3 + b3) >= 0
    "%d + "
#else
    "(%d) + "
#endif
#if (a4 + b4) >= 0
    "%d"
#else
    "(%d)"
#endif
    ;
    printf(formatString, a1, b1, a2, b2, a3, b3, a4, b4, a1 + b1, a2 + b2, a3 + b3, a4 + b4);
 
    return 0;
}
#include <cstdio>
#include <cstdlib>
 
int main() {
 
#if 5 > 8
#define ImieKota "Burek"
#else
#define ImieKota "Alik"
#endif
#if 6 < 4
#define ImiePsa "Alicja"
#else 
#define ImiePsa "Burek"
#endif
#if 5 == 8
#define ImiePana "Dżeki"
#else
#define ImiePana "Maciek"
#endif
 
    puts("Imie kota: " ImieKota ", imie psa: " ImiePsa ", imie pana: " ImiePana);
 
    return 0;
}

Kolejny sposób, z użyciem %s w printfie:

#include <cstdio>
#include <cstdlib>
 
const char* ln(int v) {
    if (v < 0) {
        return "(";
    } else {
        return "";
    }
}
 
const char* pn(int v) {
    if (v < 0) {
        return ")";
    } else {
        return "";
    }
}
 
int main() {
    int a = 5, b = -8;
    printf("(%d)+(%d)=%s%d%s", a, b, ln(a + b), (a + b), pn(a + b));
 
    return 0;
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-08-22 16:58
za to jeżeli cokolwiek z tego nie będzie znane w czasie kompilacji to całość idzie w piach :p - byku_guzio 2011-08-22 16:51
Owszem, aczkolwiek w pewnych sytuacjach takie konstrukcje się przydają. Poza tym autor już w pierwszym poście pokazał, że zna "sztuczkę" z ?: a wy mu to samo pokazujecie :P - Wibowit 2011-08-22 16:54
Tobie się chyba nudzi ;P. - Rev 2011-08-22 17:11
Jak chyba każdemu co pomaga na forum :P - Wibowit 2011-08-22 17:14

Pozostało 580 znaków

2011-08-22 19:59
0
#if 5 > 8
#define ImieKota "Burek"
#else
#define ImieKota "Alik"
#endif
#if 6 < 4
#define ImiePsa "Alicja"
#else 
#define ImiePsa "Burek"
#endif
#if 5 == 8
#define ImiePana "Dżeki"
#else
#define ImiePana "Maciek"
#endif

dyrektywy można wcinać, w ten sposób:

#if 5 > 8
#   define ImieKota "Burek"
#else
#   define ImieKota "Alik"
#endif
#if 6 < 4
#   define ImiePsa "Alicja"
#else 
#   define ImiePsa "Burek"
#endif
#if 5 == 8
#   define ImiePana "Dżeki"
#else
#   define ImiePana "Maciek"
#endif

albo nawet ładniej tak:

# if 5 > 8
#   define ImieKota "Burek"
# else
#   define ImieKota "Alik"
# endif
# if 6 < 4
#   define ImiePsa "Alicja"
# else 
#   define ImiePsa "Burek"
# endif
# if 5 == 8
#   define ImiePana "Dżeki"
# else
#   define ImiePana "Maciek"
# endif

ważne żeby wcięcie dodawać między # a dyrektywę, a nie na początku linijki.

edytowany 2x, ostatnio: Azarien, 2011-08-22 20:01

Pozostało 580 znaków

2011-08-22 21:11
Rev
0

W VC++ można i wcięcia przed # dodawać.


wiem, ale nie jest to zgodne ze standardem. sposób powyższy będzie działać wszędzie. - Azarien 2011-08-22 23:44

Pozostało 580 znaków

2011-08-23 01:36
0

Łoł.. dziękuję raz jeszcze :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0