String mit ASCII vergleichen + gefundene Gemeinsamkeiten ausgeben

Cuh

Mitglied
Hallo, ich habe bei einer Aufgabe in der FH Schwierigkeiten und hoffe Ihr könnt mir dabei erneut behilflich sein.
Ich sitze seit ein paar stunden an diesem Problem und komme einfach nicht weiter : /

Ich habe einen String der sich aus 2 alten Strings zusammensetzt. (Artikelbezeichnung + ArtNr. ---> Beispiel: TRXSCHRB0012)

Aus diesem String soll ich eine Prüfziffer erstellen.
Hier wäre die Aufgabenstellung.

Die Bildungsregeln für die Prüfziffer lauten wie folgt:
- Jedem der 26 Buchstaben des Alphabets ist ein Wert zugeordnet: A = 1, B = 2, C = 3, … Z = 26
- Die Werte aller Buchstaben sowie die Werte der einzelnen 4 Ziffern, die aus der Artikel-Nr. abgeleitet wurden, werden zusammenaddiert und der ganzzahlige Rest einer Division der Summe durch 16 wird als Prüfziffer angehängt. Da hierbei Werte von 0 bis 15 auftreten können, wird anstelle einer Dezimalziffer die entsprechende Hexziffer angehängt.
- Zur Erinnerung: das Hexadezimalsystem kennt 16 Ziffern von 0-9 sowie von „A“-„F“. Ziffer von „0“-„9“ sind also analog zum Dezimalsystem zu interpretieren. „A“ steht für den Wert 10, „B“ für den Wert 11 usf. Ein Restwert von 13 bewirkt hier entsprechend das Anhängen der Hexziffer „D“.
 
Java:
int i;        
int summe = 0;
int rest = 0;
        
        for (i = 0 ; i < kurzbezeichnung.length() ; i++ ){
            
            if(Character.isDigit(kurzbezeichnung.charAt(i))){
                summe = summe + kurzbezeichnung.charAt(i);
            }
            
            if (Character.isLetter(kurzbezeichnung.charAt(i)) && Character.isUpperCase(kurzbezeichnung.charAt(i))){
                summe = summe + (int)kurzbezeichnung.charAt(i) - 64;
            }
            
        }
        
        rest = summe % 16;
        
        if (rest==10){
            kurzbezeichnung = kurzbezeichnung + 'A';
        }
        else if (rest == 11){
            kurzbezeichnung = kurzbezeichnung + 'B';
        }
        else if (rest == 12){
            kurzbezeichnung = kurzbezeichnung + 'C';
        }
        else if (rest == 13){
            kurzbezeichnung = kurzbezeichnung + 'D';
        }
        else if (rest == 14){
            kurzbezeichnung = kurzbezeichnung + 'E';
        }
        else if (rest == 15){
            kurzbezeichnung = kurzbezeichnung + 'F';
        }
        
        return kurzbezeichnung;

Diese Variante hab ich von einem Kommilitonen bekommen, allerdings achtet unser Prof. sehr darauf nicht von anderen Kommilitonen zu kopieren.
Aber ich komm leider auch nicht drauf wie ich den Code oben umschreiben könnte damit er nicht als Plagiat getestet wird ;(
 
Die übliche Umsetzung wäre wohl die entsprechende Methode der Klasse Integer zu nutzen:
Java:
String hex = Integer.toHexString(i);

Alternativ könntest du die if-else-Kaskade auch als switch-Statement schreiben:

Java:
switch(rest){
 case 10: kurzbezeichnung = kurzbezeichnung + 'A'; break;
 case 11: kurzbezeichnung = kurzbezeichnung + 'B'; break;
 ...
}

Im Übrigen gibts du nicht die korrekte kurzbezeichnung zurück, wenn der rest < 10 ist.
 
stimmt, hab ich ganz übersehen , danke 🙂

habe es jetzt so geschrieben:

Java:
int i;
int summe = 0;
int rest = 0;
        
        for (i = 0 ; i < kurzbezeichnung.length() ; i++ ){
            
            if(Character.isDigit(kurzbezeichnung.charAt(i))){
                summe = summe + kurzbezeichnung.charAt(i);
            }
            
            if (Character.isLetter(kurzbezeichnung.charAt(i)) && Character.isUpperCase(kurzbezeichnung.charAt(i))){
                summe = summe + (int)kurzbezeichnung.charAt(i) - 64;
            }
            if(Character.isLetter(kurzbezeichnung.charAt(i)) && Character.isLowerCase(kurzbezeichnung.charAt(i))){
                summe = summe + (int)kurzbezeichnung.charAt(i) - 96;
            }
            
        }
        
        rest = summe % 16;
    if (rest >= 10){
        
        switch(rest){
        case 10: kurzbezeichnung = kurzbezeichnung + 'A'; break;
        case 11: kurzbezeichnung = kurzbezeichnung + 'B'; break;
        case 12: kurzbezeichnung = kurzbezeichnung + 'C'; break;
        case 13: kurzbezeichnung = kurzbezeichnung + 'D'; break;
        case 14: kurzbezeichnung = kurzbezeichnung + 'E'; break;
        case 15: kurzbezeichnung = kurzbezeichnung + 'F'; break;
        }
    }
        else{
            kurzbezeichnung = kurzbezeichnung + rest;
        }
        return kurzbezeichnung;

allerdings bekomme ich immer noch eine Fehlermeldung wenn ich kurzbezeichnung dann ausgeben möchte.
Bzw. Das Projekt wäre somit eigentlich fertig allerdings bekomme ich wo die kurzbezeichnung (ArtikelBezeichnung + ArtikelNr. + Prüfziffer) stehen soll immer ein "null" in der Konsole
 
Zuletzt bearbeitet:
Java:
public class Artikel {

    private int nummer;
    private String bezeichnung;
    private String kurzbezeichnung;
    private int lagerbestand;
    
    //Konstruktor.
    
    public Artikel(int nummer, String bezeichnung){
        this.nummer = nummer;
        this.bezeichnung = bezeichnung;
    }
    
    //Getter
    public int getNummer(){
        return nummer;
    }


    public int getLagerbestand(){
        return lagerbestand;
    }
    
    public String getBezeichnung(){
        return bezeichnung;
    }
    
    //Setter für die Bezeichnung, diese darf geändert werden.
    public void setBezeichnung(String neueBezeichnung){
        bezeichnung = neueBezeichnung;
    }
    
    public String getKurzbezeichnung(){
        return kurzbezeichnung;
    }
    
    //Lagermethoden! (Instanzmethode)
    public int einlagern(int lagerZugang){
        lagerbestand = lagerbestand + lagerZugang;
        return lagerbestand;
        
    }
    
    public int auslagern(int lagerAbgang){
        if (lagerbestand > lagerAbgang) {
        lagerbestand = lagerbestand - lagerAbgang;
        }
        return lagerbestand;
    }
    
    
    
    public static String erzeugeKurzbezeichnung(int nummer, String bezeichnung){
        
        //Formatierung der Artikelbezeichnung
        if(bezeichnung.length() > 8){
            bezeichnung = bezeichnung.substring(0, 8);
        }
        bezeichnung = bezeichnung.replaceAll("ß","s");
        bezeichnung = bezeichnung.replaceAll("[^a-zA-Z]", "");
        bezeichnung = bezeichnung.replaceAll("[aeiouAEIOU]", "");
        bezeichnung = bezeichnung.toUpperCase();
        
        
        //Artikel Nummer Formatierung. Fals die artikelNummer länger als 4 Stellen ist, sollen nur die letzten 4 Stellen benutzt werden. Falls diese kürzer als 4 Stellen ist soll diese mit vorangestellten Nullen auf 4 Stellen gefüllt werden.
        String formatierteNummer = String.format("%04d", nummer);
        formatierteNummer = formatierteNummer.substring(formatierteNummer.length()-4);
        
        //Kurzbezeichnung = Artikel Bezeichnung + Artikelnummer (beide formatiert wie in der Aufgabenstellung erwünscht.)
        String kurzbezeichnung ="";
        kurzbezeichnung = bezeichnung + formatierteNummer;


        
        //Prüfziffer ermitteln.
        int i;
        int summe = 0;
        int rest = 0;
        
        for (i = 0 ; i < kurzbezeichnung.length() ; i++ ){
            
            if(Character.isDigit(kurzbezeichnung.charAt(i))){
                summe = summe + kurzbezeichnung.charAt(i);
            }
            
            if (Character.isLetter(kurzbezeichnung.charAt(i)) && Character.isUpperCase(kurzbezeichnung.charAt(i))){
                summe = summe + (int)kurzbezeichnung.charAt(i) - 64;
            }
            if(Character.isLetter(kurzbezeichnung.charAt(i)) && Character.isLowerCase(kurzbezeichnung.charAt(i))){
                summe = summe + (int)kurzbezeichnung.charAt(i) - 96;
            }
            
        }
        
        rest = summe % 16;
    if (rest >= 10){
        
        switch(rest){
        case 10: kurzbezeichnung = kurzbezeichnung + 'A'; break;
        case 11: kurzbezeichnung = kurzbezeichnung + 'B'; break;
        case 12: kurzbezeichnung = kurzbezeichnung + 'C'; break;
        case 13: kurzbezeichnung = kurzbezeichnung + 'D'; break;
        case 14: kurzbezeichnung = kurzbezeichnung + 'E'; break;
        case 15: kurzbezeichnung = kurzbezeichnung + 'F'; break;
        }
    }
        else{
            kurzbezeichnung = kurzbezeichnung + rest;
        }
        return kurzbezeichnung;
    }
    
    
    
    public String toString(){
        return nummer + ", " +kurzbezeichnung+ ", " +bezeichnung + ", " +lagerbestand + " auf Lager";
    }
        


    public static void main (String[] args){
        
        //Ezeugen und ausgeben der Objekte
        Artikel a = new Artikel(123, "Torx-Schrauben 6x35");
        System.out.println(a);
        Artikel b = new Artikel(8, "Spax 8x55");
        b.einlagern(17);
        System.out.println(b);
        
        
        System.out.println(erzeugeKurzbezeichnung(62873408, "Schloßschraube"));
    
        }
    }

Bei dieser main soll folgendes auf der Konsole erscheinen:

123, TRXSCHRB01236, TorxSchrauben 6x35, 0 auf Lager
8, SPX8X550008D, Spax 8x55, 17 auf Lager
SCHLSSCH3408A


Meine Konsole gibt aus:

123, null, Torx-Schrauben 6x35, 0 auf Lager
8, null, Spax 8x55, 17 auf Lager
SCHLSSCH34082


EDIT: Sorry habe statt artikelNummer doch nur nummer in meinem code 🙁
keine Ahnung warum des hier artikelNummer heisst. Hab es abgeändert, sonst kommen wir alle noch durcheinander xD
 
Zuletzt bearbeitet:
Haben auch einen JUnit Test bekommen, da läuft alles grün durch bis auf der "TesteKurzbezeichnung" Teil.
 
Zuletzt bearbeitet:
Nein, die liegen erstens in einer statischen Methode und dann handelt es sich um eine lokale Variable.

D.h. du hast 2 Variablen, die gleich heißen. Eine deklarierst du in Zeile 5, die andere in Zeile 71.
 
oh ja danke hab es gar nicht bemerkt.
Allerdings hänge ich immer noch bei meinem Problem von oben fest. Ich bekomme eine Falsche Ausgabe und weis einfach nicht an was es liegt :/
 
Ok
hab es jetzt so abgeändert.

Java:
String foo ="";
foo = bezeichnung + formatierteNummer;
        
 
 
 
        //Prüfziffer ermitteln.
        
        int i;
        int summe = 0;
        int rest = 0;
 
        for (i = 0 ; i < foo.length() ; i++ ){
 
            if(Character.isDigit(foo.charAt(i))){
                summe = summe + foo.charAt(i);
            }
 
            if (Character.isLetter(foo.charAt(i)) && Character.isUpperCase(foo.charAt(i))){
                summe = summe + (int)foo.charAt(i) - 64;
            }
            if(Character.isLetter(foo.charAt(i)) && Character.isLowerCase(foo.charAt(i))){
                summe = summe + (int)foo.charAt(i) - 96;
            }
        }
 
        rest = summe % 16;
    if (rest >= 10){
 
        switch(rest){
        case 10: foo = foo + 'A'; break;
        case 11: foo = foo + 'B'; break;
        case 12: foo = foo + 'C'; break;
        case 13: foo = foo + 'D'; break;
        case 14: foo = foo + 'E'; break;
        case 15: foo = foo + 'F'; break;
        }
    }
        else{
            foo = foo + rest;
        }


        return foo;


dann hab ich noch eine toString wo ich gerne an der stelle wo foo steht den Wert von foo einfügen würde um es auf der Konsole dann auszugeben.

Java:
public String toString(){
        return nummer + ", " +foo +", " +bezeichnung + ", " +lagerbestand + " auf Lager";
    }

Sprich ich will auf der Konsole folgendes erreichen:
123, TRXSCHRB01236, TorxSchrauben 6x35, 0 auf Lager

aber statt TRXSCHRB01236 bekomm ich immer null.
Ich seh den Wald vor lauter Bäumen glaub ich nicht mehr, hänge jetzt schon seit Vormittag dran und langsam lässt die Konzentration nach. Also bitte nicht böse sein wegen dummen Fehlern
😳
 
Das Problem ist nicht in der Methode "erzeugeKurzbezeichnung", sondern, dass du sie nirgends aufrufst.

Setze einmal folgende Zeile
Java:
kurzbezeichnung = erzeugeKurzbezeichnung(nummer, bezeichnung);
als letzte Zeile in den Konstruktor (Zeile 13).

Dann probier das Programm noch einmal aus.
Um das ganze dann sicher zu machen, musst du in allen Settern, die die Nummer und die Bezeichnung ändern, die Kurzbezeichnung neu ermitteln.
 
ok super genial! hat funktioniert danke dir!!! : D
allerdings hab ich noch n kleines problem mit meinem JUnit Test.
Habe auf der Konsole exakt die Ausgabe die vorgeschrieben ist.
allerdings läuft der letze Test nicht grün durch, bekomme immer die Fehlermeldung:
expected;<SCHLS[SCH3408A]> but was:<SCHLS[CHR34089]>
 
EDIT:

Habe das Projekt/Testat eingereicht, und wurde auch schon vom Bot kontrolliert und es hat bestanden 😀

Vielen vielen vielen dank an alle die mir geholfen haben, hätte es vermutlich sonst nicht hinbekommen.
@Dompteur, dir noch mal ein RIESEN Dankeschön, du hast mir wirklich unheimlich gut geholfen!! 🙂🙂
 

Neue Themen


Zurück
Oben