C (Programmiersprache) – die neusten Beiträge

C: Wie kann ich ein Pointer-Array anlegen, um die Fundstellen zu speichern?

/* 24_02 dynamische Speicherverwaltung
   demonstriert realloc
   ZUR BEACHTUNG: Dies ist ein reines Demo-Programm!
                  Speicher-Reallokation in 10-Byte-Blöcken ist in der Praxis nicht sinnvoll!
                  Speicherallokation und insbesondere Speicher-Reallokation kosten erhebliche System-Resourcen!
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRLEN 10

int Such(char* strPtr, char* Ptr2);

int main()
{
  int n = 1;
  char* strPtr = (char*)malloc(n * STRLEN); // kleinen Speicherblock anfordern
  char* strPtr2 = (char*)malloc(n * STRLEN); // kleinen Speicherblock anfordern
  printf("Bitte Text eingeben: \n");
  fgets(strPtr, STRLEN, stdin); // einlesen
  printf("\n");

  while (strPtr[strlen(strPtr) - 1] != '\n') // Ende erreicht, letztes Zeichen '\n'?
  {
    n++; // Anzahl Blöcke inkrementieren
    strPtr = (char*)realloc(strPtr, n * STRLEN); // größeren Speicher anfordern: n Blöcke
    fgets(strPtr + strlen(strPtr), STRLEN + 1, stdin); // weiter einlesen, terminierende 0 überschreiben, STRLEN + 1 Byte stehen zur Verfügung
  }

  printf("Nach welcher Zeichenfolge soll gesucht werden?\n");
  fgets(strPtr2, STRLEN, stdin); // einlesen
  printf("\n");

  while (strPtr2[strlen(strPtr2) - 1] != '\n') // Ende erreicht, letztes Zeichen '\n'?
  {
    n++; // Anzahl Blöcke inkrementieren
    strPtr2 = (char*)realloc(strPtr2, n * STRLEN); // größeren Speicher anfordern: n Blöcke
    fgets(strPtr2 + strlen(strPtr2), STRLEN + 1, stdin); // weiter einlesen, terminierende 0 überschreiben, STRLEN + 1 Byte stehen zur Verfügung
  }

  printf("Zeichenfolge wurde %i mal gefunden\n", Such(strPtr, strPtr2));
  return 0;
}

int Such(char* strPtr, char* strPtr2)
{
  int n = 0;
  int p = 0;
  int sip = 0;

  int ltext = strlen(strPtr) - 1;
  int lzfolge = strlen(strPtr2) - 1;
  int lgteilt = ltext / lzfolge;
  char* ptrarr[] = { NULL };

  while ((lgteilt) > 0)
  {
    for (int i = 0; i < lzfolge; i++)
    {
      if (strPtr[p] == strPtr2[i])
      {
        sip++;
      }

      p++;
    }

    lgteilt--;
  }

  return (sip / lzfolge);
}

Ich verstehe leider nicht ganz, wie man ein Pointer-Array anlegen soll, um die Fundstellen zu speichern.

Ich habe zwar eine Schleife, aber diese kann z. B. "yay" nicht mit "ay" vergleichen.

Danke für die Hilfe.

Bild zum Beitrag
Computer, Technik, programmieren, Technologie, C (Programmiersprache)

Was ist der Tastaturpuffer?

Hallo,

Ich lerne gerade C für mein Studium und wir arbeiten mit scanf. Unser Prof hat das Thema Tastaturpuffer aber leider nicht richtig erklärt und ich stehe dementsprechend auf dem Schlauch.

Hier ist die ganze Sache ja noch sehr verständlich.

Eine Zahl wird eingelesen. Diese Eingabe wird mit \n bestätigt. Das in der letzten Zeile eingegeben \n befindet sich in diesem Tastaturpuffer und  wird jetzt automatisch im zweiten scanf eingegeben. Damit wird dieses scanf "Übersprungen" und der Variable "Dummy" das \n  zugewiesen.

EIne Zahl und ein Zeichen wird eingelesen. Wenn jetzt sowohl das Zeichen als auch das \n in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und einen Zeilenumbruch aus Ausgabe bekommen. Das Passiert aber nicht.

Wenn nur das A in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und die möglichkeit erhalten, ein neues Zeichen einzugeben. Das Passiert aber auch nicht.

Stattdessen erhalt ich einfach nur eine 7 und ein A und der Code wird beendet. Warum?

Hier die beiden Codes:

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy;

    printf("geben Sie bitte eine ganze Zahl ein:");

    scanf("%d", &Zahl);                                         .

    scanf("%c", &Dummy);                                        

    printf("%c", Dummy);                                        

    return 0;

}

Und

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy2;

    char Dummy;

    printf("\ngeben Sie bitte eine ganze Zahl und ein Zeichen ein:");

    scanf("%d", &Zahl);                                                 

    printf("%d", Zahl);

    scanf("%c", &Dummy);                                               

    printf("%c", Dummy);                                             

    scanf("%c", &Dummy2);                                                

    printf("%c", Dummy2);

    return 0;

}

Bild zum Beitrag
Computer, Schule, programmieren, C (Programmiersprache)

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)

Meistgelesene Beiträge zum Thema C (Programmiersprache)