Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Här diskuteras programmering och utveckling
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

micke_nordin skrev:
Lulle skrev: Edit:
Den ger inte korrekt antal skopor, det står 6 skopor hela tiden.
Får inte riktigt till detta.
Någon som ser felet?
He he, jag kollade inte så noga på vad du skrivit, det skall vara:

Kod: Markera allt

 if(temp == '1') //Om det önskas starkt kaffe
      {
         skopor += 6; //Dubbla  antalet skopor
      }
inte:

Kod: Markera allt

 if(temp == '1') //Om det önskas starkt kaffe
      {
         skopor = + 6; //Dubbla  antalet skopor
      }
/Micke

nu fungerade det bättre, jag fixade det genom att köra en else sats.


Det är så att jag håller på med ett till program här nu som man ska knacka ihop enligt kursen.
Dock så får jag inte detta att fungera:

Kod: Markera allt

summa = liter / mil; // Fungerar inte ännu.
Hur gör man för att dela liter med mil?
Tydligen fungerar inte "liter / mil" iaf.


Detta är ett mattematiskt program dvs det räknar ut saker.
Är det då korrekt att köra på denna som jag gör:

Kod: Markera allt

	unsigned long mil, liter, summa;                                              // Valt "unsigned long" här därför att jag inte vet hur stort resultat talet blir.
Istället för att köra på originalet:

Kod: Markera allt

int mil, liter, summa;
Edit:
Visst är mil , liter och summa variabel eller är det int som är variabeln?


Tack för alla svar :)
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av dmz »

Lulle skrev:
micke_nordin skrev:
Lulle skrev: Edit:
Den ger inte korrekt antal skopor, det står 6 skopor hela tiden.
Får inte riktigt till detta.
Någon som ser felet?
He he, jag kollade inte så noga på vad du skrivit, det skall vara:

Kod: Markera allt

 if(temp == '1') //Om det önskas starkt kaffe
      {
         skopor += 6; //Dubbla  antalet skopor
      }
inte:

Kod: Markera allt

 if(temp == '1') //Om det önskas starkt kaffe
      {
         skopor = + 6; //Dubbla  antalet skopor
      }
/Micke

nu fungerade det bättre, jag fixade det genom att köra en else sats.


Det är så att jag håller på med ett till program här nu som man ska knacka ihop enligt kursen.
Dock så får jag inte detta att fungera:

Kod: Markera allt

summa = liter / mil; // Fungerar inte ännu.
Hur gör man för att dela liter med mil?
Tydligen fungerar inte "liter / mil" iaf.


Detta är ett mattematiskt program dvs det räknar ut saker.
Är det då korrekt att köra på denna som jag gör:

Kod: Markera allt

	unsigned long mil, liter, summa;                                              // Valt "unsigned long" här därför att jag inte vet hur stort resultat talet blir.
Istället för att köra på originalet:

Kod: Markera allt

int mil, liter, summa;
Edit:
Visst är mil , liter och summa variabel eller är det int som är variabeln?


Tack för alla svar :)
Nu var det väldigt länge sedan jag kodade c++, men unsigned long int kanske var vad du tänkte på? Ser inte varför du ska använda det dock.

Kod: Markera allt

#include <iostream>
int main() 
{
int mil, liter;
double summa = mil / liter;
std::cin >> mil;
std::cin >> liter;
std::cout << summa;

std::cin.get();
std::cin.ignore();

return 0;

}
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

dmz skrev:
Nu var det väldigt länge sedan jag kodade c++, men unsigned long int kanske var vad du tänkte på? Ser inte varför du ska använda det dock.

Kod: Markera allt

#include <iostream>
int main() 
{
int mil, liter;
double summa = mil / liter;
std::cin >> mil;
std::cin >> liter;
std::cout << summa;

std::cin.get();
std::cin.ignore();

return 0;

}
Hej!
unsigned long är det korrekta det ska inte stå int där.
Jag tänkte använda den pågrund av att int inte kan hantera lika stora tal som unsigned long kan.

Te.x skriver du:
1000000 * 100000 med int så får du ett svar med -230472034587
Om du därimot skriver samma med unsigned long så får du det korrekta svaret.


duoble fungerade inte heller :(


men tack för hjälpen :)
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av micke_nordin »

dmz skrev:

Kod: Markera allt

#include <iostream>
int main() 
{
int mil, liter;
double summa = mil / liter;
std::cin >> mil;
std::cin >> liter;
std::cout << summa;

std::cin.get();
std::cin.ignore();

return 0;

}
Det här programmet blir nog kul att köra, först deklareras två variabler som inte initieras, sedan delas dessa variabler med varandra (de kan alltså peka på vad som helst) och resultatet läses in i en tredje variabel. Sist men inte mins fylls de två första variablerna med värden (om man har sån tur att användaren skriver in giltiga värden kanske de fylls med nått vettigt) och sedan skrivs värdet på den tredje variabeln ut (resultatet av den odefinierade divisionen). Men eftersom det mesta i minnet ändå är nollor så brukar resultatet av sådan matematik ändå bli noll. :D

/Micke
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

micke_nordin skrev:
dmz skrev:

Kod: Markera allt

#include <iostream>
int main() 
{
int mil, liter;
double summa = mil / liter;
std::cin >> mil;
std::cin >> liter;
std::cout << summa;

std::cin.get();
std::cin.ignore();

return 0;

}
Det här programmet blir nog kul att köra, först deklareras två variabler som inte initieras, sedan delas dessa variabler med varandra (de kan alltså peka på vad som helst) och resultatet läses in i en tredje variabel. Sist men inte mins fylls de två första variablerna med värden (om man har sån tur att användaren skriver in giltiga värden kanske de fylls med nått vettigt) och sedan skrivs värdet på den tredje variabeln ut (resultatet av den odefinierade divisionen). Men eftersom det mesta i minnet ändå är nollor så brukar resultatet av sådan matematik ändå bli noll. :D

/Micke

Jag såg att hans inte var så korrekt.
Men min fråga kvarstår hur gör jag så att mitt program dividerar mil med liter och visar resultatet i summa?

Just nu har jag det så här:

Kod: Markera allt

  unsigned long mil, liter, summa;
....
cin >> mil;
cin >> liter;
....
   summa = liter / mil;
....
   cout <<                mil <<      liter <<       summa;
Edit:
Tack på förhand.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av micke_nordin »

Lulle skrev: Men min fråga kvarstår hur gör jag så att mitt program dividerar mil med liter och visar resultatet i summa?
Nu dividerar du liter med mil: summa = liter / mil;
Vill du dividera mil med liter får du göra: summa = mil / liter;
Även unsigned long är en typ av integer (heltal), om problemet är att du får noll genom att t.ex. dividera 10 med 45 så blir lösningen att använda något typ av flyttal, t.ex. float eller double. Den flyttalstyp som kan hålla störst tal är väl long double tror jag. Typ:

Kod: Markera allt

#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    long double mil, liter, summa;
    cin >> mil;
    cin >> liter;
    summa = mil / liter;
    cout << mil << endl << liter << endl << summa;
    return 0;
}
/Micke
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av dmz »

micke_nordin skrev:
dmz skrev:

Kod: Markera allt

#include <iostream>
int main() 
{
int mil, liter;
double summa = mil / liter;
std::cin >> mil;
std::cin >> liter;
std::cout << summa;

std::cin.get();
std::cin.ignore();

return 0;

}
Det här programmet blir nog kul att köra, först deklareras två variabler som inte initieras, sedan delas dessa variabler med varandra (de kan alltså peka på vad som helst) och resultatet läses in i en tredje variabel. Sist men inte mins fylls de två första variablerna med värden (om man har sån tur att användaren skriver in giltiga värden kanske de fylls med nått vettigt) och sedan skrivs värdet på den tredje variabeln ut (resultatet av den odefinierade divisionen). Men eftersom det mesta i minnet ändå är nollor så brukar resultatet av sådan matematik ändå bli noll. :D

/Micke
Ooops. Ska nog hålla mig borta från C++-forat i fortsättningen. :)
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av micke_nordin »

dmz skrev: Ooops. Ska nog hålla mig borta från C++-forat i fortsättningen. :)
Inte då, det hade blivit jättebra om du bara flyttat upp inläsningen av variablerna:

Kod: Markera allt

    
#include <iostream>
int main()
{
    int mil, liter;
    std::cin >> mil;
    std::cin >> liter;
    double summa = mil / liter;
    std::cout << summa;

    std::cin.get();
    std::cin.ignore();

    return 0;

}
/Micke
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

Hej igen alla glada.
Nu har jag kommit en bit på vägen med mitt lilla slutprovs program i kursen.
Att tänka på är att min kurs inte har startat utom jag började med denna kurs själv pågrund av att jag ville lära mig nu och inte sen.
Jag har nästan plöjt igenom 2veckors kurs på 3dagar.
Jag har dock lite kvar att läsa i C++ boken + några föreläsningar kvar att lyssna på.
Så detta program kommer att byggas på eftersom jag lär mig mera från boken och genom att lyssna på kurserna.
Men jag bör vara klar med allt tills på fredag tycker jag.

Jag har lite problem med programmet.
Det är så att jag vill att programmet ändrar innehållet i string bilar beronde på vad veriabeln val får för innmatning av användaren.
Men det verkar som att programmet inte vill skriva ut stringen bilar.
Jag har bara noterat förklaringar där jag använder dessa funktioner.

Kod: Markera allt

/*
 *      bilprogrammet.cpp
 *      
 *      Copyright 2008 Robin Sandberg <robin@PHILIPS>
 *      
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *      
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */


#include <iostream>                                                                   
#include <string> // hämtar information från string bibloteket.

int main(int argc, char** argv)                                                  

{
  using namespace std;                                                    
  long double mil, liter, summa;                                          
  int val;  // Registrerar det inmatade valet.
  string bilar;  // Stringen bilar som ska ändras beronde på vad veriabeln val får för inmatning från användaren.
   cout << "*********************************\n";                                   
   cout << "* Bensinförbruknings-kalkylator *\n";
   cout << "*********************************\n\n - Bekräfta alla inmatningar med Enter -\n\n";
   cout << "Inmatning - Antal körda mil?: →_\b ";
   cin >> mil;                                                                   
   cout << "\n\nInmatning - Antal tankade liter?: →_\b ";
   cin >> liter;                                                              
   cout << "\n\nVal av bil:\n\n1. Volvo\n2. Opel\n3. Saab\n\nVälj bil genom att ange siffran 1-3: →_\b ";
   cin >> val;   // registrera det inmatade valet av användaren.
   
  if (val == '1')  // Om det inmatade valet är "1" så händer följande.
{
	
   bilar = "Volvo";  // skickar information till stringen bilar att den ska innehålla "Volvo".
	   
} 
  else  // Om inte det inmatade valet är "2" så händer detta.

  if (val == '2')
{

   string bilar = "Opel";
	
}
  else

  if (val == '3')
{

   string bilar = "Saab";	
	
}

	

   cout << "\n\n\nBIL          MIL          LITER          BENSINFÖRBRUKNING (1/mil)\n";
   cout << "--------     --------     --------       ---------------------------\n";
   summa = liter / mil;
   cout <<  bilar <<     mil <<      liter <<       summa; // som ni ser så ska bilar stringen skriva ut information här men det gör den inte, jag får ingen
   //utskrift över huvudtaget, och en fråga till hur gör man mellanslag? Tänkte så att utskrifterna hamnar under mina menyer.



   cout << "\n\n\n***********************************\n";
   cout << "Skapat av Robin Sandberg.\nDetta program går under GNU/GPL lincens.";

  return 0;
}
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

Kom på vad felet låg, det ska stå if (val == 1) och inte if (val == '1') dock har jag problemet att just nu så skriver den bara ut volvo, dvs inmatning 1 fungerar bara.
Om jag väljer någon av dom andra så skriver den inte ut något.
Så här ser mina if satser ut:

Kod: Markera allt

  if (val == 1)  // Om det inmatade valet är "1" i variabeln "val" så händer följande.
{
	
   bilar = "Volvo";  // skickar information till "stringen bilar" att den ska innehålla "Volvo".
	   
} 
  else  // Om inte det inmatade valet är "1" så händer detta.

  if (val == 2)
{

   string bilar = "Opel";
	
}
  else

  if (val == 3)
{

   string bilar = "Saab";	
	
}

Edit:
Kom på lösningen på hur man får alla val att skrivas ut.
Jag hade skrivit:

Kod: Markera allt

if (val == 1)
Detta är inte korrekt
det korrekta är:

Kod: Markera allt

if (val==1)
Såg även att jag kunde ta bort

Kod: Markera allt

else
ur if satserna.



Och tack vare detta så såg jag att jag lär läsa på om if satser igen då detta strulade för mig.
Senast redigerad av 1 Lulle, redigerad totalt 24 gånger.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Osprey »

I If-satsen för Volvo har du "bilar = ", men för de andra har du "string bilar = ", det sker kanske någon nydeklaration där? Hmmm... jag är nog bättre på ren C-kod... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

Osprey skrev:I If-satsen för Volvo har du "bilar = ", men för de andra har du "string bilar = ", det sker kanske någon nydeklaration där? Hmmm... jag är nog bättre på ren C-kod... :)

Okej, detta hade jag inte sett men det utgjorde inte problemet.
Men källkoden ser skit ut med det i, så detta ska jag ändra direkt.
Tack för att du påpekade detta.

Läs ovan för lösningen på mitt problem om du är intresserad av att se den dvs :)


Tack igen, denna tråd är underbar.
Man stöter på småproblem så fattar man inte vad som är felet, och man letar och letar så är det något så ser ni det.
Sedan efter ni har påpekat det så läser man på om satsen / problemet / variabeln eller vad det nu kan vara så kan man det.
Ett kunligt sätt att studera på :)
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

Jaha, då har man kört fast igen då.
Ganska rejält också.
Har kollat och läst men kan inte förstå hur man ska göra.

Så här ser koden ut idagsläget:

Kod: Markera allt

/*
 *      bilprogrammet.cpp
 *      
 *      Copyright 2008 Robin Sandberg <robin@PHILIPS>
 *      
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *      
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */


#include <iostream>                        // Hämtar information från Iostream bibloteket, iostream är en head fil.
#include <string>                         // hämtar information från string bibloteket.

int main(int argc, char** argv)          // Skickar & tar imot information ifrån operativsystemet.

{
  using namespace std;                  // Använder en "namespace" som underlättar programmeringen av koden.
  long double mil, liter, summa;        // Valt "long" här därför att jag inte vet hur stort resultat talet blir. "doble" gör talen flytande.
  int val;
  string bilar;
   cout << "*********************************\n";                                   //Skriver ut en text till bildskärmen.
   cout << "* Bensinförbruknings-kalkylator *\n";
   cout << "*********************************\n\n - Bekräfta alla inmatningar med Enter -\n\n";
   cout << "Inmatning - Antal körda mil?: →_\b ";
   cin >> mil;                                                                   // Skriver in det inmatade värdet och lägger det i variabeln "mil".
   cout << "\n\nInmatning - Antal tankade liter?: →_\b ";
   cin >> liter;                                                              // Skriver in det inmatade värdet och lägger det i variabeln "liter".
   cout << "\n\nVal av bil:\n\n1. Volvo\n2. Opel\n3. Saab\n\nVälj bil genom att ange siffran 1-3: →_\b ";
   cin >> val;           // Skriver in det inmatade valet till variabeln "val".
   
   
  if (val==1)  // Om det inmatade valet är "1" så händer följande.
{
	
   bilar = "Volvo";  // skickar information till stringen bilar att den ska innehålla "Volvo".
	   
} 

  if (val==2)
{

   bilar = "Opel";
	
}

  if (val==3)
{

   bilar = "Saab";	
	
}


   cout << "\n\n\nBIL          MIL          LITER          BENSINFÖRBRUKNING (1/mil)\n";
   cout << "--------     --------     --------       ---------------------------\n";
   summa = liter / mil; // Räknar ut liter dividerat med mil.
   cout <<  bilar << "        " << mil << "           " << liter << "             " << summa; // här skriver dom olika variabelna och stringarna ut till bildskärmen.

// här ska meddelandena hamna //


   cout << "\n\n\n***********************************\n";
   cout << "Skapat av Robin Sandberg.\nDetta program går under GNU/GPL lincens.";

  return 0;  // Skickar information till "int main()" att programmet har slutförts, detta resulterar i att int main rapporterar detta till OS:et som stänger programmet.
}

Men nu är det så att en eventuell sats ska känna av vilken variabel som blev inmatad dvs; volvo , saab eller opel.
och det finns vissa regler om hur stor summan får blir i programmet.
Dessa regler är:
Volvo : 1,0*
Opel: 0,9*
Saab: 0,8*
(0,8* menas med att det är ok om värdet blir 0,8435345 bara inte värdet överstiger 0,9)

Och om summan överstrider för den valda variabeln så ska det visas ett fel meddelande under menyerna ( se koden ).
Det ska stå: Serva bilen

Och om summan ligger under eller lika som den valda variabeln så ska det komma upp detta meddelande istället:
Det ska stå: Bensinförbrukning OK



Min spontana tanke på koden är att det ska stå följande men det kommer inte fungera riktigt tror jag:

Kod: Markera allt

  if (bilar==volvo)
{

// Någon kod som kollar upp regeln för volvo.
   cout << "Serva bilen";

}
  else
   cout << "Bensinförbrukning OK";
Sedan så upprepas koden för te.x Opel och Saab.
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

hmm , jag försöker att få mitt program att starta om på kommando, men det fungerar inte så bra.
Har testat och testat men fungerar inte.

Kod: Markera allt

#include <iostream>

using namespace std;
int main()

{		
  int fran;
  int gora;
  bool retur = true;
  long double euro;
  long double har;
  long double summa;
  euro = 10.96;
  long double dollar;
  dollar = 7.84;
  long double pund;
  pund = 11.64;

while (retur == false)
cout << "\n******************INFORMATION******************\n";
cout << "*  Detta program ar skapat av Robin Sandberg. *\n*  Detta program gar under GNU/GPL lincens.   *";
cout << "\n***********************************************\n\n";


cout << "\nFran vilken valuta?\n1. Euro\n2. Dollar\n3. Pund\n?_\b ";
cin >> fran;
cin.get();	

if (fran==1)
{
	
cout << "\nHur manga euro har du?: \n?_\b ";
cin >> har;
cin.get();
summa = har * euro;
cout << "\nDet ar " << summa << " i svenska kronor.\n\n";
  	
}

if (fran==2)
{
	
cout << "\nHur manga dollar har du?: \n?_\b ";
cin >> har;
cin.get();
summa = har * dollar;
cout << "\nDet ar " << summa << " i svenska kronor.\n\n";

}

if (fran==3)
{
	
cout << "\nHur manga pund har du?: \n?_\b ";
cin >> har;
cin.get();
summa = har * pund;
cout << "\nDet ar " << summa << " i svenska kronor.";

}

cout << "\n\nVad vil du gora?\n1. Starta om programmet\n2. Avsluta programmet.\n?_\b";
cin >> gora; 
cin.get();

if (gora==1)
{

retur = false;
	
}


  cin.get();	   
  return 0;
}
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av micke_nordin »

Inga måsvingar inkapslar din while-loop

Kod: Markera allt

while(nått är sant)
{
    gör saker här;
    gör så att nått blir falskt;
}
/Micke
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

micke_nordin skrev:Inga måsvingar inkapslar din while-loop

Kod: Markera allt

while(nått är sant)
{
    gör saker här;
    gör så att nått blir falskt;
}
/Micke

Tackar Micke, det hade jag missat.
Litet slarvfel som var enkelt att missa.

Har du någon lösning på mitt program över detta?
Det med bilar och bensin.
Kan inte komma på hur fan man ska lösa det där med regeln.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Osprey »

Lulle skrev: Jag hade skrivit:

Kod: Markera allt

if (val == 1)
Detta är inte korrekt
det korrekta är:

Kod: Markera allt

if (val==1)
Det spelar ingen som helst roll hur många mellanslag eller tabbar du har i ett sådant här läge, "if (val == 1)" är lika rätt som "if (val==1)" som är lika rätt som "if( val == 1 )" etc...
Lulle skrev:Har du någon lösning på mitt program över detta?
Det med bilar och bensin.
Kan inte komma på hur fan man ska lösa det där med regeln.
Vad är det du inte kan lösa nu? ursäkta om jag inte orkar sitt och läsa om allt... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

Ursäkta att jag inte har svarat dig tidigare men jag åkte på en rejäl förkylning så jag har varit sängliggandes i några nätter och på dagarna kallar barnet och frugan hehe.
Men jag postar om inlägget:


Jaha, då har man kört fast igen då.
Ganska rejält också.
Har kollat och läst men kan inte förstå hur man ska göra.

Så här ser koden ut idagsläget:

Kod: Markera allt

/*
*      bilprogrammet.cpp
*     
*      Copyright 2008 Robin Sandberg <robin@PHILIPS>
*     
*      This program is free software; you can redistribute it and/or modify
*      it under the terms of the GNU General Public License as published by
*      the Free Software Foundation; either version 2 of the License, or
*      (at your option) any later version.
*     
*      This program is distributed in the hope that it will be useful,
*      but WITHOUT ANY WARRANTY; without even the implied warranty of
*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*      GNU General Public License for more details.
*     
*      You should have received a copy of the GNU General Public License
*      along with this program; if not, write to the Free Software
*      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
*      MA 02110-1301, USA.
*/


#include <iostream>                        // Hämtar information från Iostream bibloteket, iostream är en head fil.
#include <string>                         // hämtar information från string bibloteket.

int main(int argc, char** argv)          // Skickar & tar imot information ifrån operativsystemet.

{
  using namespace std;                  // Använder en "namespace" som underlättar programmeringen av koden.
  long double mil, liter, summa;        // Valt "long" här därför att jag inte vet hur stort resultat talet blir. "doble" gör talen flytande.
  int val;
  string bilar;
   cout << "*********************************\n";                                   //Skriver ut en text till bildskärmen.
   cout << "* Bensinförbruknings-kalkylator *\n";
   cout << "*********************************\n\n - Bekräfta alla inmatningar med Enter -\n\n";
   cout << "Inmatning - Antal körda mil?: →_\b ";
   cin >> mil;                                                                   // Skriver in det inmatade värdet och lägger det i variabeln "mil".
   cout << "\n\nInmatning - Antal tankade liter?: →_\b ";
   cin >> liter;                                                              // Skriver in det inmatade värdet och lägger det i variabeln "liter".
   cout << "\n\nVal av bil:\n\n1. Volvo\n2. Opel\n3. Saab\n\nVälj bil genom att ange siffran 1-3: →_\b ";
   cin >> val;           // Skriver in det inmatade valet till variabeln "val".
   
   
  if (val==1)  // Om det inmatade valet är "1" så händer följande.
{
   
   bilar = "Volvo";  // skickar information till stringen bilar att den ska innehålla "Volvo".
      
}

  if (val==2)
{

   bilar = "Opel";
   
}

  if (val==3)
{

   bilar = "Saab";   
   
}


   cout << "\n\n\nBIL          MIL          LITER          BENSINFÖRBRUKNING (1/mil)\n";
   cout << "--------     --------     --------       ---------------------------\n";
   summa = liter / mil; // Räknar ut liter dividerat med mil.
   cout <<  bilar << "        " << mil << "           " << liter << "             " << summa; // här skriver dom olika variabelna och stringarna ut till bildskärmen.

// här ska meddelandena hamna //


   cout << "\n\n\n***********************************\n";
   cout << "Skapat av Robin Sandberg.\nDetta program går under GNU/GPL lincens.";

  return 0;  // Skickar information till "int main()" att programmet har slutförts, detta resulterar i att int main rapporterar detta till OS:et som stänger programmet.
}
Men nu är det så att en eventuell sats ska känna av vilken variabel som blev inmatad dvs; volvo , saab eller opel.
och det finns vissa regler om hur stor summan får blir i programmet.
Dessa regler är:
Volvo : 1,0*
Opel: 0,9*
Saab: 0,8*
(0,8* menas med att det är ok om värdet blir 0,8435345 bara inte värdet överstiger 0,9)

Och om summan överstrider för den valda variabeln så ska det visas ett fel meddelande under menyerna ( se koden ).
Det ska stå:
Serva bilen

Och om summan ligger under eller lika som den valda variabeln så ska det komma upp detta meddelande istället:
Det ska stå:
Bensinförbrukning OK



Min spontana tanke på koden är att det ska stå följande men det kommer inte fungera riktigt tror jag:

Kod: Markera allt

  if (bilar==volvo)
{

// Någon kod som kollar upp regeln för volvo.
   cout << "Serva bilen";

}
  else
   cout << "Bensinförbrukning OK";
Sedan upprepas det för opel osv.
Lulle
Inlägg: 401
Blev medlem: 08 dec 2007, 23:46
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Gävle

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Lulle »

YES YES YES !!! Jag löste det !
Va iofs relativt simpelt, jag hade == i IF satsen vilket är "Lika Med".
Jag ändrade det till <= vilket är "Är Mindre än eller lika med" detta resulterade i att jag kunde få ut rätt meddelande angående bensinförbrukningen :)

Självklart så postar jag källkoden här nu och vill ha era åsikter om den, även era åsikter om mina förklaringar som jag har lagt in i den om ni tycker dom är bra osv.

Kod: Markera allt

/*
 *      bilprogrammet.cpp
 *      
 *      Copyright 2008 Robin Sandberg <robin@PHILIPS>
 *      
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *      
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */


#include <iostream>                        // Hämtar information från Iostream bibloteket, iostream är en head fil.
#include <string>                         // hämtar information från string bibloteket.

int main(int argc, char** argv)          // Skickar & tar imot information ifrån operativsystemet.

{
  using namespace std;                  // Använder en "namespace" som underlättar programmeringen av koden.
  long double mil, liter, summa;        // Valt "long" här därför att jag inte vet hur stort resultat talet blir. "double" gör talen flytande.
  int val;                              // EN variabel som spar inmatad information.
  int av;
  bool restart = false;
  string bilar;                          // En string som ändrar värde beronde på variabeln "val"'s inmatningar, den skriver även ut till bildskärmen sedan.
  
  
  while(restart == false)
{
   cout << "*********************************************\n";                                   //Skriver ut en text till bildskärmen.
   cout << "*  Bensinförbruknings-kalkylator            *\n";
   cout << "*  -----------------------------            *\n";
   cout << "*                                           *\n";
   cout << "*  Skapat av Robin Sandberg                 *\n";
   cout << "*  Detta program går under GNU/GLP lincen.  *\n";
   cout << "*********************************************\n\n - Bekräfta alla inmatningar med Enter -\n\n";
   cout << "Inmatning - Antal körda mil?: →_\b ";
   cin >> mil;                                                                   // Skriver in det inmatade värdet och lägger det i variabeln "mil".
   cout << "\n\nInmatning - Antal tankade liter?: →_\b ";
   cin >> liter;                                                              // Skriver in det inmatade värdet och lägger det i variabeln "liter".
   cout << "\n\nVal av bil:\n\n1. Volvo\n2. Opel\n3. Saab\n\nVälj bil genom att ange siffran 1-3: →_\b ";
   cin >> val;           // Skriver in det inmatade valet till variabeln "val".
   
   
  if (val==1)  // Om det inmatade valet är "1" så händer följande.
{
	
   bilar = "Volvo";  // skickar information till stringen bilar att den ska innehålla "Volvo".
	   
} 

  if (val==2)
{

   bilar = "Opel";
	
}

  if (val==3)
{

   bilar = "Saab";	
	
}


   cout << "\n\n\nBIL          MIL          LITER          BENSINFÖRBRUKNING (1/mil)\n";
   cout << "--------     --------     --------       ---------------------------\n";
   summa = liter / mil; // Räknar ut liter dividerat med mil.
   cout <<  bilar << "        " << mil << "           " << liter << "             " << summa; // här skriver dom olika variabelna och stringarna ut till bildskärmen.

  if (val==1) // Läser av variabeln "val" och om den är 1 så händer detta.
{
  if (summa<=1.0)   // om summa är lika med eller mindre så händer detta
{	
	
   cout << "\n\n** Normal Bensinförbrukning **";

}
  else // om inte summan är lika med eller mindre så händer detta
   cout << "\n\n\a** Dags att serva bilen, den har för hög bensinförbrukning! **";	
}

  if (val==2)
{
  if (summa<=0.9)
{
		
   cout << "\n\n** Normal Bensinförbrukning **";

}
  else
   cout << "\n\n\a** Dags att serva bilen, den har för hög bensinförbrukning! **";
}	

  if (val==3)
{
  if (summa<=0.8)
{

   cout << "\n\n** Normal Bensinförbrukning **";

}
  else
   cout << "\n\n\a** Dags att serva bilen, den har för hög bensinförbrukning! **";
}		

   cout << "\n\nVad vill du göra?\n1. Starta om programmet?\n2. Avsluta programmet?\n→_\b ";
   cin >> av;

  if (av==1) // Om variabeln "av" är inmatad med "1" så startar programmet om med hjälp av en loop.
{
   cout << "\n\n";
   restart = false;	// Så länge "restart" variabeln är inmatad med "false" så startas programmet om.

}	
else // Om variabeln "av" är inmatad med "2" eller något annat så avslutas programmet.
restart = true; // Så länge "restart" variabeln är inmatad med "true" så startar inte programmet om.
}

  

  return 0;  // Skickar information till "int main()" att programmet har slutförts, detta resulterar i att int main rapporterar detta till OS:et som stänger programmet.
}

Inhuman Soul
Inlägg: 339
Blev medlem: 25 mar 2008, 21:01
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Linköping

Re: Tänker jag rätt? Har jag gjort rätt? C++, rätt mig.

Inlägg av Inhuman Soul »

Med reglerna:
Volvo : 1,0*
Opel: 0,9*
Saab: 0,8*
(0,8* menas med att det är ok om värdet blir 0,8435345 bara inte värdet överstiger 0,9)
så är det väl mer korrekt att säga att det ska vara mindre än det nummer som är över (alltså "if (summa < 0.9)" när det gälller saab).

När du ska bestämma om bilen har normal eller för hög bensinförbrukning så kan koden förkortas rätt mycket.

Kod: Markera allt

	if ((val == 1 && summa < 1.1) ||
	    (val == 2 && summa < 1.0) ||
	    (val == 3 && summa < 0.9))
	{
		cout << "\n\n** Normal Bensinförbrukning **";
	}
	else
	{
		cout << "\n\n\a** Dags att serva bilen, den har för hög bensinförbrukning! **";   
	}
Egentligen behöver man inte paranteserna runt varje val och summa eftersom "&&" har högre prioritet än "||" (liksom multiplication har högre prioritet än addition). Men jag tycker iaf att det blir lite tydligare eftersom det inte alltid är så lätt att hålla reda på alla prioriteringsordningar.
Skriv svar

Återgå till "Programmering och webbdesign"