Pomoc s úkolem v C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc s úkolem v C++ – C / C++ – Fórum – Programujte.comPomoc s úkolem v C++ – C / C++ – Fórum – Programujte.com

 

zaltex0
Duch
3. 5. 2020   #1
-
0
-

Ahoj, mám menší problém s programováním. Mám za úkol:
"uživatel má na základě nápověd uhodnout náhodně vygenerovaný PIN složený ze 4 číslic a má na to pouze 3 pokusy
2 obtížnosti:
- lehká, kdy program hned na úvod napoví, které 3 číslice PIN neobsahuje
- těžká bude bez nápovědy
Po zadání číslic dojde ke kontrole zda odpovídají PINu, pokud je zadaná číslice v PINu obsažena bude v dalším kole hádání zvýrazněna, pokud je číslice správně, bude zobrazna na své pozici v PINu. V případě, že se číslice v PINu nevyskytuje nebude možné ji v dalším kole hádání použít."
Už jsem něco zkusil vymyslet, ale moc se mi nedaří:
#include <stdio.h>
#include <stdlib.h>

int main () {
    
    printf("Hadnani PINu.\nMas za ukol uhodnout PIN.\nK dispozici mas dve varianty, TEZKA a LEHKA.\n");
    printf("Vybranim cislice 1 pro LEHKOU, nebo 2 pro TEZKOU obtiznost.\nNa uhodnuti mas 3 pokusy.\n");

    char varianta;

        scanf("%c", &varianta);

            switch (varianta)
            {
            case '1':
                printf("Zvolil jsi lehci variantu, budes mit napovedu.\n");
                printf("Zadej 4 cisla.\n");
                break;

            case '2':
                printf("Zvolil jsi tezsi variantu, nebudes mit napovedu.\n");
                printf("Zadej 4 cisla.\n");
                break;

            default:
                printf("Asi spatne zadane, zkus to znovu.\n");
                break;
            }

    return 0;
    }
Poradíte mi prosím? Předem děkuji za případné odpovědi.

Nahlásit jako SPAM
IP: 2a00:1028:8d19:ad32:f4e8:337b:4cbd:5e25...–
gna
~ Anonymní uživatel
1849 příspěvků
3. 5. 2020   #2
-
0
-

Vyhni se čtení po znacích ať nemusíš řešit to, že konec řádku (enter) je taky znak.

Při špatné volbě asi budeš chtít program ukončit, nebo volbu opakovat.

int main()
{
	int obtiznost = -1;
	while (obtiznost != 1 && obtiznost != 2) {
		printf("vyber obtiznost [1/2]: ");
		if (scanf("%d", &obtiznost) != 1) {
			fprintf(stderr, "chyba vstupu/vystupu\n");
			exit(EXIT_FAILURE);
		}
	}

	if (obtiznost == 1) {
		printf("napoveda\n");
	}

	printf("cyklus s hadanim pinu\n");

	return EXIT_SUCCESS;
}

Co dál? Ptej se konkrétně.

Nahlásit jako SPAM
IP: 213.211.51.–
zaltex0
Duch
3. 5. 2020   #3
-
0
-

#2 gna
Dobře, zkusím použít toto. To co jsem poslal, tak jsem s tím byl spokojený, ale můj problém nastal ve chvíli, když uživatel zvolí obtížnot. Chtěl bych mít nějaký takový výstup:
* < * > * > * (náhodně generované znaky)
7   8   9       (výstup číslic, ze kterých může uživatel vybírat)
4   5   6
1   2   3
    0
----------------------------------
7 9 6 4 (číslo zadané uživatelem)
----------------------------------
* < 9 > * > * (správné číslo se dosadí, pokud je na správném místě, špatné se už nezobrazí)
     8   9        (a v tomhle případě uživatel použil i čísla, která se objevují v řešení ale nejsou na správném místě, tak se zvýrazní)
4   5   6
1   2   3
    0
---------------------------------
4 9 8 6
Napadlo mě to nabouchat natvrdo, ale zase by byl problém s tím zvýrazněním a mizením číslic při pokusech.. zároveň nevím jak zakomponovat cyklus (nejspíš do while)

int pokus;

do {

//výstup čísel a zadávání čísel od uživatele

pokus++

}

while (pokus >=3);

Jestli jsem to vysvětlil nějak nerozumně, tak se to pokusím vysvětlit ještě jinak. Díky za pomoc.

Nahlásit jako SPAM
IP: 2a00:1028:8d19:ad32:addc:afbc:7357:28e6...–
gna
~ Anonymní uživatel
1849 příspěvků
3. 5. 2020   #4
-
0
-

C++ práci s konzolí neřeší. Na zvýraznění můžeš použít WinAPI, nebo prý snad teď konzole ve Windows podporuje terminálové řídící sekvence, ale na nějaké velké omalovánky se vykašli.

Já jsem narychlo nabušil toto, nesnažil jsem se moc vyhovět zadání. Pro inspiraci by to mohlo stačit. 

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

int zkontroluj_pin(const char *pin, const char *vyrazene)
{
	if (strlen(pin) != 4) {
		printf("pin musi byt ctyrmistny\n");
		return 0;
	}

	for (int i = 0; i < 4; i++) {
		if (!isdigit(pin[i])) {
			printf("lze pouzit jen cislice\n");
			return 0;
		}
		if (strchr(vyrazene, pin[i])) {
			printf("nelze pouzit vyrazene cislice\n");
			return 0;
		}
	}

	return 1;
}

int main()
{
	char pin[] = "0000";
	char odkryty_pin[] = "....";
	char zadany_pin[5];
	char posunute_cislice[] = "..........";
	char vyrazene_cislice[] = "..........";
	int obtiznost = -1;

	srand(time(0));
	for (int i = 0; i < 4; i++) {
		pin[i] = '0' + rand() % 10;
	}

	while (obtiznost != 1 && obtiznost != 2) {
		printf("vyber obtiznost [1 - s napovedou, 2 - naslepo]: ");
		if (scanf("%d", &obtiznost) != 1) {
			fprintf(stderr, "chyba vstupu/vystupu\n");
			exit(EXIT_FAILURE);
		}
	}

	if (obtiznost == 1) {
		printf("napoveda. pin neobsahuje tyto 3 cislice: ");
		int pocitadlo = 0;
		for (char c = '0'; c <= '9' && pocitadlo < 3; c++) {
			if (!strchr(pin, c)) {
				printf("%c", c);
				pocitadlo++;
			}
		}
		printf("\n");
	}

	for (int pokus = 0; pokus < 3; pokus++) {
		int platnypin = 0;
		while (!platnypin) {
			printf("== pokus %d\n", pokus + 1);
			printf("pin: %s, posunute: %s, vyrazene: %s [cheat: %s]\n",
				odkryty_pin, posunute_cislice, vyrazene_cislice, pin);
			printf("tip: ");
			if (scanf("%4s", zadany_pin) != 1) {
				fprintf(stderr, "chyba vstupu/vystupu\n");
				exit(EXIT_FAILURE);
			}

			platnypin = zkontroluj_pin(zadany_pin, vyrazene_cislice);
		}

		if (!strcmp(pin, zadany_pin)) {
			printf("bingo!\n");
			break;
		}

		for (int i = 0; i < 4; i++) {
			printf("%c - ", zadany_pin[i]);
			if (zadany_pin[i] == pin[i]) {
				printf("spravne\n");
				odkryty_pin[i] = pin[i];
			} else if (strchr(pin, zadany_pin[i])) {
				printf("spatna pozice\n");
				posunute_cislice[zadany_pin[i] - '0'] = zadany_pin[i];
			} else {
				printf("neobsahuje\n");
				vyrazene_cislice[zadany_pin[i] - '0'] = zadany_pin[i];
			}
		}
	}

	return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.211.51.–
zaltex0
Duch
3. 5. 2020   #5
-
0
-

Jo, to by šlo. Zkusím si s tím ještě pohrát a popřípadě dám vědť, jak jsem to doladil. Pokud se mi to podaří.

Děkuju moc.

Nahlásit jako SPAM
IP: 2a00:1028:8d19:ad32:addc:afbc:7357:28e6...–
zaltex0
Duch
4. 5. 2020   #6
-
0
-

Ahoj, zkusil jsem použít tvůj program, ale má to jednu chybku, kteŕe jsem si všiml. Tvůj program generuje náhodně jen čísla, což je skvělý, ale ještě k tomu potřebuju, aby to generovalo náhodně i znaménka (<,>) (větší, menší).

Tudíž vygeneruje to číslo (3740):

aby uživatel nehádal jen číslo, tak bych bylo dobré aby se na výstupu vygenerovali náhodně (ale v souvislosti na vygenerované čísla) znaménka menší, větší.

např: pro číslo (3740) *<*>*>* (* = jsou čísla, která uživatel má uhodnout). Dá se to nějak zakomponovat sem?


srand(time(0));
    for ((int i = 0; i < 4; i++)&&(char <,> = 0) {
        pin[i] = '0' + rand() % 10;
    }
Nebo něco v takovém smyslu? Přemýšlel jsem a jaksi mě to nějak jednoduše nenapadá.

Nahlásit jako SPAM
IP: 2a00:1028:8d19:ad32:e55f:7c5f:7383:df0f...–
gna
~ Anonymní uživatel
1849 příspěvků
4. 5. 2020   #7
-
0
-

Rand ti vrátí náhodnou hodnotu a s tou si nalož, jak chceš. I kdybys tam měl mít 13 ifů, tak to snad není problém. Ten výplod v hlavičce foru nechápu jak tě mohl napadnout. Nejjednodušší verze, co mě napadá je toto:

pin[i] = "0123456789<>="[rand() % 13];

Ale nechápu to, jak se mají ta znaménka generovat náhodně a zároveň v závislosti na číslicích pinu. Pokud mají ukazovat vztah sousedících číslic, tak nejdřív vygeneruješ ty číslice a podle nich doplníš znaménka.

Takže v té mé ukázce bych to třeba doplnil do toho odkrytého pinu. 

-char odkryty_pin[] = "....";
+char odkryty_pin[] = ".!.!.!.";
...
 for (int i = 0; i < 4; i++) {
 	pin[i] = '0' + rand() % 10;
 }
+for (int i = 0; i < 3; i++) {
+       // pro tebe tady asi bude jednodušší použít klasický if
+	int rozdil = pin[i] - pin[i+1];
+	char znamenko = (rozdil < 0) ? '<' : (rozdil > 0) ? '>' : '=';
+	odkryty_pin[i * 2 + 1] = znamenko;
+}
...
 printf("spravne\n");
-odkryty_pin[i] = pin[i];
+odkryty_pin[i * 2] = pin[i];

Ty +/- na začátcích řádků značí změny, přidat/odstranit. Ale nevím, jestli správně chápu, co myslíš.

Nahlásit jako SPAM
IP: 213.211.51.–
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, 12 hostů

Podobná vlákna

Pomoc s úkolem v C — založil Thill

Pomoc s úkolem — založil Stols

Pomoc s úkolem — založil Malirka

Pomoc s úkolem — založil Honza

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ý