Jednoduchý program - proč mi nefunguje? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jednoduchý program - proč mi nefunguje? – C / C++ – Fórum – Programujte.comJednoduchý program - proč mi nefunguje? – C / C++ – Fórum – Programujte.com

 

knuspi
~ Anonymní uživatel
2 příspěvky
4. 12. 2014   #1
-
0
-

Předem upozorňuji, že jsem začátečník :D

/*Cílem programu je najít tri cisla, jejichz soucin bude delitelny libovolným součtem dvou z nich.*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
main()
{
int a,b,c,K,P1,P2,P3;
a=0, b=0, c=0;
while (a<20){
    while (b<20){
        while (c<20){
            K=a*b*c;
            P1=a+b;
            P2=a+c;
            P3=b+c;
            if (K%P1==0&&K%P2==0&&K%P2==0)cout<<a<<""<<b<<""<<c<<endl;
        }
        b=b+1;
        c=0;
    }
    a=a+1;
    b=0;
    c=0;
}




 system("PAUSE");
 return 0;
}

Když program pustím přes Codeblock, tak se sice spustí, ale hned spadne. Mohl by mi někdo poradit, kde dělám chybu?

Nahlásit jako SPAM
IP: 194.228.217.–
peter
~ Anonymní uživatel
3981 příspěvků
4. 12. 2014   #2
-
0
-

Ja teda cecko nedelam, ale rekl bych, ze to bude spatnymi podminkami :)

tri cisla, jejichz soucin (K) bude delitelny libovolným součtem dvou z nich (P1, P2, P3)
K%P1==0&&K%P2==0&&K%P2==0
 

1. nemas tam p3

2. ty podminky nemuzou platit soucasne :) leda v pripade, ze jsou ty cisla 0 a pak ale nulou nelze delit. Coz by melo nekde vypsat error, pokud mas zapnuty vypis erroru.

Jestli to budes ladit, tak by bylo asi dobre, do kazde podminky, cyklu a pod si vlozit vypsani pismen nebo cisel, abys videl, ktere se provedli a kdy

while (a<20){
vypis 1
    while (b<20){
vypis 2
        while (c<20){
vypis 3
            K=a*b*c;
            P1=a+b;
            P2=a+c;
            P3=b+c;
            if (K%P1==0&&K%P2==0&&K%P2==0)
{
vypis 4
cout<<a<<""<<b<<""<<c<<endl;
}
        }
        b=b+1;
        c=0;
    }
    a=a+1;
    b=0;
    c=0;
}

kdyz se 4 nevypise, tak budes vedet, ze podminka nikdy nenastala a tudiz je v ni problem.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:83a:31e...–
ondrej39+1
Věrný člen
4. 12. 2014   #3
-
0
-

#1 knuspi
Čísla máš inicializovaná na nulu, sice provádíš jejich součet, ale 0+0 je stále 0. Následně touto nulou dělíš, což ti samozřejmě překladač nepovolí.

Detailnější zadání se situacemi, které mohou nastat...

   //Cílem programu je najít tři čísla, jejichž součin bude dělitelný libovolným součtem dvou z nich,
   //přičemž předpokládáme, že dělení má být beze zbytku.
 
   //Máme zadáno, že jednotlivé číslo nesmí být větší než 20.
 
   //1) Co se tedy může stát?
   //   1.1) Může být jedno číslo nulové - na zbylých číslech poté logicky nezáleží,
   //        protože 0/něčím = 0 - nemá zbytek
   //   1.2) Mohou být všechna 3 čísla nenulová - zde se bude muset provést podmínka
   //        a najít vhodného dělitele
 
   //2) Co se nesmí stát?
   //   2.1) nesmí být více než dvě čísla nulová (a*b*c by sice vrátilo nulou,
   //        ale později v programu by probíhalo dělení nulou =-> nelze
   //   2.2) nesmí být všechna 3 čísla nulová


Z toho by ti mělo již být patrné, že tvůj kód fungovat nemůže, protože tvůj kód splňuje pravidlo 2.2), které je zakázané.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
knuspi
~ Anonymní uživatel
2 příspěvky
4. 12. 2014   #4
-
0
-

peter a ondrej39 dekuji :) Nechápu, že mě to nenapadlo.

/*Cílem programu je najít tri cisla, jejichz soucin bude delitelny libovolným součtem dvou z nich.*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
main()
{
int a,b,c,K,P1,P2,P3;
a=1, b=1, c=1;
while (a<100){
    while (b<100){
        while (c<100){
            K=a*b*c;
            P1=a+b;
            P2=a+c;
            P3=b+c;
            if (K%P1==0&&K%P2==0&&K%P3==0)cout<<a<<""<<b<<""<<c<<endl;
        }
        b=b+1;
        c=1;
    }
    a=a+1;
    b=1;
    c=1;
}




 system("PAUSE");
 return 0;
}

Peter proč by nemohly podmínky platit současně? Cilem programu je podle mě zjistit, že žádná taková tři čísla neexistují, ale podmínky by snad měly už být správně.

Nahlásit jako SPAM
IP: 194.228.217.–
ondrej39+1
Věrný člen
4. 12. 2014   #5
-
0
-

#4 knuspi
Tvá aktuální verze sice možná půjde spustit, ale nepokrývá všechna řešení. Může totiž nastat situace, že jedno číslo bude nulové, to ty nikde nepoužíváš.

 Možná implementace tvého programu (mělo by to dělat to, co chceš):

   //Cílem programu je najít tři čísla, jejichž součin bude dělitelný libovolným součtem dvou z nich,
   //přičemž předpokládáme, že dělení má být beze zbytku.
  
   //Máme zadáno, že jednotlivé číslo nesmí být větší než 20.
  
   //1) Co se tedy může stát?
   //   1.1) Může být jedno číslo nulové - na zbylých číslech poté logicky nezáleží,
   //        protože 0/něčím = 0 - nemá zbytek
   //   1.2) Mohou být všechna 3 čísla nenulová - zde se bude muset provést podmínka
   //        a najít vhodného dělitele
  
   //2) Co se nesmí stát?
   //   2.1) nesmí být více než dvě čísla nulová (a*b*c by sice vrátilo nulou,
   //        ale později v programu by probíhalo dělení nulou =-> nelze
   //   2.2) nesmí být všechna 3 čísla nulová
 

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

#define MAX_VELIKOST 3; // definice konstanty, abys mohl snadno měnit rozpětí programu, kdybys chtěl vyšší čísla

int main()
{
	int a, b, c; // deklarace inicializace na maximální velikost
	a = b = c = MAX_VELIKOST;	
	
	cout << "Mozne varianty:" << endl << endl;
	
	while (a + b != 0 && a + c != 0 && b + c != 0)
	{
		while (c >= 0) {
			while (b >= 0) {
				while (a >= 0) {
					int soucin, soucet_AB, soucet_AC, soucet_BC;
					soucin = a*b*c;
					soucet_AB = a + b;
					soucet_AC = a + c;
					soucet_BC = b + c;
					if (soucet_AB != 0 && soucet_AC != 0 && soucet_BC != 0)
					{
						if (soucin%soucet_AB == 0 && soucin%soucet_AC == 0 && soucin%soucet_BC == 0)
						{
							cout << "A: " << a << ", B: " << b << ", C: " << c << endl;
						}
					}
					a--;
				}
				b--;
				if (a == -1) a = MAX_VELIKOST;
			}
			c--;
			if (a == -1) a = MAX_VELIKOST;
			if (b == -1) b = MAX_VELIKOST;			
		}
	}

	system("PAUSE");
	return 0;
}
Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
peter
~ Anonymní uživatel
3981 příspěvků
5. 12. 2014   #6
-
0
-

ondrej390
a=1, b=1, c=1;
Cisla pouze incrementuje, takze nulove muze byt pouze v pripade, ze prekroci rozsah integeru, ne?


knuspi
Jo, sory, mi to pak doslo, ze jsem to pochopil trochu jinak, tu podminku.
Jinak, ty pocatecni a koncove hodnoty bych dal jako vstupy funkce. Ale nejspis je to nejaky skolni priklad...

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:8133:66...–
ondrej39+1
Věrný člen
5. 12. 2014   #7
-
0
-

#6 peter
Předpokládám, že cílem bylo najít kombinace 3 čísel, které vyhovují zadání. Takové kombinace se skládají i z možností, že vždy jedno číslo je nulové a na dalších dvou nezáleží - veškeré následující kombinace vyhovují: {{0, 3, 6}, {12, 0, 8}, {167, 2547, 0}}. Pokud by inicializoval čísla na 1 a poté pouze jejich hodnoty inkrementoval, je logické, že varianty s nulou nikdy nepokryje, neboť začíná na jedničce.

Zároveň také nemůže začít s inicializací čísel na 0, protože se tím poruší pravidlo že jakákoliv dvě až tři čísla jsou zároveň nula - v jednom nebo ve všech případech poté nelze provést dělení (dělení nulou).

Dalo by se to podmínkami ověřit, ale myslím si, že mnohem snazší řešení je použití dekrementaci od nejvyššího hledaného čísla, tak jak to mám v návrhu já.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
peter
~ Anonymní uživatel
3981 příspěvků
5. 12. 2014   #8
-
0
-

Ok, nepromyslel jsem to az tak do hloubky.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:8133:66...–
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, 25 hostů

Podobná vlákna

Jednoduchy guestbook nefunguje — založil radovanKa

Proč to nefunguje — založil Radim Krsička

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ý