C++: Kann ich diesen Code irgendwie noch vereinfachen?

Guten Abend,

ich schreibe gerade in C++ an einem kleinen Kniffelspiel. Im Moment bin ich soweit, dass ich mir fünf zufällige Zahlen (Würfel) über die rand()-Funktion erstelle, diese dann in einem Vektor speichere und anschließend über die Funktion auswertung() den höchsten Pasch zurückgebe. Jedoch ist der Code nicht gerade sehr kompakt. Hat jemand Vorschläge für Optimierungen?

Vielen Dank im Voraus!

#include <iostream>
#include <ctime>
#include <vector>
#include <random>

using namespace std;

vector<int> würfe()
{
  vector<int> list; // Ermittelt über die aktuelle Systemzeit 5 Zufallszahlen und übergibt sie dem Vektor list
  srand(time(0));

  for (int i = 0; i < 5; i++) {
    list.push_back(1 + rand() % 6);
    cout << list[i];
  }

  cout << endl;
  return list;
}

int auswertung(vector<int> ergebnis)
{
  int pasch = 0;

  // Verschachtelte for-Schleife iteriert durch Vektor und vergleicht alle Elemente miteinander
  for (vector<int>::iterator it = ergebnis.begin(); it != ergebnis.end(); ++it) {
    for (vector<int>::iterator it1 = ergebnis.begin(); it1 != ergebnis.end(); ++it1) {
      // Nur wenn die Werte gleich sind (Pasch) und nicht auf dasselbe Element zeigen, geht es weiter
      if (*it1 == *it && it != it1) {
        // Nur wenn der gefundene Pasch höher als der Höchste bereits gefundene ist, wird er ausgewertet
        if (*it > pasch) {
          switch (*it) {
            case 1: pasch = 1;
              break;
            case 2:
              pasch = 2;
              break;
            case 3: pasch = 3;
              break;
            case 4: pasch = 4;
              break;
            case 5: pasch = 5;
              break;
            case 6: pasch = 6;
              break;
          }
        }
      }
    }
  }

  return pasch;
}

int main()
{
  int pasch;
  vector<int> random = würfe();
  pasch = auswertung(random);

  cout << "Pasch: " << pasch << endl;
}
Computer, Software, Technik, programmieren, Cplusplus, CC, Code, CPP, Informatik, Softwareentwicklung, Technologie, C (Programmiersprache)
C programmierung Konsolen Anwendung?

Hilfe zur C-Konsolenanwendung.

Ich komme nicht mehr weiter.. :(

 Ich lerne C und habe Hausaufgaben. Die Aufgabe besteht darin, eine Konsolenanwendung zu erstellen.

 Kreditkarten werden durch sechzehnstellige Nummern identifiziert. Die ersten fünfzehn Ziffern werden von der Bank vergeben, die letzte ist die Prüfziffer, die aus den anderen fünfzehn Ziffern berechnet wird. Sie wird in drei Schritten ermittelt. Wir gehen davon aus, dass die Kreditkartennummer ohne Prüfziffer 271 828 182 845 856 lautet.

 Wir verdoppeln die Ziffern an den ungeraden Stellen und addieren sie zu Ziffern.

 Die Ziffern in den geraden Ziffern werden addiert.

 Aufgabe: Schreiben Sie ein Programm, das die Prüfziffer für die angegebene Anzahl von Ziffern ermittelt und die Kreditkartennummer in Viererblöcken ausgibt (wie im Beispiel). Tipps: Mit int x; sei eine ganzzahlige Variable deklariert. Durch Zuweisen von x = 13/4; die Variable x erhält den Wert 3, i. das Ergebnis der Teilung ohne Pause. Mit int x; sei eine ganzzahlige Variable deklariert. Durch Zuweisung von x = 13% 4; die Variable x erhält den Wert 1, i. der Rest in der Ganzzahldivision. Die Nummernfolge sollte in einem Array gespeichert werden. Verwenden Sie für den ersten Test die oben angegebene Ziffernfolge. Danach können Sie Zufallswerte bis zu 9 verwenden

Der Code, den ich schreibe, ist ..

 int main ()

int i; int numbers [] = {2,7,1,8,2,8, 1,8,2,8, 4, 5, 8, 5, 6};

 für (i = 0; i <15; i ++) printf ("% i", Zahlen [i]);

 

Computer, Schule, programmieren, Informatik, C (Programmiersprache)
C++ Der Ausdruck muss einen ganzzahligen Enumerationstyp aufweisen?

Was ist hier das Problem?

/   Programm:       Schiefer Wurf
* Filename:       SchieferWurf.cpp
  Autor:       Kai Lauber
* Version: 1.0
* Datum: 25-OKT-2019
  Entwicklungsablauf:
* (Version, Datum, Autor, Entwicklungsschritt)
 1.0, 25-OKT-2019, Kai Lauber, Entwicklungsbeginn 

  Verwendungszweck:
 ‐ Ausgabe der Koordinatenpunkte (x, y) eines Wurfkörpers 
* Beschreibung:     ← Kurzbeschreibung des Programms
 ‐ Das zu erstellende Modul soll die Koordinatenpunkt (x,y) des Wurfkörpers aus den gegebenen Grössen ermitteln und zurückgeben. 	– Anfangsgeschwindigkeit
 – Abschusswinkel 	– Zeit seit des Abwurfes
 
  Precondition:
* ‐ Keine
  Postcondition:
* ‐ Keine
  Folgende Funktionen werden erzeugt:
* ‐
  Copyright (c) 2019 by Kai Lauber

***/

// Bibliotheksfunktion einbinden #include "stdio.h"

// Hauptprogramm int main() {

int v;
int w;
int t;
double x;
double y;
double g = 9.81;


printf("Geben Sie bitte die Anfangsgeschwindigkeit ein: ");
scanf_s("%d", &amp;v);


printf("Geben Sie bitte die Abschusswinkel ein: ");
scanf_s("%d", &amp;w);


printf("Geben Sie bitte die Zeit seit des Abwurfes ein: ");
scanf_s("%d", &amp;t);


int sin = w - w ^ 3 / 6 + w ^ 5 / 120 - w ^ 7 / 5040;


int cos = 1 - w ^ 2 / 2 + w ^ 4 / 24 - w ^ 6 / 720 + w ^ 8 / 40320;


x = v * t * cos;
y = v * t * sin - g / 2 * t ^ 2;


printf("Die Koordinaten sind x = %f und y = %f", x, y);

}

Computer, programmieren, C (Programmiersprache)
Zeit am Arduino lcd Display wird falsch ausgegeben (Komische Zeichen)?

Hallo zusammen

Ich möchte die Zeit also millis() auf dem LCD Dsiplay ausgeben. Dazu habe ich der Variable times millis() zugewiesen. Dann rechen ich times / 100 und speichere dies in der Variable Time ab. Nun rechne ich weiter. Ich rechne die Sekunde, Minuten und Stunden aus. Für die Sekunde und Minute habe ich 10er und 1er Stellen gemacht. Bei Stunden 100er, 10er und 1er Stellen.

Anschliessend möchte ich die Zeit auf dem LCD Display ausgeben. Dazu speichere ich jede Stelle einzeln im Array timeOfEntry ab, da die Zeit ja sonst auf dem Display abgeschnitten wird. Auf dem Display erhalte ich aber komische Ausgaben. Die Doppelpunkte werden korrekt angezeigt. Die Zahlen aber leider nicht.

Der Code:

times = millis();
Time = times / 1000;
seconds = Time % 60;
sectomin = Time / 60;
minutes = sectomin % 60;
hours = sectomin / 60;
seconds1 = seconds % 10;
seconds10 = seconds / 10;
minutes1 = minutes % 10;
minutes10 = minutes / 10;
hours1 = hours % 10;
hours = hours / 10;
hours10 = hours % 10;
hours100 = hours / 10;

logEntry[logEntryCounter].timeOfEntry[0] = hours100;
logEntry[logEntryCounter].timeOfEntry[1] = hours10;
logEntry[logEntryCounter].timeOfEntry[2] = hours1;
logEntry[logEntryCounter].timeOfEntry[3] = doublepoint;
logEntry[logEntryCounter].timeOfEntry[4] = minutes10;
logEntry[logEntryCounter].timeOfEntry[5] = minutes1;
logEntry[logEntryCounter].timeOfEntry[6] = doublepoint;
logEntry[logEntryCounter].timeOfEntry[7] = seconds10;
logEntry[logEntryCounter].timeOfEntry[8] = seconds1;

Ausgabe:

Wie man auf dem Bild sieht, sind die ersten beiden Zeichen anders als die Restlichen. Da schon 10 Sekunden vorbei waren, sollte dort auch z.B 12 Sek. stehen. Es wird aber irgendwie falsch angezeigt. Die Doppelpunkte stimmen. Die anderen Zeichen denke ich sind für die leeren Stellen im Array.

Habt ihr eine Idee, was ich falsch mache?

Vielen Dank im Voraus.

Bild zu Frage
Computer, Technik, Technologie, C (Programmiersprache), Arduino Uno, Spiele und Gaming
SoftwareSerial wie benutzen?

Hallo an die Arduino- Community,

Ich habe mich ja schon sehr viel mit dem Arduino beschäftigt, aber natürlich nicht genug und es ist wahrscheinlich auch nur ein Bruchteil des Möglichen. So genug drum gelabert, zu meiner Frage: Ich benutze die App Blynk zusammen mit dem Arduino Uno, diese muss zum funktionieren eine durchgehende Verbindung zu meinem Serial Port (COM4 in meinem aktuellen Fall) haben, damit die funktioniert. Das bedeutet natürlich, dass ich meinen Seriellen Monitor nicht offen haben kann, da der ja ebenfalls auf den Port zugreifen muss, und nur 1 gleichzeitig geht.

Ich habe aber gehört, ich kann über den SoftwareSerial - Befehl einen zweiten Seriellen Monitor haben... Weiß nur gar nicht, wie der funktioniert, frei hätte ich aktuell die Pins 7 und 8 dafür.

Wie kann ich diesen zweiten Serial erstellen und IHN AUCH ÖFFNEN?

Ich möchte da auf dem Serial2.print nutzen, geht das? (Ich will ihn quasi, wie einen ganz normalen Seriellen Monitor nutzen... Über extra Software geht nichts. Ich habe zumindest schon PuTTY probiert, da öffnet der aber den Port nicht. )

Hier mein bisheriger Code: Blynk braucht halt einen der Seriellen Ports zum funktionieren, was muss ich hier anders machen? (müsst glaube ich nicht zwingend Ahnung von der App haben)

#define BLYNK_PRINT DebugSerial
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(7, 8); // RX, TX
#include <BlynkSimpleStream.h>
char auth[] = "UnFNS1fIbvFVX8QGBWDoBKah3aWND6dn";
void setup() {   DebugSerial.begin(9600);   Serial.begin(9600);   Blynk.begin(Serial, auth);
//anderer stuff
}
void loop () {
Blynk.run();
//zum Beispiel:
if (Buttongedrückt) {
DebugSerial.println("Button gedrückt");
...stuff
}

MFG Alex - Freue mich auf eure Antworten!

Software, programmieren, Arduino, cmd, C (Programmiersprache), RX, Serielle Schnittstelle
Arduino: millis() als delay() in If-Klause benutzen?

Hi! Ich suche schon lange nach einer Lösung wie ich millis() als delay() benutzen kann. Ich habe einen Bodenfeuchtesensor und ein Relais, das an eine Pumpe angeschlossen wird. Ich möchte, dass das Relais für 10 Sekunden angeht, wenn der Bodenfeuchtesensor einen Wert über 600 ausspuckt. Bisher lautet die If-Klause so:

(siehe unten)

Möchte das aber gerne mit millis() machen. Habe schon viel studiert und probiert, aber keine Lösung gefunden. Nachgelesen habe ich auch. Das Prinzip von millis habe ich verstanden, nur nicht, wie das in einem If-Satz funktioniert.

Vielen Dank für Eure Hilfe!

#include "DHT.h"
#define DHTPIN 12
#define DHTTYPE DHT22

//VENT DELAY//
long schedule_freq = 3200000L;
long schedule_duration = 300000L;


long schedule_timestamp = 0L;
long schedule_timestamp_off = 0L;


bool schedule = false;
//VENT DELAY//


//PUMP//

//PUMP//


const int heatPin = 7;
const int ventPin = 4;
const int pumpPin = 12;


int moist_value = analogRead(A0);

DHT dht(DHTPIN, DHTTYPE);




void setup() {
  dht.begin();
  pinMode(heatPin, OUTPUT);
  pinMode(ventPin, OUTPUT);
}


void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();


  if (t <= 16.0) {
      digitalWrite(heatPin, HIGH);
  }


  if (t >= 25.0) {
    digitalWrite(heatPin, LOW);
  }


  if(moist_value >= 600) {
    digitalWrite(pumpPin, HIGH);
    delay(10000);)
    digialWrite(pumpPin, LOW;
    
    }
    
      if (schedule_timestamp < millis()) {
      schedule_timestamp = millis() + schedule_freq;
        schedule_timestamp_off = millis() + schedule_duration;
        schedule = true;
        //Vent On
        digitalWrite(ventPin, HIGH);
      }
    
    
      if (schedule_timestamp_off < millis() && schedule ) {
      schedule = false;
      //Vent Off
      digitalWrite(ventPin, LOW);
    
    
      }
    
    
    }
Computer, Technik, programmieren, Arduino, Technologie, C (Programmiersprache), If clauses, Arduino Uno, Arduino IDE
Schrittmotor einfach drehen- Arduino?

Seid gegrüßt,

Ich möchte über einen PS2 Controller einfach einen Schrittmotor ansteuern, also sprich ich drücke eine Taste und er dreht solange in diese Richtung, wie die Taste gehalten wird. Nur mit zwei Tasten, für 2 Richtungen, vor und zurück.

Eigentlich Frage: Wie code ich das am Besten?

Also etwa so (mal so erklärend):

if(ps2x.ButtonPressed(PSB_L1)) {
for (drehe dich vorwärts)
solange vorwärts drehen, wie die Taste gehalten wird
}
if(ps2x.ButtonPressed(PSB_R1)) {
for (drehe dich rückwarts)
solange rückwarts drehen, wie Taste gedrückt wird
}

Soweit, so gut. Danke für alle Antworten!

MFG Alex

Hier mein aktueller Code dafür: (ganz unten ist der Part, wo später das mit dem Motor hin soll....)

#include <PS2X_lib.h>  
PS2X ps2x; 
//right now, the library does NOT support hot-pluggable controllers, meaning 
//you must always either restart your Arduino after you connect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int error = 0; 
byte type = 0;
byte vibrate = 0;
int magenta=2;
int gruen=3;
int blau=4;
int rot=5;
// Stepper Bibliothek hinzufügen
#include <Stepper.h>
// Anzahl der Schritte pro interner Motorumdrehung
const float STEPS_PER_REV = 32; 
// Betrag der Untersetzung
const float GEAR_RED = 64;
// Anzahl der Schritte pro Getriebeausgangrotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
// Number of Steps Required
int StepsRequired;
// PIN BELEGUNG
// Benutze PINs 8,9,10,11 des Arduinos
// und verbinde diese mit ULN2003 Motor Driver In1, In2, In3, In4 
// Pins, die in der Sequenz 1-3-2-4 für die richtige Schrittsequenzierung eingegeben wurden
Stepper steppermotor(STEPS_PER_REV, 7, 6, 5, 4);
void setup(){
Serial.begin(9600);
error = ps2x.config_gamepad(13,11,10,12, true, true);  //GamePad(clock, command, attention, data, Pressures?, Rumble?) 
if(error == 0){
 Serial.println("Found Controller, configured successful");
 Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
 Serial.println("holding L1 or R1 will print out the analog stick values.");
 Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
type=1;
error=0;
pinMode(2,OUTPUT);
pinMode(3, OUTPUT); //gruen
pinMode(4, OUTPUT); //blau
pinMode(5, OUTPUT); //rot
}
void loop(){
 /
error=0;
type=1;
if(error == 1) 
 return; 
if(type == 2){ 
 ps2x.read_gamepad();     //read controller 
}
else {
ps2x.read_gamepad(false, vibrate); //Ab hier beginnt der eigentliche loop, davor nur weil es auch type 2- Controller gibt, hier für den richtigen
if(ps2x.ButtonPressed(PSB_L1){
  --->Hier Motor...
}
delay(50);
} 
}
Computer, Technik, PlayStation, Drehung, Arduino, Technologie, C (Programmiersprache), Schrittmotor, Servo
C++ Programmcode nicht ausführbar "willkommen"?

Guten Abend zusammen,

ich habe mir heute das, Kindle eBook C++ Programmieren für Einsteiger geholt, da mich programmieren schon seit langer Zeit sehr interessiert, ich bisher aber zeitlich nicht dazu kam, mich da einzulesen.

Nun zu der Frage: Ich habe all das, was das Buch mir gesagt hat, durchgeführt:

  1. Einen Text-Editor zum Codes schreiben heruntergeladen: Geany (Schreibe jedoch über den normalen, bereits auf Windows 10 vorhandenen Texteditor).
  2. Einen Compiler für die Erstellung der Programme heruntergeladen: MinGW.

Anschließend kam auch schon die erste Aufgabe. Ich sollte mit einem Kommandozeileninterpreter (cmd / Eingabeaufforderung) die Version des MinGW abfragen. Dies musste ich erst in den erweiterten Systemeinstellungen einstellen, indem ich die Umgebungsvariablen anpasse (in PATH den Dateipfad meines MinGW\Bin-Ordner hinzufügen). Das hat auch funktioniert und ich konnte durch die Eingabeaufforderung die Version meines Compilers abfragen.

Nun geht es los, das erste Programm schreiben: Eine einfache Ausgabe auf dem Bildschirm. Ziel ist es, eine kurze Textnachricht auszugeben.

Nun sind die Schritte wie folgt beschrieben:

  1. Texteditor öffnen
  2. Programmcode eingeben
#include <iostream>

int main()
{
  std::cout << "Willkommen zum C++ Kurs!";
}

Nun soll ich die Datei unter dem Namen willkommen.cpp abspeichern, in meinem Fall auf dem Desktop.

Danach geht es um die Ausführung des Programms: Ich muss das Programm mithilfe des Kommandozeileninterpreters (cmd) kompilieren.

  1. cmd öffnen.
  2. Verzeichnis ändern, in dem Fall auf meinen Desktop

Befehl:

g++ -o willkommen willkommen.cpp

(Ich frage mich, warum ich doppelt willkommen eingeben muss, auch wenn meine Datei nur ein willkommen hat? Ich habe es mit nur einem willkommen probiert und es wurde mir ein Fehler angezeigt!)

Wenn ich das so eingebe, kommt eine oder zwei kurze Sekunden ein Ladevorgang und es passiert weiter nichts. Eigentlich steht in dem Buch geschrieben, dass unter meiner Eingabe in der cmd ein "Willkommen im C++ Kurs " erscheinen sollte. Dies ist leider nicht der Fall.

Also an jeden, der sich mein Problem angeschaut hat: Vielen Dank!

Ich habe auf YouTube und anderen Plattformen nach einer Lösung geschaut, jedoch nichts mit der gleichen Ähnlichkeit gefunden.

Computer, Buch, Technik, IT, programmieren, Informatik, Technologie, C (Programmiersprache)
Arduino upload funktioniert nicht mehr?

Hallo,

ich kann keine Programme mehr auf den Arduino hochladen. Egal was ich mache kommt diese Fehlermeldung:

Arduino: 1.8.7 (Mac OS X), Board: "Arduino/Genuino Uno"

Der Sketch verwendet 930 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.

Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00

Problem beim Hochladen auf das Board. Hilfestellung dazu unter http://www.arduino.cc/en/Guide/Troubleshooting#upload.

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00

Problem beim Hochladen auf das Board.

Computer, Technik, Elektronik, Upload, programmieren, Arduino, Bootloader, C (Programmiersprache)

Meistgelesene Fragen zum Thema C (Programmiersprache)