Ahoj, dle mého názoru je nejlepší volbou kniha Dokonalý kód (Code complete), kterou napsal Steve McConnell
Příspěvky odeslané z IP adresy 188.120.210.–
#5 Roman
Při deklaraci proměnných je vždy inicializuj (int a = 0; std::string b = "";), snadno se ti pak stane, že program dělá co nemá, protože nemáš jistotu, co na daných adresách je. Dále bych si zvolil pouze jeden jazyk pro názvy proměnných a metod, půlka česky a druhá půlka anglicky mi moc do oka nejde :-) a poslední věc ... nebylo by na škodu předělat to do objektů .. to je vše co mne k tomu napadlo, možná někdo bude mít jiný názor
#4 Yenkee
už mi to nejde editovat.. u F05 jsem na něco zapomněl .. nebylo by od věci v mainu nastavit proměnný počátek a konec intervalu = 0..
PS: promiň až teď jsem si všiml, že se má pracovat pořád s tím prvním polem,ale to už si snadno doopravíš
F06
bool zjistiNarust(int(*pole), const int& POCET_PRVKU)
{
for (int i = 1; i < POCET_PRVKU; i++)
{
if (pole[i] > pole[i - 1])
{
return true;
}
else
return false;
}
}
int main(int argc, char** argv)
{
int const POCET_PRVKU = 19;
int pole[POCET_PRVKU] = { 1, 2, 3, 4, 5, 6, 7, 8., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
zjistiNarust(pole, POCET_PRVKU);
return 0;
}
Ahoj, tady máš Funkci02 - 05 (u některých je třeba ještě ošetřit vstupy)
F02
int const POCET_PRVKU = 19;
double pole[POCET_PRVKU];
double cislo = 0.5;
for (int i = 0; i < POCET_PRVKU; i++)
{
cislo = cislo / 2;
pole[i] = cislo;
}
F03
double parametr;
cout << "Zadejte libovolne cislo: " << endl;
cin >> parametr;
for (int i = 0; i < POCET_PRVKU; i++)
{
pole[i] = parametr;
}
F04
bool porovnejPole()
{
int const POCET_PRVKU = 19;
int i = 0;
double pole[POCET_PRVKU]
= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
double pole1[POCET_PRVKU]
= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
for (i = 0; i < POCET_PRVKU; i++)
{
if (pole[i] == pole1[i])
{
return true;
}
else
return false;
}
}
int main(int argc, char** argv)
{
porovnejPole();
return 0;
}
F05
int zjistiKolikCiselNepatri(int& pocatekIntervalu, int& konecIntervalu, int& pomocna)
{
int const POCET_PRVKU = 19;
int i = 0;
int pole[POCET_PRVKU] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
for (i = 0; i < POCET_PRVKU; i++)
{
if (pole[i] < pocatekIntervalu || pole[i] > konecIntervalu)
{
pomocna++;
}
}
return pomocna;
}
int main(int argc, char** argv)
{
int pocatekIntervalu;
int konecIntervalu;
int pomocna = 0;
cout << "Zadejte pocatek intervalu: " << endl;
cin >> pocatekIntervalu;
cout << "Zadejte konec intervalu: " << endl;
cin >> konecIntervalu;
zjistiKolikCiselNepatri(pocatekIntervalu, konecIntervalu, pomocna);
cout << "Pocet prvku pole mimo zadany interval: " << pomocna << endl;
return 0;
}
#35 KIIV
Ano, mám dva druhy výpisů, kde každý používám na něco jiného (oba fungují, jak mají)
void vypis()
{
cout << "ROSTLINA: " << druh << " "
<< ", BARVA KVETU: " << barvaKvetu << " "
<< ", VYSKA: " << vyska << "" << endl;
}
void RostlinaInfo()
{
cout << "----------------------" << endl;
cout << "Informace o rostline: " << endl;
cout << "----------------------" << endl;
cout << "Druh: " << druh << endl;
cout << "Barva Kvetu: " << barvaKvetu << endl;
cout << "Vyska: " << vyska << " cm" << endl;
cout << "Cena: " << cenaDruhu() + cenaBarvyKvetu() + cenaVysky() << " Kc" << endl;
}
#29 KIIV
Pokud spustím program, přidám rostliny a uložím, tak jsou v souboru zapsány, pokud při stejném běhu programu přidám další rostlinu a chci uložit podruhé, do souboru se už neuloží, jsou tam jen ty z prvního uložení (hlásí chybu, že se soubor nepodařilo otevřít). No a pokud program vypnu a znovu zapnu, tak se obsah souboru vymaže.
Netušíte někdo proč se mi data do souboru zapíší, ale neuloží ? po znovu spuštění programu se soubor vymaže, stejně tak pokud chci ukládat více než jednou (to už se ani nezapíší)
metoda ve třídě:
void ulozDoSouboru(ofstream& soubor)
{
soubor << druh;
soubor << barvaKvetu;
soubor << vyska;
}
implementace
ofstream f("cesta k souboru");
if (f.is_open())
{
for (int i = 0; i < pocet; i++)
{
rostliny[i].ulozDoSouboru(f);
}
cout << "Informace o rostlinach na zahone byly uspesne ulozeny. " << endl;
f.close();
}
else
cout << "Soubor se nepodarilo otevrit." << endl;
}
Zdravím, většinu funkcí se mi již podařilo opravit, nyní jsem se zasekl na funkci, která by dokázala odebrat vybranou rostlinu, kterou přidávám následující funkcí.
void pridejRostlinu(rostlina** rostliny, int& pocet)
{
//zde vstupy od uživatele a podmínky, které je šetří -pro přehlednost
// jsem je vynechal
rostlina* rostliny2 = new rostlina[pocet + 1];
for (int i = 0; i < pocet; i++)
{
rostliny2[i] = (*rostliny)[i];
}
rostliny2[pocet] = rostlina(druh, barvaKvetu, vyska);
*rostliny = rostliny2;
pocet++;
}
zatím jsem zkusil opravit pouze třídu rostlina, už by to mělo vracet to, co je potřeba
rostlina.h
#ifndef __Rostlina_h_
#define __Rostlina_h_
class Rostlina
{
private:
std::string druh;
std::string barvaKvetu;
int vyska;
public:
Rostlina(std::string infoRostlina);
std::string vypisDruh();
std::string vypisBarvuKvetu();
int vypisVysku();
int vypisCenu();
int vypisCenuDruhu();
};
#endif // __Rostlina_h_
rostlina.cpp
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include "Rostlina.h"
using namespace std;
Rostlina::Rostlina(std::string infoRostlina){
stringstream rostlinaStream(infoRostlina);
rostlinaStream >> druh;
rostlinaStream >> barvaKvetu;
rostlinaStream >> vyska;
}
std::string Rostlina::vypisDruh(){
cout << "Druh: " << druh << endl;
}
std::string Rostlina::vypisBarvuKvetu(){
cout << "Barva kvetu: " << barvaKvetu << endl;
}
int Rostlina::vypisVysku(){
cout << "Vyska: " << vyska << endl;
}
int Rostlina::vypisCenu(){
int cena = 0;
if(druh == "ruze")
{
cena = cena + 30;
} else if (druh == "cimisnik")
{
cena = cena + 25;
} else if (druh == "denivka")
{
cena = cena + 20;
} else if (druh == "levandule")
{
cena = cena + 15;
} else if (druh == "tulipan")
{
cena = cena + 10;
} else { cout << "Tuto rostlinu bohuzel nemame." << endl;
exit(EXIT_FAILURE);
}
if(barvaKvetu == "cervena")
{
cena = cena + 15;
} else if (barvaKvetu == "fialova")
{
cena = cena + 14;
} else if (barvaKvetu == "bila")
{
cena = cena + 13;
} else if (barvaKvetu == "ruzova")
{
cena = cena + 12;
} else if (barvaKvetu == "zelena")
{
cena = cena + 11;
} else { cout << "Rostliny o takove barve kvetu bohuzel nemame." << endl;
exit (EXIT_FAILURE);
}
if (vyska > 0 && vyska < 15)
{
cena = cena + 5;
} else if (vyska > 15 && vyska < 30)
{
cena = cena + 10;
} else if (vyska > 30 && vyska < 60 )
{
cena = cena + 40;
} else { cout << "Zadana vyska je neplatna. Pouzijte prosim vysku od 0 do 60 cm" << endl;
exit (EXIT_FAILURE);
}
cout << "Cena této rostline je: " << cena << "Kč." << endl;
}
int Rostlina::vypisCenuDruhu(){
int cena = 0;
if(druh == "ruze"){
cena = cena + 30;
} else if (druh == "cimisnik"){
cena = cena + 25;
} else if (druh == "denivka"){
cena = cena + 20;
} else if (druh == "levandule"){
cena = cena + 15;
} else if (druh == "tulipan"){
cena = cena + 10;
} else { cout << "Tuto rostlinu bohuzel nemame." << endl;
exit (EXIT_FAILURE);
}
cout << "Cena " << druh <<" je: " << cena << " Kč" << endl;
}
#15 Jerry
Ale ano, odhalili mi spoustu chyb, které se snažím postupně vyřešit. Například už se mi podařilo opravit "vypisNeco" metody, aby opravdu vracely to, co potřebuji. Nabídku na opravu jsem zadal proto, abych ušetřil investovaný čas, člověku, který tomu rozumí to zabere 1/10 času. Já se programovat učím 2 měsíce, takže mi bohužel chybí ten potřebný nadhled a u každého, byť sebemenšího problému, se zaseknu na dlouhou dobu.
Tvůj komentář byl více než zbytečný.
Dát to sem klidně můžu, otázkou je, kdo to zadarmo bude chtít zkontrolovat :-)
Požadovaná funkcionalita:
- přidání nové rostliny na záhon
- odebrání vybrané rostliny ze záhonu
- výpis informací o vybrané rostlině včetně její ceny
- výpočet celkové ceny všech rostlin na záhoně
- výpis informací a výpočet celkové ceny všech rostlin konkrétního druhu
Záhon má předem definovanou kapacitu (počet rostlin), takže nelze přidávat
do nekonečna, rovněž nelze odebírat ze záhonu, který nemá žádné rostliny.
Rostlina:
- druh (např. růže, čimišník, denivka ...)
- barva květu
- výška
Každá rostlina má určitou cenu (v Kč), která se vypočítá z výše uvedených
informací.
Program bude uchovávat stav záhonu v souboru, kam se budou promítat
veškeré změny (přidání, odebrání).
Mé řešení:
main.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <Rostlina.h>
#include <Zahon.h>
using namespace std;
void vypisMenu(){
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "+ +" << endl;
cout << "+ 1) Pridat rostlinu +" << endl;
cout << "+ 2) Odebrat rostlinu +" << endl;
cout << "+ 3) Vypsat informace o rostline +" << endl;
cout << "+ 4) Vypocitat celkovou cenu +" << endl;
cout << "+ 5) Vypsat informace o konketnim druhu +" << endl;
cout << "+ +" << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
}
void vypis(Rostlina rostlina);
void vypisCenuDruhu(Rostlina);
void odebratRostlinu(Zahon, int);
void pridatRostlinu(Zahon);
void cenaVsechRostlin(Zahon);
void cenaVsechDruhu(Zahon);
int main(int argc, char **argv){
vypisMenu();
int vstup = 0;
int cena = 0;
int i = 1;
const int limit = 50;
cout << " Zadejte vasi volbu: " << endl;
cin >> vstup;
Zahon zahon("Soubor.txt");
for(Rostlina rostlina : zahon.rostliny){
cout << i << ". ";
vypis(rostlina);
cena = cena + rostlina.vypisCenu();
i++;
}
cout << "-----------------------------------------------" << endl;
switch(vstup){
case 1: {
if(zahon.rostliny.size() > limit){
cout << "Na tento zahon pridat vice rostlin !" << endl;
break;
}
else{
pridatRostlinu(zahon);
}
}
break;
case 2: {
cout << "Zadejte prvek ktery chcete odebrat: ";
int prvek = 0;
cin >>prvek;
if(prvek > 0 && prvek < limit && prvek < zahon.rostliny.size()){
odebratRostlinu(zahon, prvek);
}
else{
cout << "Nepaltny vstup !";
return 0;
}
break;
}
case 3: {
cout << "Zadejte rostlinu, kterou chcete vypsat: ";
int prvek = 0;
cin >> prvek;
if(prvek > 0 && prvek < limit && limit > zahon.rostliny.size()){
vypis(zahon.rostliny.at(prvek-1));
}
else{
cout << "Neplatny vstup !";
return 0;
}
break;
}
case 4: {
cenaVsechRostlin(zahon);
break;
}
case 5: {
cenaVsechDruhu(zahon);
break;
}
default:{
cout << "Neplatna volba! " << endl;
return 0;
}
}
ofstream soubor;
soubor.open("soubor.txt");
for(Rostlina rostlina : zahon.rostliny){
soubor << rostlina.vypisDruh() << " " << rostlina.vypisBarvuKvetu() << " " << rostlina.vypisVysku() << endl;
}
}
void vypis(Rostlina rostlina){
cout << "Druh: " << rostlina.vypisDruh() << endl;
cout << "Barva kvetu: " << rostlina.vypisBarvuKvetu() << endl;
cout << "Vyska: " << rostlina.vypisVysku() << endl;
cout << "Cena: " << rostlina.vypisCenu() <<endl;
}
void pridatRostlinu(Zahon zahon){
cout << "Zadejte druh rostliny: " << endl;
string vstup_druh;
cin >> vstup_druh;
cout << "Zadejte barvu kvetu: " << endl;
string vstup_barva;
cin >> vstup_barva;
cout << "Zadejte vysku rostliny: " << endl;
int vstup_vyska;
cin >> vstup_vyska;
stringstream ss;
ss << vstup_druh << " " << vstup_barva << " " << vstup_vyska << endl;
string str;
str = ss.str();
Rostlina novaRostlina(str);
zahon.rostliny.push_back(novaRostlina);
int i = 1;
for(Rostlina rostlina : zahon.rostliny){
cout << i << ". ";
vypis(rostlina);
i++;
}
}
void vypisCenaDruhu(Rostlina rostlina){
cout << "Cena druhu je: " << rostlina.vypisCenuDruhu() << endl;
}
void odebratRostlinu(Zahon zahon, int prvek){
int i = 1;
zahon.rostliny.erase(zahon.rostliny.begin()+prvek-1);
for(Rostlina rostlina : zahon.rostliny){
cout << i << ". ";
vypis(rostlina);
i++;
}
}
void cenaVsechRostlin(Zahon zahon){
int cena = 0;
for(Rostlina rostlina : zahon.rostliny){
cena = cena + rostlina.vypisCenu();
}
cout << "Cena vsech rostlin je: " << cena << endl;
}
void cenaVsechDruhu(Zahon zahon){
int cenaDruhu;
for(Rostlina rostlina : zahon.rostliny){
cenaDruhu = cenaDruhu + rostlina.vypisCenuDruhu();
}
cout << "Cena vsech druhu rostlinje: " << cenaDruhu << endl;
}
Rostlina.cpp
#include "Rostlina.h"
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
Rostlina::Rostlina(string infoRostlina){
stringstream rostlinaStream(infoRostlina);
rostlinaStream >> druh;
rostlinaStream >> barvaKvetu;
rostlinaStream >> vyska;
}
string Rostlina::vypisDruh(){
return druh;
}
string Rostlina::vypisBarvuKvetu(){
return barvaKvetu;
}
int Rostlina::vypisVysku(){
return vyska;
}
int Rostlina::vypisCenu(){
int cena = 0;
if(druh == "ruze"){
cena = cena + 30;
} else if (druh == "cimisnik"){
cena = cena + 25;
} else if (druh == "denivka"){
cena = cena + 20;
} else if (druh == "levandule"){
cena = cena + 15;
} else if (druh == "tulipan"){
cena = cena + 10;
} else { cout << "Tuto rostlinu bohuzel nemame." << endl;
}
if(barvaKvetu == "cervena"){
cena = cena + 15;
} else if (barvaKvetu == "fialova"){
cena = cena + 14;
} else if (barvaKvetu == "bila"){
cena = cena + 13;
} else if (barvaKvetu == "ruzova"){
cena = cena + 12;
} else if (barvaKvetu == "zelena"){
cena = cena + 11;
} else { cout << "Rostliny o takove barve kvetu bohuzel nemame." << endl;
if (vyska > 0 && vyska < 15){
cena = cena + 5;
} else if (vyska > 15 && vyska < 30){
cena = cena + 10;
} else if (vyska > 30 && vyska < 60 ){
cena = cena + 40;
} else { cout << "Zadana vyska je neplatna. Pouzijte prosim vysku od 0 do 60 cm" << endl;
}
return cena;
}
}
int Rostlina::vypisCenuDruhu(){
int cena = 0;
if(druh == "ruze"){
cena = cena + 30;
} else if (druh == "cimisnik"){
cena = cena + 25;
} else if (druh == "denivka"){
cena = cena + 20;
} else if (druh == "levandule"){
cena = cena + 15;
} else if (druh == "tulipan"){
cena = cena + 10;
} else { cout << "Tuto rostlinu bohuzel nemame." << endl;
}
return cena;
}
Rostlina.h
#ifndef __Rostlina_h_
#define __Rostlina_h_
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Rostlina
{
private:
string druh;
string barvaKvetu;
int vyska;
public:
Rostlina(string infoRostlina);
string vypisDruh();
string vypisBarvuKvetu();
int vypisVysku();
int vypisCenu();
int vypisCenuDruhu();
};
#endif // __Rostlina_h_
Zahon.cpp
#include "Zahon.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
Zahon::Zahon(string fin){
ifstream rostlinaSoubor(fin.c_str());
string radek;
while(!rostlinaSoubor.eof()){
getline(rostlinaSoubor, radek);
Rostlina rostlina(radek);
rostliny.push_back(rostlina);
}
rostlinaSoubor.close();
}
Zahon.h
#ifndef __Zahon_h_
#define __Zahon_h_
#include "Rostlina.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Zahon
{
public:
Zahon(string fin);
vypisRostliny();
vector<Rostlina> rostliny;
};
#endif // __Zahon_h_
Zdravím, obracím se na Vás s prosbou o vysvětlení níže přiložené části kódu. Jedná se o testování podmínky pro sedlový bod matice, ale bohužel se v tom ztrácím. Byl by někdo ochotný mi vysvětlit, co se v jednotlivých for cyklech děje ?
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
max=min=matice[i][j];
for(int k=0;k<x;k++)
{
if(max<matice[k][j])
{
min=matice[k][j];
}
}
for(int l=0;l<y;l++)
{
if(min>matice[i][l])
{
max=matice[i][l];
}
}
if(max==min)
{
System.out.println (+max+" na pozici ("+(i+1)+" , "+(j+1)+")");
}
#3 Josef Hrdina
Zde je výsledný program.
import sugar.Sys;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class VycetkaPlatidel {
static int plat;
public static ArrayList<Integer> pole = new ArrayList<Integer>();
static int pocetBankovek(int hodnotaBankovky) {
int pocet;
pocet = plat / hodnotaBankovky;
plat = plat % hodnotaBankovky;
return pocet;
}
public void nacteni(){
}
public static void main(String[] args) throws IOException {
try {
FileInputStream fis = new FileInputStream("vstup.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String strLine;
while ((strLine = br.readLine()) != null) {
String[] s = strLine.split("\t");
for (int i = 0; i < s.length; i++) {
pole.add(Integer.parseInt(s[i]));
}
}
}
catch(Exception e) {
System.out.println("Nastala chyba:");
System.out.println(e);
}
int platX;
int[] vysledek = new int[12];
Sys.pln("Zadejte částku: ");
plat = Sys.readInt();
platX = plat;
for (int i = 0; i < pole.size(); i++) {
vysledek[i] = pocetBankovek(pole.get(i));
}
BufferedWriter bw = new BufferedWriter(new FileWriter("vystup.txt"));
bw.write("Vyčtení částky " + platX + " je následující : " + vysledek[0] + "x5000" + " , " + vysledek[1] + "x2000" + " , " + vysledek[2] + "x1000");
bw.newLine();
bw.write(vysledek[3] + "x500" + " , " + vysledek[4] + "x200" + " , " + vysledek[5] + "x100");
bw.newLine();
bw.write(vysledek[6] + "x50" + " , " + vysledek[7] + "x20" + " , " + vysledek[8] + "x10");
bw.newLine();
bw.write(vysledek[9] + "x5" + " , " + vysledek[10] + "x2" + " , " + vysledek[11] + "x1");
bw.newLine();
bw.flush();
}
}
Dobrý den ,programuji výčetku platidel ,ale když ji spustím tak píše : ArrayIndexOutOfBoundsException: 11
s Arrayem nemam skoro žádné vzkušenosti.
Žádám o pomoc a předem děkuji. Zde přikládám zdroják:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class VycetkaPlatidel {
static int plat;
static int pocetBankovek(int hodnotaBankovky) {
int pocet;
pocet = plat / hodnotaBankovky;
plat = plat % hodnotaBankovky;
return pocet;
}
public static void main(String[] args) throws IOException {
List<Integer> list = new ArrayList<Integer>();
int platX;
Sys.pln("Zadejte částku: ");
plat = Sys.readInt();
platX = plat;
int[] pole = new int[11];
BufferedReader br = new BufferedReader(new FileReader("vstup.txt"));
String s = "";
while ((s = br.readLine()) != null) {
for (int i = 0; i < 12; i++) {
list.add(Integer.parseInt(s));
}
}
br.close();
for (int i = 0; i < list.size(); i++) {
pole[i] = pocetBankovek(list.get(i));
}
BufferedWriter bw = new BufferedWriter(new FileWriter("vystup.txt"));
bw.write("Vyčtení částky " + platX + " je následující : " + pole[0] + "x5000" + " , " + pole[1] + "x2000" + " , " + pole[2] + "x1000");
bw.newLine();
bw.write(pole[3] + "x500" + " , " + pole[4] + "x200" + " , " + pole[5] + "x100");
bw.newLine();
bw.write(pole[6] + "x50" + " , " + pole[7] + "x20" + " , " + pole[8] + "x10");
bw.newLine();
bw.write(pole[9] + "x5" + " , " + pole[10] + "x2" + " , " + pole[11] + "x1");
bw.newLine();
bw.flush();
}
}
Díky za odpověď, omlouvám se za příliš stručný popis, tvá metoda pracuje s čísly přímo v programu. Já bych potřeboval ty čísla načíst z textového souboru, ve kterém mám uloženou nějakou matici, dejme tomu 3x3, a jednotlivé číslice jsou odděleny mezerou. V programu si chci vyvolat číslici, která je v tom textovém souboru uložená např. ve druhém řádku a třetím sloupci a dále s ní pracovat. Pročetl jsem již řadu fór a ukázkových kódů, ale na řešení jsem zatím nepřišel.