DNA Aufgabe in Englisch!



  • Einfache Ein und Ausgaben bekomme ich noch hin, aber bring mal alles in einen HUT zusammen, dass muss ich noch ueben.

    Hier meine darstellung.

    Linked list
    @->‘A’ -> ‘T’ -> ‘T’ ->’G’

    Linked list array??
    @->[‘A’,1] -> [‘T’,2] -> [‘T’, 3]->[’G’,4]

    1. Eingaben einlesen....
    2. Node insert solange eingabe evt while schleife
    3. string length von 1 "kein plan"
    4. pruefen ob leer, "if next -> node !=NULL"
    5. Ausgabe der node

    Fuer singly list habe ich hier schon etwas aufgestellt:

    struct node
    {
    int info;
    struct node *next;
    }*start

    //code code....

    Werde spaeter noch etwas dazu proggen...! Bin fuer jede Hilfe dankbar!



  • machupicchu schrieb:

    Werde spaeter noch etwas dazu proggen...!

    mach das.
    wir gucken später wieder rein.
    bis dann!



  • Habe jetzt hier etwas geschrieben. Zuerst die structur, der start pointer zeigt auf diese, dann meine methode percentage. Ich lese meine eingaben ein, danach prüfe ich ob die eingaben gleich null sind, wenn ja dann habe ich meinen header gefunden ansonsten next solange nicht null und neuen node generieren. Ich weiß, beim einlesen habe ich da einen fehler, verstehe das mit der structur nicht so ganz....!

    #include<stdio.h>

    //structure declaration for the node
    struct node{

    char string[1];
    struct node *next;
    }*start

    void percentage(){
    scanf("%s", &string);
    if(start == NULL)
    start = header;
    else
    while(start->next != NULL)
    {
    start = start->next;
    start->next = header;

    }

    int main(){
    percentage();

    return 0;
    }



  • Beim Einlesen ist gut ... das kompiliert ja nicht mal!



  • Immer nur am meckern hier! 😃
    Wenn ich es richtig machen würde, dann würde ich hier ja nicht fragen logisch oder??? Also, ich habe wirklich kein plan!



  • Deine Strukturmember haben 0 Speicher.
    Da musst du dir etwas mit malloc oder calloc einfallen lassen.
    Oder eben mal nachlesen, wie sowas geht.
    🙂



  • Hallo,

    ich habe jetzt mein code geschrieben und das ist auch jetzt ausfuehrbar. Wenn ich aber z.B. die Buchstabe a eingebe, dann bekomme ich glaube ich die speicheradresse heraus. Ich muss ja eine stringlaenge von 1 haben char string[1]? und dann anschliessend diese als prozent ausgeben! Kann mir da jemand weiter helfen???

    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    
    struct Node
    {  
     int Data;  
     struct Node *Next;
    }*Head;
    
    void addList(int num)
    {  
      struct Node *temp;  
    
      temp=(struct Node *)malloc(sizeof(struct Node));  
      temp->Data = num;  
    
      if (Head == NULL)  
      {  
         //List is Empty  
         Head=temp;
         Head->Next=NULL;
      }  
      else
      {  
         temp->Next=Head;  
         Head=temp;  
      }  
    }
    
    void display()
    {  
      struct Node *current;
    
      current=Head;
    
      if(current==NULL)
      {  
         printf("\nList is Empty");  
      }  
      else  
      {  
          printf("\nElements in the List: ");  
          //traverse the entire linked list  
          while(current!=NULL)
          {  
              printf(" -> %d ",current->Data);
              current=current->Next;  
          }  
          printf("\n");  
      }  
    }
    
    int main(int argc, char *argv[]){
    
              int num;
              printf(" \nEnter a Number to insert in the List: ");  
              scanf("%d",&num);  
              addList(num);
              display();  
    
      fflush(stdin);
      getch();
      return 0;
    
     }
    

  • Mod

    Drück dich mal präzise aus! Einmal kurz Korrekturlesen hilft auch ungemein, damit andere dich nicht gleich als Schlamper abstempeln. Wie willst du einem Computer mitteilen können, was du möchtest, wenn mitdenkende Menschen schon Schwierigkeiten haben, dich zu verstehen?

    machupicchu schrieb:

    Wenn ich aber z.B. die Buchstabe a eingebe, dann bekomme ich glaube ich die speicheradresse heraus.

    Was bekommst du wo heraus? Welche andere Ausgabe erwartest du, wenn du scanf("%d") einen Buchstaben vorsetzt?

    Ich muss ja eine stringlaenge von 1 haben char string[1]?

    char?

    und dann anschliessend diese als prozent ausgeben!

    Welches dieses? Ich weiß es, weil ich den Thread von Anfang an verfolgt habe, aber dieses "dieses" ist nirgendwo in deinem Beitrag. Stattdessen scheint sich "dieses" auf das char string[1] zu beziehen, was völlig irreführend ist.



  • Hi! Also, die Frage habe ich oben aufgeschrieben und die ist doch eigentlich eindeutig. 🙄

    Wenn ich das Code ausfuehre, dass ich hier gepostet habe. Dies wird voerst compiliert und dann ausgefuehrt. Anschliessend oeffnet sich die console und werde aufgefordert etwas einzugeben. Wenn ich z.B. klein a eingebe, dann bekomme ich als Ausgabe die Zahl 30759612 heraus. Wenn ich aber Zahlenwerte z.B. 123 eingebe, dann erhalte ich auch 123. Ich moechte aber bei der Eingabe Buchstaben als Ausgabe erhalten?????



  • machupicchu schrieb:

    Ich moechte aber bei der Eingabe Buchstaben als Ausgabe erhalten?????

    Du weißt es also nicht? 🤡
    Einerseits fragst du nach einer Zahl

    " \nEnter a Number to insert in the List: "

    Andererseits willst du nen Buchstaben als Ausgabe.
    Mild formuliert ist das eine recht eigenwillige Form der Eingabe 🤡 😃
    Vielleicht hilft dir ja eine brauchbare Referenz, damit du dir klar wirst, was du möchtest. Guck mal nach format specifier
    http://www.cplusplus.com/reference/cstdio/scanf/



  • machupicchu schrieb:

    ?????

    Du verzettelst Dich. Niemand fordert von Dir, Millionen von Genom-Moleküle per Hand einzugeben - und mit scanf, fflush(stdin) usw. zu kämpfen. Lass die Liste automatisch erstellen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct GenomNode
    {
        char molecule[2];   // String braucht noch eine Abschlussnull
        struct GenomNode* next;
    } GenomNode;
    
    GenomNode* createGenomNodes (char genomstring[])
    {
        size_t i, len = strlen (genomstring);
        GenomNode* genomroot;
        GenomNode* genom;
    
        genomroot = (GenomNode*) calloc (1, sizeof(GenomNode));
        if (NULL == genomroot) return NULL;
    
        genom = genomroot;
        for (i=0; i<len; ++i)
        {
            genom->molecule[0] = genomstring[i]; // Abschlussnull brauchts nicht wg. calloc
            genom->next = (GenomNode*) calloc (1, sizeof(GenomNode));
            if (!genom->next) return NULL;
            genom = genom->next;
        }
    
        return genomroot;
    }
    
    void displayGenomNodes (GenomNode* genom)
    {
        puts ("  this   | m |   next");
        puts ("-----------------------");
        while (genom->next)
        {
            printf ("%08X | %s | %08X\n",genom,genom->molecule,genom->next);
            genom = genom->next;
        }
    }
    
    void freeGenomNodes (GenomNode* genom)
    {
        GenomNode* tmp;
        puts("");
        while (genom)
        {
            printf ("free (%08X)\n",genom);
            tmp = genom->next;
            free(genom);
            genom = tmp;
        }
    }
    
    int main (void)
    {
        GenomNode* genomroot = createGenomNodes ("ATATCGATCGATCG");
        if (NULL == genomroot)
        {
            puts ("Fehler bei createGenomeNodes()");
            freeGenomNodes(genomroot);
            return 1;
        }
    
        //Display
        displayGenomNodes (genomroot);
    
        // Free
        freeGenomNodes(genomroot);
    
        return 0;
    }
    

    Den weiteren von Dir zu erstellenden Funktionen übergibst Du dann genomroot - also den ersten Knoten der Liste - und klapperst die Liste wie in display() ab.

    viele grüße
    ralph



  • Memory leak @zeile 25
    :p



  • CJosef schrieb:

    Memory leak @zeile 25
    :p

    Ich lerne ja gern dazu: Wie denn?

    Edit: Ach, ich seh schon. So was Peinliches! 😡

    viele grüße
    ralph



  • Danke rkhb, aber leider ist das nicht was gefragt ist!

    Mal im ernst Leute, versteht irgendeiner von euch ueberhaupt die Frage oder soll ich es ins Deutsche uebersetzen?? Entweder ich kann es oder ich kann es nicht! Ich bin hier in einem Forum und nicht in einer Vorlesung. Ich erwarte Vorschlaege und Tipps in einem Forum. Die Frage ist gut gestellt und auch gut zu verstehen, auch mit Schulenglisch ;-).

    Ein Beispiel fuer die Leute die es noch extra erklaert bekommen haben moechten.

    Jemand moechte von mir wissen,,wie man in C ein halloworld Programm schreiben kann! Ich bin das Forum und sage zu ihm, du musst schon deine Frage praeziser stellen. Was ist HalloWorld oder guck doch mal in der Bibliothek nach. Da gibt es etwas ueber #Preprozessoren, aber vergiss den Editor nicht. Kaffee dazu waere auch noch gut und am besten noch eine pornozeitschrift, weil du keine zeit fuer eine freundin haben wirst. Am besten meldest du dich gleich in einem forum an und versoehnst dich mit anderen jungs. dann hast du das problem mit den frauen nicht mehr, weil du ja so oder so den ganzen tag im forum ueber pn deien sexuellen vorlieben mit den anderen austauschst.

    Zweites Beispiel:

    Ich moechte wissen, was 1kg birnen kosten und nicht 2kg aepfel.
    Verkaufer sagt daraufhin, ich habe bananen im angebot.

    I THINK IT MAKE THENSE OR?



  • machupicchu schrieb:

    I THINK IT MAKE THENSE OR?

    Also hier versagt mein Schulenglisch völlig. Ist das was Unanständiges? Ja bitte, übersetze doch mal den Text.

    viele grüße
    ralph



  • machupicchu schrieb:

    Danke rkhb, aber leider ist das nicht was gefragt ist!

    Mal im ernst Leute, versteht irgendeiner von euch ueberhaupt die Frage oder soll ich es ins Deutsche uebersetzen?? Entweder ich kann es oder ich kann es nicht! Ich bin hier in einem Forum und nicht in einer Vorlesung. Ich erwarte Vorschlaege und Tipps in einem Forum. Die Frage ist gut gestellt und auch gut zu verstehen, auch mit Schulenglisch ;-).

    Ein Beispiel fuer die Leute die es noch extra erklaert bekommen haben moechten.

    Jemand moechte von mir wissen,,wie man in C ein halloworld Programm schreiben kann! Ich bin das Forum und sage zu ihm, du musst schon deine Frage praeziser stellen. Was ist HalloWorld oder guck doch mal in der Bibliothek nach. Da gibt es etwas ueber #Preprozessoren, aber vergiss den Editor nicht. Kaffee dazu waere auch noch gut und am besten noch eine pornozeitschrift, weil du keine zeit fuer eine freundin haben wirst. Am besten meldest du dich gleich in einem forum an und versoehnst dich mit anderen jungs. dann hast du das problem mit den frauen nicht mehr, weil du ja so oder so den ganzen tag im forum ueber pn deien sexuellen vorlieben mit den anderen austauschst.

    Zweites Beispiel:

    Ich moechte wissen, was 1kg birnen kosten und nicht 2kg aepfel.
    Verkaufer sagt daraufhin, ich habe bananen im angebot.

    I THINK IT MAKE THENSE OR?

    Du bist echt putzig(ich muss mich schon sehr mäßigen, weil mir ein ganz anderes Wort auf der Zunge liegt :D).
    Würdest du das Programmieren lernen wollen, so würdest du dankbar den Code von rkhb studieren und du wüsstest wie man eine verkette Liste realisiert.
    Das was du willst ist jedoch eine Komplettlösung, ohne die eigene Grütze anstrengen und einen Finger krumm machen zu müssen.
    Nichts für ungut, das ist verständlich, du bekommst ja dafür Punkte.
    Und den Schein, aus dem hevorgeht, das du es kannst. 👍



  • Dann erklaer es doch mal! Dann werde ich es lernen! Die Loesung werde ich in ca. 2 Wochen erhalten, dann koennen wir ja vergleichen. Ich will ja nicht, dass Ihr meine Aufgaben macht, will ja auch etwas lernen. Ich habe das mittlerweile mit der Ausgabe geloest, musste nur die Integerwerte in char und %d mit %c ersetzen.

    Ich wollte hier niemanden angreifen, aber denkt mal nach. Man waere viel produktiver, wenn man mit Beispielen oder Tipps kommt. Warum das so ist und wie man es besser machen koennte. Alternativ ein Algorithmus oder ne kurze Anleitung.
    Dafuer ist doch das Forum gedacht. Ich programmiere jetzt mit C mittlerweile seit ca. 3 Wochen und muss die Aufgabe bis Anfang Dezember loesen und auch verstanden haben. Meint Ihr nicht???



  • Es erklären? Was ist "es"?
    Produktiver? Tipps?
    Das schwerste in dieser Aufgabe ist das Erzeugen einer verketteten Liste, das wurde dir bereits komplett abgenommen(der Rest der Aufgabe ist ein bisschen Zählen und Prozentrechnung, okay, vllt. findet das ja manch einer schwerer).
    Das ist dir nicht produktiv genug, nicht genug Tipps?
    Deine Arbeit wäre jetzt nur noch reines Nachvollziehen, wie die Liste funktioniert und den Code so zu erweitern, dass er die Aufgabe löst.
    Was außer deinen Punkten und einem regulär ungültigen Schein hättest du sonst davon, wenn dir die komplette Lösung auf dem silbernen Tablett präsentiert würde?



  • Vorsicht, die folgenden Anmerkungen könnten insbesondere für Anfänger schädlich sein!! Bei ersten Anzeichen von Unwohlsein das Lesen einstellen.

    Wnn ich die Aufgabe richtig verstehe, soll ein normaler String in eine einfach verkettete Liste umgewandelt werden. Damit haben wir pro Buchstaben mindestens 4+1 Byte (auf 64-bit Rechnern 8+1) (Zeiger plus Nutzlast von einem Buchstaben) zusätzlichen Speicherbedarf. Aber offensichtlich will der Aufgabensteller dies so, auch wenn es irre ist. Oder halt, er will verhindern, dass im Internet wohlbekannte Funktionen benutzt werden.

    Lineare Listen mit Zeigern zu programmieren und dann nicht einmal die Einlesefunktion von C zu kennen, stimmt natürlich die Mannschaft bedenklich, wenn nicht gar aggressiv, wie man leicht sieht.

    Ich würde dem Einsender vorschlagen, einen gewöhnlichen Text mit einigen Testbuchstaben (wie in der Aufgabenstellung) zu definieren und diesen dann zeichenweise in die verlangte lineare Liste umzuwandeln. Das spart Zeit und Nerven in der Testphase. Auch die dauernde Prüfung, ob Adenin, Guanin, Zytosin und Thymin richtig eingegeben wurde, entfällt erst einmal.

    Die erste Teilaufgabe ist eine Häufigkeitsanalyse. Hier würde ich ein Array mit vier Ganzzahlen für die Buchstaben vorschlagen.
    Dann wird die lineare Liste durchlaufen und das zum Buchstaben A,G,Z,T zugehörige Arrayelement inkrementiert.
    Dann kannst Du mit den vier Elementen alles mögliche machen, also Gesamtzahl, Prozentsatz usw. berechnen.

    Falls dann das Einlesen endlich geht, empfehle das Studium folgender Algorithmen:

    Die zweite Teilaufgabe ist die sog. Lauflängenkompression (RLE, run length encoding). (Wer suchet der findet!)

    Wenn Du dann schon dabei bist, dann kannst Du noch einen Vaterschaftstest bzw. einen Plagiatfinder programmieren. Hier geht es um den Vergleich zweier Zeichenketten (bzw. Deiner linearen Listen). Das Problem ist als

    Longest Common Substring oder auch
    Longest Common Subsequence (LCS) (Wer suchet der findet!)

    bekannt. Oder kurz erklärt, wie lang ist die längste Genkette, die in beiden Genomen vorkommt? Damit ist der Vater zu 99,999% zahlungspflichtig oder der Student hat das Programm sinnlos abgeschrieben.



  • Das ist ja toll das du dir die Mühe machst, die Aufgabe zu erklären.
    Laut der Aussage des Op versteht er sie jedoch bereits.
    Vllt. hilft ja noch eine Liste zur Übung:

    typedef struct tagDnaNode dna_node;
    
    struct tagDnaNode
    {
    	char dna[2];
    	dna_node* next;
    };
    
    dna_node* new_node ( char atgc )
    {
    	dna_node* p = calloc ( 1, sizeof ( dna_node ));
    	if ( NULL != p )
    			p->dna [ 0 ] = atgc;
    	return p;
    }
    
    void free_list ( dna_node* p )
    {
    	while ( p )
    	{
    		dna_node* curr = p;
    		p = p->next;
    		free ( curr );
    	}
    }
    
    void display_list ( dna_node* p )
    {
    	while ( p )
    		printf ( "%s", p->dna ), p = p->next;
    }
    
    int main ( void )
    {
    	char* s = "Hello World!"; // Hello World Gnom-Seekwenz! :D
    	unsigned molecules_count = 0;
    	dna_node *curr, *node, *plist;
    
    	plist = curr = new_node (*s++);
    	if ( NULL == plist )
    		return 0;
    	else
    		molecules_count++;
    
    	for ( ; *s; s++ )
    	{
    		if ( NULL == ( node = new_node ( *s )))
    		{
    			puts ( "Out of memory!" );
    			free_list ( plist );
    			plist = NULL;
    			break;
    		}
    		else
    		{
    			molecules_count++;
    			curr->next = node;
    			curr = node;
    		}
    	}
    
    	if ( NULL != plist )
    	{
    		printf ( "Displaying %u molecules: ", molecules_count );
    		display_list ( plist );
    		free_list ( plist );
    	}
    
    	return 0;
    }
    

    Das wären wieder Bananen, in grün.
    Einmal verstanden, lassen sie sich nahezu mühelos in Birnen konvertieren.
    :p


Anmelden zum Antworten