Posloupnost čísel – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Posloupnost čísel – C / C++ – Fórum – Programujte.comPosloupnost čísel – C / C++ – Fórum – Programujte.com

 

Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #1
-
0
-

Dobrý den, mohl by mi někdo prosím pomoci jak napsat správně cyklus pro tuto slovní úlohu. :

Je dána posloupnost celých čísel ukončená 0. Nalezněte číslo, jehož hodnota je nejblíž číslu 100. Existují-li dvě různá čísla s minimální vzdáleností od čísla 100 (jedno větší a druhé menší než 100), uveďte jako výsledek obě čísla.

Díky

Nahlásit jako SPAM
IP: 193.86.238.–
Lorin0
Návštěvník
2. 3. 2015   #2
-
0
-

A co už máš napsané?

Jedna hlavní while podmínka, několik vnitřních if podmínek pro porovnání a dvě proměnné pro uchování nejbližších hodnot. Na závěr vypsání těchto hodnot.

Nahlásit jako SPAM
IP: 89.190.72.–
lukas.balaz0
Super člen
2. 3. 2015   #3
-
0
-

#2 Lorin
Skôr by som to urobil tak, že by som si pamätal jednu z tých výsledných hodnôt a potom jeden bool, že či v tej postupnosti existuje aj ta druhá rovnako vzdialená ... lebo nemusí .. ale to je len taká poznámka .... stále to je kód na pár riadkov, je úplne jedno, ako to urobíš.

Nahlásit jako SPAM
IP: 80.242.41.–
Lorin0
Návštěvník
2. 3. 2015   #4
-
0
-

#3 lukas.balaz
Je jasný, že to jde udělat stem různých způsobů. Nicméně to druhé číslo chtějí (pokud existuje) taky vypsat...

Nahlásit jako SPAM
IP: 89.190.72.–
Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #5
-
0
-

Mno mám zatím toto a přemýšlím jak dál.

#include<stdio.h>
#include<stdlib.h>
 main(void){
    int i;
    printf("Program pro posloupnost celych cisel, ve ktere se zjisti nejblizsi hodnota k cislu 100.\n");
    prtinf("\n");
    
    do {
    printf("Zadejte cislo");
    scanf("%d",&i); 
    i=i-100; 
    } while (i>0);
    
    
    system("pause");
    
    }

Nahlásit jako SPAM
IP: 193.86.238.–
lukas.balaz0
Super člen
2. 3. 2015   #6
-
0
-

#5 Marek
no tak ak je jedno číslo i, tak druhé bude 200-i .....
určite si musíš vytvoriť nejakú bočnú premennú (teda vlastne dve), v ktorej si budeš držať medzivýsledky.
Porozmýšlaj, aké premenné by to mohli byť a čo by si si v tom mohol držať, už sme ti tu dali paŕ návrhov...

#4 Lorin
To druhé číslo bude 200-i ako som vyššie napísal, funguje to pre ľubovolné i

Nahlásit jako SPAM
IP: 80.242.41.–
Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #7
-
0
-

#include<stdio.h>
#include<stdlib.h>
 main(void){
    int a,b,i;
    printf("Program pro posloupnost celych cisel, ve ktere se zjisti nejblizsi hodnota k cislu 100.\n");
    printf("\n");
    
    do {
          
    printf("Zadejte cislo:");
    scanf("%d",&i); 
    a=200-i; 
        
    } while (i>0);
    printf("Nejmensi cislo je %d\n",a);
    
    system("pause");
    
    }

Můžete mi prosím poradit jak zařadit vnitřní podmínku s if, aby to v tom registru pamatovalo to nejbližší číslo k 100?Díky

Nahlásit jako SPAM
IP: 193.86.238.–
Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #8
-
0
-

#include<stdio.h>
#include<stdlib.h>
 main(void){
    int a,b,i;
    printf("Program pro posloupnost celych cisel, ve ktere se zjisti nejblizsi hodnota k cislu 100.\n");
    printf("\n");
    printf("Zadejte cislo:");
    scanf("%d",&i); 
    b=200-i;
    do {
          
    printf("Zadejte cislo:");
    scanf("%d",&i); 
    if(a<b){b=a;}
    a=200-i; 
        
    } while (i>0);
    printf("Nejmensi cislo je %d\n",b-100);
    
    system("pause");
    
    }

Nahlásit jako SPAM
IP: 193.86.238.–
lukas.balaz0
Super člen
2. 3. 2015   #9
-
0
-

#8 Marek
Nejako nechápem, čo tam presne robiš .. zdá sa mi, že pri prvom opakovaní cyklu nie je v 'a' nič .... skús to vložiť ako kód (nájdeš to v lište nad textareou)

Nahlásit jako SPAM
IP: 80.242.41.–
Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #10
-
0
-

#include<stdio.h>
#include<stdlib.h>
 main(void){
    int a,b;
    float i;
    printf("Program pro posloupnost celych cisel, ve ktere se zjisti nejblizsi hodnota k cislu 100.\n");
    printf("\n");
    printf("Zadejte cislo:");
    scanf("%f",&i); 
    b=100-i;
    do {
          
    printf("Zadejte cislo:");
    scanf("%f",&i); 
    if(a<b){b=a;}
    a=100-i; 
        
    } while (i>0);
    printf("Nejblizsi cislo k cislu 100 je %d\n",b);
    
    system("pause");
    
    }

Mno program funguje pouze pro čísla, která jsou menší než 100. Jak to mám udělat i pro čísla větší jak nad 100 aby to umělo porovnávat.Jinak přesně nechápu jaký kód myslíte.

Nahlásit jako SPAM
IP: 193.86.238.–
Marek
~ Anonymní uživatel
521 příspěvků
2. 3. 2015   #11
-
0
-

Takže program funguje, ale neumí vypsat více čísel se stejnou vzdáleností, pouze umí vypsat jedno číslo.Jak to mám spravit? Děkuji

#include<stdio.h>
#include<stdlib.h>
 main(void){
    int i,c;
    float a,b;
    printf("Program pro posloupnost celych cisel, ve ktere se zjisti nejblizsi hodnota k cislu 100.\n");
    printf("\n");
    printf("Zadejte cislo:");
    scanf("%d",&i); 
    b=i-100;
    do {
          
    printf("Zadejte cislo:");
    scanf("%d",&i); 
    if(a<b){
            c=a+100;}
            
    
    a=i-100; 
        
    } while (i>0);
    printf("Nejblizsi cislo k cislu 100 je %d\n",c);
    
    system("pause");
    
    }

Nahlásit jako SPAM
IP: 193.86.238.–
Lorin0
Návštěvník
2. 3. 2015   #12
-
0
-

#10 Marek
V porovnání a<b nemá proměnná a žádný obsah. Nejspíš tedy nějaký obsah má, ale není pro vás relevantní. Dalším tipem je pojmenovávat proměnné trochu smysluplněji, než jednotlivými písmeny. 

Pokud chcete vypsat více čísel, budete muset použít pole. Tady už by se možná vyplatilo si všechna čísla zapsat do pole, toto pole seřadit od nejmenšího po největší, rozdělit na stovce a poté vypisovat všechna čísla menší nebo větší, tak jak jsou uložena v poli na jednu nebo druhou stranu. 
 

// Vektor naplnime vsemi cisly. Mezi ně vložíme i naší 100
std::vector<int> cisla;

// Seřadíme
std::sort( cisla.begin(), cisla.end() );

// Najdeme naší stovku
std::vector<int>::iterator it = std::find( cisla.begin(), cisla.end(), 100);

// Všechna čísla od cisla.begin() po it jsou menší než 100, seřazena od nejmenšího po největší.
// Všechna čísla od it po cisla.end() jsou větší než 100, seřazena od nejmenšího po největší.

Když na to tak koukám, je to možná overkill. Nicméně princip bude stejný i při použití standardních cčkových polí, ručního řazení atd. Jen to bude více psaní ;)

Nahlásit jako SPAM
IP: 89.190.72.–
lukas.balaz0
Super člen
2. 3. 2015   #13
-
0
-

#12 Lorin
Mám pocit, že zadanie je: nájdi číslo najbližšie ku 100 a vypíš ho. Ak je číslo najbližšie ku 100 od 100 vzdialené x a v postupnosti je aj číslo 100-x aj číslo 100+x, tak vypíš obidve. Mám pocit, že ak sa tam niektoré z týchto čísel opakuje, tak to ma nemusí trápiť. Nakoniec som sa rozhodol spísať ten jednoduchý program, na ktorý som myslel už v mojom prvom príspevku, len som chcel, aby na to Marek prišiel sám, Dúfam, že funguje :)

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int v = 1000000000;
	bool b;
	int i;
	while(cin>>i)
	{
		if(i==0)
		{
			cout << v << endl;
			if(b)cout << 200-v << endl;
			break;
		}
		if(i==200-v)b=true;
		if(abs(100-i)<abs(100-v))
		{
			v = i;
			b=false;
		}
	}
}


Premeniť to na C vôbec nebude problém, len asi bude treba namiesto bool použiť int a zmeniť načítavanie premenných.

Nahlásit jako SPAM
IP: 80.242.41.–
Marek
~ Anonymní uživatel
521 příspěvků
3. 3. 2015   #14
-
0
-

#13 lukas.balaz
 Jelikož jsem na pole ve škole chyběl a máme úlohu na pole, tak to je pak cool. Děkuji za rady.

Nahlásit jako SPAM
IP: 193.86.238.–
Lorin0
Návštěvník
3. 3. 2015   #15
-
0
-

#13 lukas.balaz
Moje chyba, špatně jsem si to přečetl. Díky za opravu ;).

Nahlásit jako SPAM
IP: 89.190.72.–
PiranhaGreg0
Stálý člen
3. 3. 2015   #16
-
0
-

Je tam slabé místo místo u konstanty inf a samozřejmě si to neporadí s čísly větší jak +-2147483648, ale jinak by to snad mělo fungovat...

#include <stdio.h>
#include <limits.h>

#define limit 100
#define inf 123456789

int main(void) {
	int min = -inf;
	int max = inf;
	int tmp;

	printf("Zadejte řadu čísel zakončenou nulou:\n");

	while(scanf("%d", &tmp) == 1 && tmp) {
		if (tmp > min && tmp <= limit)
			min = tmp;
		if (tmp < max && tmp >= limit)
			max = tmp;
	}

	if (min == -inf && max == inf) {
		fprintf(stderr, "prázdný vstup\n");
		return 1;
	}

	tmp = 2 * limit - max - min;
	printf("Číslu %d ", limit);

	if (tmp == 0)
		printf("byla nejblíže čísla %d a %d.\n", min, max);
	else
		printf("bylo nejblíže číslo %d.\n", tmp > 0 ? max : min);

	return 0;
}
Nahlásit jako SPAM
IP: 109.81.210.–
Marek
~ Anonymní uživatel
521 příspěvků
3. 3. 2015   #17
-
0
-

#16 PiranhaGreg
Děkuji, mohl bych poprosit o vysvětlení, proč je to zrovna právě takto napsáno ? Děkuji

Nahlásit jako SPAM
IP: 193.86.238.–
PiranhaGreg0
Stálý člen
3. 3. 2015   #18
-
0
-

Nejprve si založím dvě proměnné s nějakými konstantami, do kterých se snad uživatel nikdy netrefí. min pro co nejvyšší nižší číslo jak je 100 a max pro co nejnižší vyšší číslo jak je to 100 (uznávám že to pojmenování proměnných je trochu matoucí ).

Poté v cyklu načítám vstupní hodnoty a podle těch pravidel jak jsem popsal v předchozím odstavci případně aktualizuji proměnnou min a max.

Samotný běh cyklu závisí na 

scanf("%d", &tmp) == 1 && tmp

Funkce scanf má za úkol načíst nové číslo ze vstupu do proměnné tmp a jako návratovou hodnotu vrací počet úspěšně načtených proměnných. Proto pokud vrátí něco jiného než jedna, na vstupu je nějaký nesmysl a cyklus tak skončí. Dále se ještě ověří, že v samotné proměnné tmp je nenulová hodnota. Šlo by to napsat i jako tmp != 0. Tohle je zkratka.

Následně si ověřím, že bylo na vstupu alespoň jedno číslo a to tak, že v proměnné min nebo max je něco jiného než na začátku cyklu. Pokud na vstupu nic nebylo, vypíšu o tom hlášku na standardní chybový výstup a nenulovou návratovou hodnotou zahlásím, že je něco špatně.

Kód 

tmp = 2 * limit - max - min;

je trochu šalamounský. Každopádně pokud vyjde tmp záporné, je blíže ke stovce to menší číslo uložené v proměnné min, pokud vyjde kladné, je blíže ke stovce větší číslo uložené v max a pokud je tmp rovno nule, jsou min i max od stovky stejně daleko (klidně se obě můžou rovnat 100). Když tak si to rozkresli proč to platí .

No a pak samotný výpis výsledku už je asi celkem jasný. Za zmínku stojí snad jen část 

tmp > 0 ? max : min

v posledním printf. Je to taková zkratka pro podmínku if - else. Pokud výraz před otazníkem platí, vrátí se první část za otazníkem a pokud neplatí, vrátí se až ta druhá (ta za dvojtečkou). V situacích jako je tato se to docela hodí. Jinak samozřejmě dál používej blok if - else...

Jestli ještě něco není jasný, ptej se .

Nahlásit jako SPAM
IP: 109.81.210.–
Marek
~ Anonymní uživatel
521 příspěvků
4. 3. 2015   #19
-
0
-

#18 PiranhaGreg
Neznám knihovnu limits, ačkoliv jsem na střední tak mi vysokoškolská matematika nedělá problémy, takže limity chápu, ale můžete mi vysvětlit prosím tu limitu k 100 v tomto programu ? Díky

Nahlásit jako SPAM
IP: 193.86.238.–
lukas.balaz0
Super člen
4. 3. 2015   #20
-
0
-

#19 Marek
"limit 100" nemá s limitami nič spoločné ... v tom programe to je len číslo, ku ktorému najbližšie čísla v postupnosti hľadáš ... zmeň to číslo 100 na 0 a bude ti to hľadať najbližšie čísla k 0 nie ku 100 :D

Nahlásit jako SPAM
IP: 80.242.41.–
Marek
~ Anonymní uživatel
521 příspěvků
4. 3. 2015   #21
-
0
-

#20 lukas.balaz
OK

Nahlásit jako SPAM
IP: 193.86.238.–
Marek
~ Anonymní uživatel
521 příspěvků
8. 3. 2015   #22
-
0
-

#20 lukas.balaz
Mohu se zeptat na význam knihovny limits.h ? díky

Nahlásit jako SPAM
IP: 193.86.238.–
lukas.balaz0
Super člen
8. 3. 2015   #23
-
0
-
Nahlásit jako SPAM
IP: 80.242.41.–
PiranhaGreg0
Stálý člen
8. 3. 2015   #24
-
0
-

limits.h jsem tam měl původně kvůli makrům INT_MIN a INT_MAX, které měli symbolizovat ±∞. Později jsem zjistil, že to byl blbej nápad, ale hlavičkový soubor limits.h už jsem odstranit zapomněl. Teď už mi ten příspěvek nejde editovat...

Nahlásit jako SPAM
IP: 109.81.210.–
Marek
~ Anonymní uživatel
521 příspěvků
8. 3. 2015   #25
-
0
-

Díky

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

Podobná vlákna

Posloupnost čisel — založil bender89

Posloupnost celých čísel — založil Dmitriy

Posloupnost čísel - úkol — založil Sandokan

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ý