DNA Aufgabe in Englisch!



  • 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



  • Ok danke! Habe jetzt folgendes geschrieben mit Hilfe von Buechern und google:
    Bekomme bei der Ausgabe noch Fehler. Muss jetzt leider die BIB verlassen, deshalb mache ich es kurz. Danke CJosef fuer dein Code. Werde ich spaeter genauer unter die lupe nehmen.

    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    #include<process.h>
    
    //Structure declaration for the node
    struct node{
    int info;
    struct node *link;
    }*start;
    
    //This function will create a new linked list
    void Create_List(int data)
    {
    struct node *q,*tmp;
    
    //Dynamic memory is been allocated for a node
    tmp= (struct node*)malloc(sizeof(struct node));
    tmp->info=data;
    tmp->link=NULL;
    if(start==NULL)
    /*If list is empty*/
    start=tmp;
    else{
    /*Element inserted at the end*/
    q=start;
    while(q->link!=NULL)
    q=q->link;
    q->link=tmp;
    }
    }/*End of create_list()*/
    
    //This function will add new element at the beginning of the linked list
     void AddAtBeg(int data){
     struct node *tmp;
     tmp=(struct node*)malloc(sizeof(struct node));
     tmp->info=data;
     tmp->link=start;
     start=tmp;
     }/*End of addatbeg()*/
    
     //This function will display all the element(s) in the linked list
     void Display(){
     struct node *q;
     if(start == NULL){
     printf ("\n\nList is empty");
     return;
     }
     q=start;
     printf("\n\nList is : ");
     while(q!=NULL){
     printf ("%d ", q->info);
     q=q->link;
     }
     printf("\n");
     getch();
     }/*End of display() */
    
     //Function to count the number of nodes in the linked list
     void Count(){
     struct node *q=start;
     int cnt=0;
     while(q!=NULL){
     q=q->link;
     cnt++;
     }
     printf ("Number of elements are %d\n",cnt);
     getch();
     }/*End of count()*/
    
     void main(){
     int choice,n,m,position,i;
     start=NULL;
     while(1){
     clrscr();
     printf ("1.Create List\n");
     printf ("2.Add at beginning\n");
     printf ("3.Display\n");
     printf ("4.Count\n");
     printf ("5.Quit\n");
     printf ("\nEnter your choice:");
     scanf("%d",&choice);
     switch (choice){
    
     case 1:printf ("\n\nHow many nodes you want:");
     scanf ("%d",&n);
     for(i=0; i<n; i++)
     {
            printf("\nEnter the element:");
            scanf("%d", &m);
            Create_List(m);
     }
     break;
     case 2:
            printf("\nEnter the element:");
            scanf("%c",&m);
            AddATBeg(m);
            break;
     case 3:
            Display();
            break;
     case 4:
            Count(0);
            break;
     case 5:
            exit(0);
     default:
            printf("\nWrong choice, try again");
                    } //End of switch
               }//End of while
    
     }//End of main
    


  • Nettes Lob von CJosef. Das baut mich auf.

    Nur der Programmansatz (in den Tiefen des Internets gefunen) erschreckt mich doch etwas.

    1. Hoffentlich weiß machupicchu, dass die amerikanische Zählung anders als die deutsche Zählung ist. Billionen sind dann zum Glück nur noch Milliarden. Das wird ihn sicher trösten.

    2. Er will also jeden einzelnen Buchstaben über ein Menü von vorn an eine Liste einfügen. Dann muss er diese ganzen 6 Milliarden Zeichen erst einmal bis ans Ende durchlesen, um von hinten anzufügen, schließlich soll die Liste das Gen richtig herum abbilden.

    3. Meine Berechnung des Speicherbedarfs stimmt natürlich nicht, da machupicchu vorsichtshalber 2 Bytes pro Zeichen benutzt. Hoffentlich ist sein Rechner groß genug.

    4. machupicchu erwartet offensichtlich, dass CJosef ihm sein Programm auf dem Silbertablett serviert. Da habe ich aber schon andere Hinweise hier gelesen: Anregungen zum Selberlösen, konkrete Probleme usw.

    Wenn ich mir so vorstelle, wie viele Zeichen er zum Testen immer wieder von vorn (oha, natürlich von hinten) eingibt, dann wird das nichts mit der Übung. Daher noch einmal mein dringender Rat:

    Die Beispielzeichenkette des Profs einem char * zuweisen. Diese Zeichenkette in einer Schleife abarbeiten und zeichenweise an eine lineare Liste von hinten anfügen. Dazu sollte er einen Kopf- und einen Schwanzzeiger auf die Liste pflegen, um das Anhängen zu beschleunigen (sonst müsste er jedes Mal durch die Liste laufen).

    Erst dann fängt die eigentliche Aufgabenstellung an.


Anmelden zum Antworten