Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten


#include <stdio.h>

#include <stdlib.h>


int main(void) {

	char *wort; 

	int liste[100]; 

	int i=0;

	int ende=0;


	for(i=0;i<100;i++) {

		liste[i]=0; 

	}

	i=0;

	while(ende==0){

// habs auf 5 eingaben beschränkt... zum testen

		if(i>4){ 

			ende=1; 

		}else{

			fgets(wort,25,stdin); 

			printf("eingabe: %s\n",wort);

			if(liste[i]==0){

// -1 weil der das enter als zeichen mitzählt (also nehm ich an)

				liste[i]=strlen(wort)-1;

				i++;

			}else{

				i++;

			}

		}

	}


	for(i=0;i<100;i++) {

		if(liste[i]==0){break;}

		printf("liste: %d\n",liste[i]);

	}

}

^^ der geht

  • Antworten 51
  • Ansichten 9.7k
  • Erstellt
  • Letzte Antwort

Top-Poster in diesem Thema

kann ich mal deinen quell text sehen

du scheinst ein paar schreib fehler gemacht zu haben

also ich hab hier nen lauffähiges programm ... und da wird nix unkontroliert geschrieben ,... ich beleg in dem fall sogar mehr speicher als benötigt... aber es sollte ja net dynamisch werden


#include <stdio.h>

#include <stdlib.h>


int main(void) {

	char wort[25]; 

	int liste[100]; 

	int i=0;

	int ende=0;


	for(i=0;i<100;i++) {

		liste[i]=0; 

	}

	i=0;

	while(ende==0){

// habs auf 5 eingaben beschränkt... zum testen

		if(i>4){ 

			ende=1; 

		}else{

			fgets(wort,25,stdin); 

			printf("eingabe: %s\n",wort);

			if(liste[i]==0){

// -1 weil der das enter als zeichen mitzählt (also nehm ich an)

				liste[i]=strlen(wort)-1;

				i++;

			}else{

				i++;

			}

		}

	}


	for(i=0;i<100;i++) {

		if(liste[i]==0){break;}

		printf("liste: %d\n",liste[i]);

	}

}

dann halt so ... was mich wundert is dann nur das er bei 25 zeichen nur 23 erkennt... also ka an was das liegt...

Also ich hab mal wieder bissel im INet rumgeschaut un hab mir da nen anfang zusammen gebastelt ich hoff ja ma das er nun so einigermassen stimmt. Wäre lieb wenn ihr ma drüber schauen könntet. Dacht mir bevor ich da nun weiter bastel un es jetzt schon falsch is frag ich lieber ma nach.

#include <stdio.h>

#define IN 1

#define OUT 0

#define Maxhist 15

#define Maxword 11

void main()

{

int iEingabe, iEingabe2, nc, state;

int langeb;

int maxvalue;

int uberlaufe;

int wl[Maxword];

state = OUT;

nc = 0;

uberlaufe = 0;

while (getchar() != 'A')

{

if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')

{

state = OUT;

}

if (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

{

wl[iEingabe2]=0;

}

if (nc >0 && nc < Maxword)

{

++wl[nc];

}

}

if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')
iEingabe wird nirgends etwas zugewiesen. Daher ist es sinnlos, den Inhalt zu prüfen.

if (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

Sollte das mal eine for-Schleife werden?

Ich glaube, es bringt gar nichts, wenn du dir irgendwelche Sachen irgendwoher kopierst und dann daran rumfrickelst. Programmieren bedeutet nicht "Basteln bis es passt". So kommst du auf keinen grünen Zweig.

23/25

ich rate mal [25] -> 0..24 -1 '\n' = 23 +0

zu dir zicke ^^

welche aufgabe soll dein wuell texteigentlich erfüllen

ausserdem is der überhaupt windows kompatibel scheint aus nem linux board zu sein spekulier ich jetzt mal // aber egal

wenn du dem ganzen geposte aufmerksam gefolgt bist müsstest du jetzt ohne weiteres eine lösung für dein problem zusammen kopieren können

andern falls würd ich an deiner stell von dem ausgehen was du bereits kennst also die einfachen funktionen und nochmal anfangen ohne im internet sachen zu kopiern die dir noch verschlossen sind

geh rückwärts statt vorwärts

realisiere die eigentliche aufgabe (die ich am anfang selber nicht so richtig verstanden hab)

dann bilde die teilprozesse (also die eigentlichen arbeitsschritte)

zB: (auf die lösung bezogen die im grunde genommen schon fertig ist)

die eingabe eines wortes // könnte eine ganz einfache funktion sein ^^

auswerten der daten // also prüfen der wortlänge

speichern der information // die anzahl der buschstaben ausgeben

ausgabe des ergebnis // die liste ausgeben

und dann überleg ob die einteilung der arbeitsschritte so funktioniert

und dann wie du die einzelnen teile umsetzen kannst

aber nur mit den mitteln die du schon kennst und deren aufgabe du verstehst

hi,

kan man das mit fgets oder scanf machen? geht bestimmt, aber dann muss ich doch den string untersuchen ob kein whitespace drin ist oder?

diese funktionen lesen doch beide bis zu einem \n wenn ich mich recht entsinne.

mein ansatz wäre zeichenweise einlesen

dabei die buchstaben(eingabe) mitzählen solange bis ein lerrzeichen ein return oder tab oder ähnliches(also was ein wort unterbricht) eingegeben wird.

und dann so in dem int array speichern wie klotkopp es schon sagte

nur ne idee...

gruß

fgets liest bis zum ersten Zeilenumbruch ein, scanf bis zum ersten Leerzeichen.

Damit aber nicht mehr eingelesen wird wie in das Array passt sollte man auch hier die Länge begrenzen. Also anstatt


char szString[512];
scanf("%s",szString);
[/PHP]

so

[PHP]
char szString[512];
scanf("%511s",szString);

\n als 2 zeichen hatrte ich auch vermutet ...

'\n' is nur 1 zeichen

erntweder die zicke hat aufgegeben oder gekündigt ^^

wenn nicht kannste dir ja mal melden @psycho~zicke

mein ich doch ... vertippt

Hallo jungs!

ich hab weder aufgegeben noch gekündigt ;) lieg nur leider flach und mein inet zuhause ist heut irgendwie auch nicht wirklich begeistert vom funktionieren.

Bin ab morgen wieder auf der arbeit und werde noch einma versuchen diese doofe Aufgabe zu lösen.

Aber wie heißt es so schön, aller Anfang ist schwer.

Aber ich danke euch trotzdem sehr für eure hilfe!!!

Liebe grüße

die Zicke

Öhm, also als ich damals mit dem Programmieren angefangen habe, MUSSTE ich zur jeder Aufgabe ein Struktogramm erstellen. Wenigstens nen Pseudocode. Ich denke das sollte hier der erste Schritt sein. Denn so leid es mir tut, aber ich werde das Gefühl nicht los, das die Psycho~zicke gar nicht weiß wie sie das Problem angreifen soll. Wenn das klar ist, dann kann sie anfangen mal über die einzelnen Befehle nachzudenken. Also Psycho~zicke versuche doch bitte mal unabhängig von irgendwelchen Befehlen mit deinen Worten zu beschreiben wie du das Problem lösen würdest.

MVG

need-some-blood

PS:

Hier elementare Grundlagen

Nassi-Shneiderman-Diagramm - Wikipedia

Da auch

Pseudocode - Wikipedia

und der sowieso

Programmablaufplan - Wikipedia

Also ich hab das Programm jetzt mal so geschrieben. Es ist zwar nicht als Histogramm aber das kann man ja noch mal ändern. Leider gibt es mir die längen der Wörter immernoch nicht aus. Evt sieht ja jemand von euch den fehler.

Liebe grüße

die Zicke


#include <stdio.h>


#define Maxword 11

#define IN 1

#define OUT 0


void main()

{  

    // deklaration der Variablen

    int iEingabe, iEingabe2, nc, state;

    int langeb; 

    int maxvalue;

    int uberlaufe; 

    int wortl[Maxword];  


    // Zuordnung der Werte

    iEingabe = 0;

    state = OUT;    

    nc = 0;     // die Anzahl der Zeichen in einem Wort

    uberlaufe = 0;  // Anzahl der Wörter die länger sind als Maxword vorgibt


    // Wird solange ausgeführt bis (iEingabe = getchar () != 'A') zutrifft.

    while ((iEingabe = getchar()) != 'A')

    // Wenn iEingabe ein ' ' oder ein \n oder ein \t ist dann 

    if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')

    {

      state = OUT; // beenden wir das eingebene Wort durch state = OUT. Ansonsten 

                   // geht die Schleife weiter.

    }

    /* For gibt iEingabe2 den wert 0,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

    sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

    (++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

    for (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

    {

      wortl[iEingabe2] =0; // Die Wortlänge von iEingabe2 = 0

    }

    if (nc >0)  // wenn nc größer als 0 ist 

        if (nc < Maxword) // und wenn nc kleiner als Maxword ist

        {

          ++wortl[nc]; // dann schreib die Wortlänge von nc + 1 hin

        }

        else 

        {

          ++ uberlaufe; // ansonsten uberlaufe +1

          nc = 0;     // und nc = 0

        } 

        else if (state == OUT )  // wenn die oberen funktionen in frage kommen dann 

        {                        //beenden wir ein Wort und schreiben state == OUT 

         state = IN;        // wenn die oberen funktionen nicht in frage kommen dann 

         nc = 1;   // ist nc = 1

        }

        else 

        {

          ++nc;   // ansonsten +1 nc

        }

        maxvalue = 0;   // der maximale Wert der Wortlänge ist = 0

        /* For gibt iEingabe2 den wert 1,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

         *  sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

         *(++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

        for (iEingabe2 = 1; iEingabe2 < Maxword; ++iEingabe2)

          if (wortl[iEingabe2] > maxvalue) // Wenn die Wortlänge von iEingabe2 größer ist wie 

                                        // der maximale Wert der Wortlänge (maxvalue)

          maxvalue = wortl[iEingabe2];     // dann ist der maximale Wert der Wortlänge(macvalue) gleich der 

                                        // Wortlänge von iEingabe2

         /* For gibt iEingabe2 den wert 1,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

         *  sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

         *(++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

        for (iEingabe2 = 1;iEingabe2 < Maxword; ++iEingabe2)

        {

          // trifft die For schleife zu wird prinf ausgeführt.

          printf ("%5d - %5d: " , iEingabe2, wortl[iEingabe2]);

        }

        if (wortl[iEingabe2] > 0) // Wenn die Wortlänge von iEingabe2  größer ist als 0

        {

          langeb = 1;         // dann schreibt langeb = 1 (länge des Balken)

        }

        else  

          langeb = 0;       // ansonsten ist die länge des balken = 0 

        while (langeb > 0)  //  Wenn die länge des balken größer wie 0 

        {

          putchar('*');     // dann geb ein * aus.

        }

        if (uberlaufe > 0)  // wenn überläufe größer wie 0 sind 

        // dann gib aus "das sind ?? viele wörter, newlines, überläufe und Maxword"

        printf ("Es sind %d Wörter,%d\n, %d uberlaufe, %d Maxword");

        printf ("fertig"); // Beendet das Programm.

}

Das sieht IMHO viel zu kompliziert aus. Deine Kommentare an den for-Schleifen machen den Code nicht gerade lesbarer. Zudem bringen sie keine Zusatzinformationen. Sie beschreiben nur genau das, was die jeweilige Schleife tut, nicht den Grund oder Zweck.

Ich picke mal eine Stelle heraus:

while (langeb > 0)  //  Wenn die länge des balken größer wie 0 
{
putchar('*'); // dann geb ein * aus.
}[/code]

Dieser Code bewirkt, dass entweder gar nichts passiert, oder unendlich viele Sternchen ausgegeben werden, denn langeb wird in dieser Schleife nie verändert. Wenn es einmal größer als 0 ist, ist das eine Endlosschleife.

Ich bin in C schon etwas eingerostet, aber ich würde das so machen:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// Maximale Wortlänge
#define MAX_WORD_LENGTH 100
// Maximale Balkenlänge
#define MAX_BAR_LENGTH 70

int main()
{
int counter[MAX_WORD_LENGTH + 1];
int max_count = 1;
int longest = 1;
int i, j;
int len = 0;

memset( counter, 0, sizeof( counter ) );

for( ; ; )
{
int c = getchar();
if( c == EOF || c == 'A' || len > MAX_WORD_LENGTH )
{
break;
}

// Auf Whitespace (Leerzeichen, Tab, Zeilenumbruch) prüfen
if( isspace( c ) )
{
// Zähler für die aktuelle Wortlänge hochzählen
++counter[len];
// Länge zurücksetzen
len = 0;
}
else
{
++len;
}
}

// Länge des längsten Wortes und größte Anzahl ermitteln
for( i=1; i <= MAX_WORD_LENGTH; ++i )
{
if( counter[i] > max_count ) max_count = counter[i];
if( counter[i] > 0 ) longest = i;
}

// Histogramm ausgeben
for( i=1; i<=longest; ++i )
{
// Balkenlänge berechnen
int bar_length = counter[i] * MAX_BAR_LENGTH / max_count;

printf( "\n%3d (%3d) ", i, counter[i] );
for( j=0; j<bar_length; ++j )
{
putchar( '*' );
}
}
}[/code]

Fragen oder Verbesserungsvorschläge sind willkommen ;)

ich find meine eingabe ****tion besser ^^


#include <stdio.h> 

#include <conio.h> 


char* LeseString(char* s) 

 { 

 int i=0; 

 do 

  { 

  s[i]=char(getch()); 

  if(s[i]>char(31)) 

   { 

   printf("%c",s[i]); 

   i++; 

   } 

   else 

    if((s[i]==char(8))&&(i>0)) 

    { 

    i--; 

    gotoxy(wherex()-1,wherey()); 

    clreol(); 

    } 

  }while(s[i]!=char(13)); 

 return s; 

 } 

--------------------------------------------------------------------

HarHaarr, ich bin auch ein Mächtiger Pirat.

Ich habe den Schwertmeister von Melee Island besiegt!

aber jetzt muss ich erstmal zum mars

(wer hat sich eigentlich den mist mit den flugcodes ausgedacht)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.