CDV kód generálása, hogyan?
Hello,
Adott egy 9 karakteres számsor, ehhez kellene képezni egy 10. karaktert. Az alábbi algoritmus szerint: balról haladva a számokat felváltva megszorozni hárommal, és eggyel, a szorzatokat összeadni, és egy MOD10es művelettel megkapom a szükséges számot.
Sajna elképzelésem sincs, hogy milyen irányba induljak...
Ötlet, tanács?
Köszi
re: CDV kód generálása, hogyan?
Valassz programnyelvet... Php, java, javascript, pascal, c, c++, c#, delphi, basic, fortram... Vagy akar adatbazison belul sql el :)
Miutan kivalasztottat, johet az algoritmus. Vagy felberelsz valakit ennek a megirasara vagy megtanulod. De ha diy vagy akar excelben is megteheted...
cheers,
re: CDV kód generálása, hogyan?
Igen, azért a PHP topikban írtam, mert ezt már eldöntöttem. Illetve, hát nem is én, hanem ebben kell.
Ott akadtam el, hogy nem tudtam, hogy kezeljem egy szám helyiértékeit (Ezt most sem tudom...). Ezt nem tudtam megoldani, ekkor jött a kérdés. Viszont közben rájöttem, hogy egyszerűen nem számként fogom kezelni, hanem szövegként. Úgyhogy megoldódott.
Azért köszi a segítséget. :)
re: CDV kód generálása, hogyan?
EAN vonalkódok ellenőrző része is így számolandó...
példaszám: $szamsor=987654321
Egyszerű a megoldás:
-substr -rel egyesével kiveszed a számokat, összeadod, és szorzod hárommal
(9+7+5+3+1)*3
-substr -rel kiveszed minden második számot, és összeadod
8+6+4+2
-a két eredményt összeadod
-maradék osztás (%)
$cdv=osszeg % 10
$egesz=$szamsor.$cdv;
substr használata:
http://php.net/manual/en/function.substr.php
re: CDV kód generálása, hogyan?
$cdv=0;
for(i=9;i;i++){$cdv+=(1+(2*(i%2))*(int) $szamsor/pow(10,$i);}
$cdv%=10;
re: CDV kód generálása, hogyan?
Köszönöm, végül is megoldódott, lehet, hogy nem a legszebben, de működik. Ilyen lett:
$CDV=$ragszam[0]*3 + $ragszam[1]*1 + $ragszam[2]*3 + $ragszam[3]*1 + $ragszam[4]*3 + $ragszam[5]*1 + $ragszam[6]*3 + $ragszam[7]*1 + $ragszam[8]*3)%10
Egyébként ez a postai RAGszám ellenőrző kódja! Sajna lett azóta mégegy gond. Nem szeretem a Postát... :)
Ez a leírás:
Az ellenőrző számjegy - algoritmus rekurzív algoritmus. Az ellenőrzőszám az egész OCR-sorra (ez változó hosszúságú) kiterjedően kerül kiszámításra. Az algoritmus a mezőkkel és helyértékkel végzendő műveleteket balról kiindulva hajtja végre.
a. Az X-tengelyen találjuk az áthozatokat.
b. Az Y-tengelyen találjuk a kódoló sor számjegyeit.
c. Az X- és Y-tengelyek metszéspontjában találjuk az új áthozatot.
0 1 2 3 4 5 6 7 8 9 CDV
0 0 9 4 6 8 2 7 1 3 5 09
1 9 4 6 8 2 7 1 3 5 0 90
2 4 6 8 2 7 1 3 5 0 9 81
3 6 8 2 7 1 3 5 0 9 4 72
4 8 2 7 1 3 5 0 9 4 6 63
5 2 7 1 3 5 0 9 4 6 8 54
6 7 1 3 5 0 9 4 6 8 2 45
7 1 3 5 0 9 4 6 8 2 7 36
8 3 5 0 9 4 6 8 2 7 1 27
9 5 0 9 4 6 8 2 7 1 3 18
Példa: kódolósor kiszámítása 0846255
1.lépés: áthozat 0, 1.számjeggyel kombinálva (0) kódolósor, 0 áthozatot ad ki
2.lépés: áthozat 0, 2.számjeggyel kombinálva (8) kódolósor, 3 áthozatot ad ki
Stb...
Az utolsó számnál A CDV oszlop száma adja az eredményt!
Arra gondoltam, hogy a számokat feltöltöm egy tömbbe, valami ciklussal kikeresem az áthozatott, és így végigmegyek rajta. De hogy kapom meg, hogy épp melyik sorba vagyok?
Sajna nem tanultam programozni, pedig valami alap "algoritmus" órán biztos elhangzott volna... :)
Hátha valaki!
Kösz
re: CDV kód generálása, hogyan?
Szia!
Hát nem ma tetted fel a kérdést, de én is belefutottam ebbe a postai csekk ellenőrző algoritmusba és gondoltam álljon itt akkor egy megfejtés rá.
Az eredmény kipróbálható itt: hxxp://oriandras.hu/snippet/sorcdv.php <<< ezt tanulmányozásra le is lehet tölteni ;)
Első körben létrehozom tömbösítve a számolótáblát:
PHP kód:
$kod = array (
array(0,9,4,6,8,2,7,1,3,5),
array(9,4,6,8,2,7,1,3,5,0),
array(4,6,8,2,7,1,3,5,0,9),
array(6,8,2,7,1,3,5,0,9,4),
array(8,2,7,1,3,5,0,9,4,6),
array(2,7,1,3,5,0,9,4,6,8),
array(7,1,3,5,0,9,4,6,8,2),
array(1,3,5,0,9,4,6,8,2,7),
array(3,5,0,9,4,6,8,2,7,1),
array(5,0,9,4,6,8,2,7,1,3)
);
$kodCDV = array("09","90","81","72","63","54","45","36","27","18");
Bekérem egy űrlapban a számsort, amiből generálni szeretnénk az ellenőrző kódot:
HTML kód:
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"];?>" id="szamform" name="szamform">
<p><input type="text" id="szamsor" name="szamsor" value="<?php echo $szamsor;?>"></p>
<p<input type="submit" name="submit" class="btn bg-red300 text-white" value="Mehet"></p>
</form>
Szétkapom a számsort darabjaira és meg is számolom a számjegyeket a továbbiakhoz.
PHP kód:
$_POST['szamsor'] = $szamsor;
echo "<p class=\"large center\">".$szamsor."</p>";
$digits = (string)$szamsor;
$digitsnumber = strlen($szamsor);
echo "<p>Számjegyek darabszáma: ".$digitsnumber."</p>";
A következő lépésben elkezdem egymás mellé rendelni soronként a kinyert adatokat. Az első számnál az áthozat értékét kinullázom, a további lépésekben egy kis sessionbe teszem és az viszi lépésről lépésre. Az aktuális számjegyet a szétrobbantott számsor elemeiből szedem vissza.
PHP kód:
$i=0;
echo "<ol>";
while ($i < $digitsnumber) {
if ($i==0) {
$szam=$digits[$i];
$athozat=0;
$_SESSION['athozat'] = $kod[$athozat][$szam];
}
else {
$szam=$digits[$i];
$athozat=$_SESSION['athozat'];
$_SESSION['athozat'] = $kod[$athozat][$szam];
}
echo "<li>áthozat: ".$_SESSION['athozat']."</li>";
$i++;
}
echo "</ol>";
Amikor a számjegyek darabszámának megfelelő mennyiségű műveletet elvégezte a kód kapok egy utolsó áthozat sessiont, amivel az ellenőrző oszlopból már egyszerűen kinyerhető a keresett szám.
PHP kód:
echo "CDV kód: ".$kodCDV[$_SESSION['athozat']];
Lehetett volna elegánsabb is pár helyen, de elvégzi a dolgát és nem akartam vele több időt elvesztegetni. Remélem tudtam segíteni másnak is, mert undorító egy munka volt. :)