C Autokennzeichen generieren mit "rand"

Thomas44

Grünschnabel
Hallo ich muss ein Programm schreiben das Autokennzeichen generiert. Jedoch habe ich kein Plan wie ich das machen soll.
Die nötige Funktion dafür ist: int NumberGen(char* number, int digits, int characters);

char num[10];
int l = NumberGen(num, 3, 2); // gibt 5 als Länge zurück
// in 'num' könnte "542BF" stehen

Vielen Dank!
 

Neonof

Mitglied
Hallo Thomas44,

ist das Thema noch relevant? Ansonsten bitte einmal entsprechend markieren.
Falls ja:

Wenn ich das richtig verstehe, ist NumberGen also lediglich der Name der Funktion, die du selber schreiben sollst. Wenn du überlegst, wie du diese Aufgabe per Hand lösen würdest, würdest du dir ja erstmal diesen String hernehmen, in den du dein generiertes Kennzeichen ablegst. Du würdest dir ansehen, wie viele Zahlen es haben soll, so viele zufällige Zahlen dort hineinlegen und anschließend mit der Anzahl Buchstaben das selbe tun, ehe du die Anzahl geschriebener Zeichen zurückgibst. Der Code dazu könnte so aussehen:

C:
#include <stdlib.h>
#include <stdio.h>

int NumberGen(char* number, int digits, int characters)
{
    int c = 0;
   
    for (int i = 0; i < digits; i++)
    {
        number[c] = (rand() % 10) + '0';
        c++;
    }

    for (int i = 0; i < characters; i++)
    {
        number[c] = (rand() % 26) + 'A';
        c++;
    }

    number[c] = '\0';

    return c;
}

int main()
{
    char num[10];
    srand(5);

    for (int i = 0; i < 5; i++)
    {
        int len = NumberGen(num, 3, 2);
        printf("%3d %s\n", len, num);
    }

    return 0;
}

Die Funktion rand ist in der stdlib.h deklariert.
rand function

Purpose
:
Computes a new pseudo-random number.

Syntax:
int rand(void);

Declared in:
<stdlib.h>

Description:
The rand function computes a new pseudo-random number in the interval 0 to RAND_MAX. Use srand to seed the random number generator before the first call to rand.

Returns:
A new pseudo-random number.
Sie liefert also eine beliebige Zahl bis RAND_MAX. Um Zahlen von 0 bis 9 und für die Buchstaben 0 bis 25 zu generieren, könnte man das Makro RAND_MAX ändern, doch das ginge nur einmal - vor dem kompilieren. Die bessere Möglichkeit ist es, mit dem Modulo-Operator zu arbeiten. Sie gibt den Rest einer Teilung zurück. Du kannst dir Modulo so vorstellen, dass du dich innerhalb des Bereichs zwischen 0 und (hier) 9 bzw. 25 im Kreis drehst. Überschreitest du die 9 oder die 25, bist du wieder bei 0. Die auf diese Weise generierte Zahl kann in einem String noch nicht so abgelegt werden, da sie ein verkehrtes Zeichen kodieren würde.

Die Zeichen, also die Character, aus denen ein String besteht, sind im Speicher auch nur Zahlen. Ein 'A' ist bspw. 65. Ein 'B' ist 66 usw. Die Zuordnung kannst du in jeder ASCII-Tabelle nachschlagen.
Schreibst du im Code 'A' wird dies also als 65 interpretiert. Willst du ein Zeichen ausgeben, bspw. mit printf("%c", 'A'), wird auch hier das 'A' als 65 interpretiert und printf versteht den character 65 als 'A'. printf("%c", 65) gibt dem zufolge ebenfalls die Ausgabe 'A'. Das Prinzip ist nun dies, die generierte Zahl auf das 'A', also auf die 65 drauf zu addieren, die den Anfang des Bereichs für Großbuchstaben darstellt.

Mit den Zahlen ist es das selbe. Das Zeichen '0' wird im Speicher kodiert mit der Zahl 48. Auf diese 48 wird die generierte Zahl hinzuaddiert. Eine generierte 0 bleibt bei 48, was '0' ist. Eine generierte 1 macht daraus 49, was '1' entspricht, usw.

c (hier für cursor) ist die Stelle im String, auf die aktuell geschrieben wird und dadurch hinterher auch automatisch die Anzahl an Elementen, die geschrieben wurden und zurückgegeben werden soll. Außerdem muss abschließend auf den String noch ein terminierendes Null-Character geschrieben werden, das das Ende des Strings markiert, damit auf der Konsole hinterher kein Blödsinn ausgegeben wird, der Zufällig direkt dahinter stand.

Die main() ist hier der Testtreiber, der deine Funktion 5 mal testet und entsprechend vorbereitet. Wie in der Beschreibung von rand() beschrieben, muss der Generator mittels srand() erst einmal initialisiert werden, um wirklich unterschiedliche Werte zu liefern. Die 5 ist hierbei nur ein zufällig gewählter Wert, der die Sequenz bestimmt, aus der Werte zurückgegeben werden.

Meine Ausgabe hier:
5 435JW
5 079QK
5 413EK
5 737IJ
5 723BO

Gruß,
Neonof