Avatar billede disher Nybegynder
23. oktober 2002 - 18:42 Der er 23 kommentarer og
1 løsning

Random i C++ Builder 5

Hvordan laver jeg en generator, som generer 13 tilfældige cifre, som lagt tilsammen kan divideres med 43?
Avatar billede soreno Praktikant
23. oktober 2002 - 18:47 #1
sådan får du 13 tilfældige tal.

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    int i;
    srand(time(0));

    for(i=0;i<13;i++)
    {
        printf("[%i] %i\n", i+1, rand());
    }
    return 0;
}


prøv at uddybe hvad du mener med "divideres med 43" - i princippet kan alle tal jo divideres med 43..
Avatar billede disher Nybegynder
23. oktober 2002 - 18:53 #2
Jeg får mindre end 13 cifre. Det med "divideres med 43" mener jeg, at det skal gå op i 43 et hélt antal gange, f.eks 1,2,3 osv. Der må ikke være noget i rest som 1,3254.
Jeg håber at det giver mening!
Avatar billede soreno Praktikant
23. oktober 2002 - 18:56 #3
hvis du mener et ciffer, altså et tal mellem 0-9 - så dur dette:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int cifre[13];

bool cifreOK()
{
    int sum = 0;
    for(int i=0;i<13;i++)
    {
        cifre[i] = rand()%10;
        sum += cifre[i];
    }
   
    if(sum%43)
        return true;
    else
        return false;
}

void printCifre()
{
    for(int i=0;i<13;i++)
    {
        printf("[%i] %i\n", i+1, cifre[i]);
    }
}

int main(int argc, char **argv)
{
    srand(time(0));

    while(cifreOK())
    {
    }
    printCifre();
    return 0;
}
Avatar billede disher Nybegynder
23. oktober 2002 - 18:58 #4
Erm, jeg får nogle fejl. Det er sådan, at når jeg trykker på Button1, så skal tallene stå i Edit1!
Avatar billede soreno Praktikant
23. oktober 2002 - 19:00 #5
prøv at poste din kode (med min indflettet der hvor du tror den skal være).
Avatar billede disher Nybegynder
23. oktober 2002 - 19:04 #6
Det her virkede fint (uden fejl, altså :) med dit første eksempel:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int i;
    srand(time(0));

    for(i=0;i<13;i++)
    {
      Edit1->Text=("[%i] %i\n", i+1, rand());
    }
}

Jeg ved ikke helt med det sidste du skrev, hvordan det skal sættes ind!
Avatar billede arne_v Ekspert
23. oktober 2002 - 19:09 #7
Jeg tror ikke at kan bruge den printf argument-list i den
sammenhæng.
Avatar billede soreno Praktikant
23. oktober 2002 - 19:13 #8
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    srand(time(0));

    int cifre[13];
    int sum = 0;

    do
    {
        sum = 0;
        for(int i=0;i<13;i++)
        {
            cifre[i] = rand()%10;
            sum += cifre[i];
        }       
        printf("sum %i\n", sum);           
    }while(sum%43);

    for(int i=0;i<13;i++)
    {
        //her skal Edit1 appendes det som står på cifre[i]
        //hvordan ? det ved jeg ikke, måske:
        Edit1->Text+=cifre[i];
    }
}
Avatar billede smokes Nybegynder
23. oktober 2002 - 19:26 #9
disher: de foreslåede metoder her er brute force metoder.. det vil sige de består af en loop som kører indtil de giver det rigtige.. det er temmelig ueffektiv kode, dog engang imellem uundgåelig.. hvad skal du bruge tallet til?.. der findes mange gode algoritmer til at genere ID numre etc som ikke gør brug af brute force *s*
Avatar billede disher Nybegynder
23. oktober 2002 - 19:35 #10
@soreno
Det ved jeg heller ikke helt. Jeg kiggede i hjælpe filen og fandt noget om AsString. Et eksempel:

Edit1->Text = CustomersCustNo->AsString;

Men jeg får denne fejl hvis jeg prøver (Edit1->Text+=cifre[i]->AsString;):
Pointer to structure required on left side of -> or ->"

@smokes
Det er til et projket, hvor min gruppe skal lave en stregkode læser og stregkode printer. Vi bruger en stregkode standard , Barcode39, som kræver at de benyttede tal tilsammen kan gå et helt antal gange op i 43! Så er det bare at smide tallene ind i f.eks Word med en Barcode39 font!
Avatar billede disher Nybegynder
23. oktober 2002 - 19:45 #11
Nåh ja, jeg glemte at skive, at cifre[i] skal ændres fra int til string, for at den kan skives i Edit1. Jeg går ud fra at string svarer til char...!?
Avatar billede soreno Praktikant
23. oktober 2002 - 19:49 #12
dvs. du skal bruge x antal sammensætninger af 13 cifre der kan deles med 43 ?
så er det da nemmere at skrive output til en fil og kopiere videre over til tekskbehandleren.
eks. opret et konsol program med følgende kode:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    srand(time(0));
    int cifre[13];
    int sum = 0;
    int antalStregkoder = 20;
    for(int j=0;j<antalStregkoder;j++)
    {
        do
        {
            sum = 0;
            for(int i=0;i<13;i++)
            {
                cifre[i] = rand()%10;
                sum += cifre[i];
            }       
        }while(sum%43);

        printf("%i %i %i %i %i %i %i %i %i %i %i %i %i\n", cifre[0], cifre[1], cifre[2], cifre[3], cifre[4], cifre[5], cifre[6], cifre[7], cifre[8], cifre[9], cifre[10], cifre[11], cifre[12]);
    }
   
    return 0;
}

eksekver programmet med:
mitprogram.exe > c:\output.txt

åben output.txt og gå i krig med at ændre font.

--
hvis du vil konvertere en int til et char array kan det gøre sådan:
int tal = 123;
char buffer[256];
itoa(tal, buffer, 10);
Avatar billede disher Nybegynder
23. oktober 2002 - 20:04 #13
Jeg prøvede dette, men der kommer kun et tal ud i Edit1:

Edit1->Text = IntToStr(cifre[i]);
Avatar billede disher Nybegynder
23. oktober 2002 - 20:05 #14
Jeg prøver lige...
Avatar billede disher Nybegynder
23. oktober 2002 - 20:14 #15
Hmm på den anden side..
Det er meningen at vi senere skal lave et lille tekstbehandlings progam, hvori tal generatoren er en del af skriveprogammet, så den skiver tallene ud med barcode font'en og printer det direkte ud!
Så det ville være fedt, hvis det første vil virke :)

Jg prøvede...

        char buffer[256];
        itoa(cifre[i], buffer, 10);
        Edit1->Text = buffer;

... men der sker det samme, som med "Edit1->Text = IntToStr(cifre[i]);" at der kun kommer ét tal ud.
Avatar billede soreno Praktikant
23. oktober 2002 - 20:15 #16
det er vel fordi du skal samle det hele i én streng, eks:
..
          sum += cifre[i];
        }     
        printf("sum %i\n", sum);         
    }while(sum%43);

    char buffer[256];
    sprintf(buffer, "%i %i %i %i %i %i %i %i %i %i %i %i %i\n", cifre[0], cifre[1], cifre[2], cifre[3], cifre[4], cifre[5], cifre[6], cifre[7], cifre[8], cifre[9], cifre[10], cifre[11], cifre[12]);
    Edit1->Text = buffer;
Avatar billede disher Nybegynder
23. oktober 2002 - 20:22 #17
Woooohoooh... it werks :D
Takker mange gange....









ninja
Avatar billede smokes Nybegynder
23. oktober 2002 - 20:37 #18
havde lige skrevet en lang post og fik fucket den op *g*

nå:
http://www.terrapin.co.uk/code39.html
barcode39 standarden.. læs den.. at generere 13 tilfældige tal der går op i 43 er ikke hvad du har lyst til.. du skal beregne et checkciffer for x tal mellem 0 og 42 (code 39 tegnsættet) som du selv bestemmer og appende check cifferet til stregkoden.. checkcifferet er et modulo 43 check.. læs eksemplet i ovenstående link.. til sidst skal det lige nævnes at checkcifferet ikke er en del af standarden.. det kan udelades
Avatar billede soreno Praktikant
23. oktober 2002 - 20:41 #19
smokes>> jeg copy/paster altid mit indlæg inden jeg overlader det til "udfør" knappen. det er irriterende når der returneres et "zero size reply" eller lign.
Avatar billede smokes Nybegynder
23. oktober 2002 - 20:54 #20
soreno: tak for tippet *s*.. skal prøve at huske det *g*
Avatar billede disher Nybegynder
23. oktober 2002 - 20:56 #21
@smokes
Da vi ikke har råd til at købe (ja KØBE) en code39 font, har vi downloadet et shareware som er begrænset til kun tal, 0-9. Og da vi ikke har så mange andre muligheder, har vi besluttet kun at bruge tallene, og for at slippe af med check-tallet, er det lettere bare at ha' nogle tal, som går lige op i 43!
Desuden som der står, så er et check ciffer ikke nødvendigt og bliver ikke ofte brugt :)
Avatar billede smokes Nybegynder
23. oktober 2002 - 21:25 #22
hvorfor skal tallene så gå op i 43?.. det står der da ikke noget om i den standard.. der står at der er et karakter sæt fra 0 til 42 (ligesom en slags ASCII :-).. tallene 0-9 har koderne 0-9 (what a surprise).. så kan i vel bare skrive
1230
og stregkode værdien for det er:
1230

ellers har jeg misforstået noget *s*.. men skide være med det.. er jo ikke mit projekt.. blev bare nysgerrig da jeg læste om det *s*
Avatar billede disher Nybegynder
23. oktober 2002 - 22:18 #23
Hehehe well, det er noget jeg har fået af vide, af en gut i min gruppe, som har læst om det. Og i eksemplet trækkes der jo 43 fra de 75 så der er 32 i rest. Og 32 svarer jo til W i tegnsættet!
Og bla bla bla :)
Avatar billede smokes Nybegynder
23. oktober 2002 - 23:42 #24
eh ja.. men som du selv nævnte kan i udelade modulus beregningen.. i skal bare lave nogle stregkoder med numre som har samme værdi i code39 systemet som i computerens hukommelse, det er da super simpelt *s*.. tror du skal slå ham fra din gruppe *g*.. for ligemeget om i vælger at implementere modulo 43 checket eller ej så kan cifrene i stregkoden være hvilke som helt karakterer man har lyst til fra code 39 tegnsættet.. og i jeres version 0-9 på grund af det shareware pis.. jeg er ret sikkert på at du kan finde en freeware font på nettet et sted :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester