Nemůžu najít chybu v jednoduchém kódu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nemůžu najít chybu v jednoduchém kódu – C / C++ – Fórum – Programujte.comNemůžu najít chybu v jednoduchém kódu – C / C++ – Fórum – Programujte.com

 

Davi Rubý
~ Anonymní uživatel
1 příspěvek
22. 6. 2016   #1
-
0
-

Zdravím,

teprve začínám s programováním v C++ a udělal jsem program založený na vzorci z tohoto webu: http://mathforum.org/dr.math/faq/faq.calendar.html

Při startu programu se zadá datum ve formátu dd mm yyyy. Ten podle potom rozdělí dny, měsíce, stolení a desetiletí. Potom se vypočte výsledek podle vzorce a určí, který den byl. Určování dní mám zatím vypnuté a vložil jsem řádek, který mi vypíše veškeré vypočtené hodnoty kvůli kontrole.

Zde nastává ten problém. Měsíc se pokaždé rovná 1. Přikládám zdroják a doufám, že mi snad někdo poradí.

Děkuji. :)

#include <iostream>
using namespace std;

int main() {

	int f, k, m, y, D, C, den;



	cout << "Enter date";
	cin >> k;
	cin >> m;
	cin >> y;

		switch (m) {
		case 1:
			m = 11;
			break;
		case 2:
			m = 12;
			break;
		case 3:
			m = 1;
			break;
		case 4:
			m = 2;
			break;
		case 5:
			m = 3;
			break;
		case 6:
			m = 4;
			break;
		case 7:
			m = 5;
			break;
		case 8:
			m = 6;
			break;
		case 9:
			m = 7;
			break;
		case 10:
			m = 8;
			break;
		case 11:
			m = 9;
			break;
		case 12:
			m = 10;
			break;
		default:
			cout << "Wrong choice.\n";
			break;
		} 

	C = (y / 100);
	D = y % 100;

	if (m = 1)
		D--;
	else if (m = 2)
		D--;


	f = k + ((13 + m - 1) / 5) + D + (D / 4) + (C / 4) - 2 * C;
	den = f % 7;

/*	switch (den) {
	case 0:
		cout << "Nedele\n";
		break;
	case 1:
		cout << "Pondeli\n";
		break;
	case 2:
		cout << "Utery\n";
		break;
	case 3:
		cout << "Streda\n";
		break;
	case 4:
		cout << "Ctvrtek\n";
		break;
	case 5:
		cout << "Patek\n";
		break;
	case 6:
		cout << "Sobota\n";
		break;
	}*/
	//thus is part of program, but turned off, because i need to explore the mistake
	cout << "k=" << k << endl << "m=" << m << endl << "C=" << C << endl << "D=" << D << endl << "f=" << f << endl << "den=" << den << endl;
//this can show me the mistake. The mistake is in mounth, but i don't know where...
	return 0;
}
Nahlásit jako SPAM
IP: 77.48.54.–
lukas.balaz0
Super člen
22. 6. 2016   #2
-
0
-

#1 Davi Rubý
Nechcelo sa mi ten kód čítať, takže asi to nie je všetko, ale hneď som si napr. všimol, že máš v if jedno =, ale asi by tam dve ==.

Nahlásit jako SPAM
IP: 80.242.41.–
lukas.balaz0
Super člen
22. 6. 2016   #3
-
0
-

#1 Davi Rubý
OK, pozrel som sa na to bližšie.

  1. ten prvý switch tam vôbec nemusí byť, stačí odpočítať 2 a ak je menšie rovné 0, tak pripočítať 12. Alebo sa to dá ešte jednoduchšie: 
    m = m-2>0 ? m-2 : m+10;
  2. V tých podmienkach teda má byť ==, ale okrem toho sa dajú spojiť do jednej: 
    if(m==1 || m==2)D--;


    alebo: 

    if(m<=2)D--;
  3. Podľa tej stránky, z kade máš ten vzorec, môžu výjsť aj záporné čísla. Jednoducho stačí hneď po riadku 'den = f % 7' pridať 'if(den<0)den+=7'.
  4. Vo vzorci je 13*m-1, nie 13+m-1
     

Nahlásit jako SPAM
IP: 80.242.41.–
BDS+3
Věrný člen
22. 6. 2016   #4
-
0
-

před lety jsem si taky zkoušel udělat prográmek na výpočet dne v týdnu. Tak ho tu hodím, třeba jako další způsob jak ten problém řešit: 

#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
const char *nazevDne[7] = {"Nedele", "Pondeli", "Utery", "Streda", "Ctvrtek", "Patek", "Sobota"};
const int t[12] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
int maxDen[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//---------------------------------------------------------------------------
bool Prestupny(int rok);
int IndexDne(int d, int m, int r);
//---------------------------------------------------------------------------
int main()
{
 int rok, mesic, den, index;
 cout << "Zadejte rok v rozmezi 1583-9999\n";
 cin >> rok;
 //rok:
 if(rok > 1582 && rok < 10000) // 1583 - greg.kal. (>9999 ?)
 {
  cout << "Zadejte mesic v rozmezi 1-12\n";
  cin >> mesic;
  //mesic:
  if(mesic > 0 && mesic < 13)
  {
   maxDen[1] = Prestupny(rok) ? 29 : 28; //unor
   cout << "Zadejte den v rozmezi 1-" << maxDen[mesic-1] << endl;
   cin >> den;
   //den:
   if(den > 0 && den <= maxDen[mesic-1])
   {
	//vypocet:
	index = IndexDne(den, mesic, rok);
	cout << "\nNa den " << den << '.' << mesic << '.' << rok << " pripada " << nazevDne[index] << endl;
   }
   else cout << "Zadany den je mimo rozsah!\n";
  }
  else cout << "Zadany mesic je mimo rozsah!\n";
 }
 else cout << "Zadany rok je mimo rozsah!\n";

 system("PAUSE");

 return 0;
}
//---------------------------------------------------------------------------
bool Prestupny(int rok)
{
  if (!(rok % 400)) return true;
  if (!(rok % 100)) return false;
  if (!(rok % 4)) return true;
  return false;
}
//---------------------------------------------------------------------------
int IndexDne(int d, int m, int r)
{
 if(m<3)r-=1;
 return (r + r/4 - r/100 + r/400 + t[m-1] + d) % 7;
}
//---------------------------------------------------------------------------

Doufám, že tam není chyba, ale myslím, že fungoval správně (jinak bych to asi neschovával).

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
peter
~ Anonymní uživatel
4016 příspěvků
23. 6. 2016   #5
-
0
-

m = m-2>0 ? m-2 : m+10;
1 -> 1-2>0 ? 1-2 : 1+10 -> 11
2 -> 2-2>0 ? 2-2 : 2+10 -> 12
3 -> 3-2>0 ? 3-2 : 3+10 -> 1

ja bych mozna pouzil (prevedl dvojku na druhou stranu)
m = m>2 ? m-2 : m+10; nebo

m -= 2;
m = m>0 ? m : m+12; nebo

m = (9 + m) % 12 + 1 //  +1 je tam proto, ze potrebujes aby min bylo 1 a soucasne tu 1 musis odpocitat z 10
1 -> ((9 + 1) %12) + 1 = 10 + 1
2 -> ((9 + 2) %12) + 1 = 11 + 1
3 -> ((9 + 3) %12) + 1 =  0 + 1
4 -> ((9 + 4) %12) + 1 =  1 + 1

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d104:f2...–
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, 42 hostů

Podobná vlákna

Nemuzu najit chybu — založil Franceq

Nemuzu najit chybu... — založil anonym

Nemůžu najít chybu - kód pro vstup — založil Garret Raziel

Nemuzu najit rozdil — založil Franceq

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ý