Problem mit C Programmierung



  • hi

    Sorry wegen meiner Fehler, kann wohl besser Programmieren als Schreiben.
    Natürlich heisst es lernen, aber deswegen musst du nicht vom Thema ablenken. 😃

    Ja wir sollten vieleicht noch wissen wie es dan bei N=5, N=6 usw. aussieht.
    Dan könnte ich dir auch weiterhelfen .Habe einfach zu wenig Informationen für dass was du da machen möchtest.
    Und ob du es mit for(;;), oder while(;;) schleifen löst ist eigentlich völlig egal.

    gr* lb



  • n=5

    _____#
    ____###
    ___#####
    __#######
    _#########
    __#######
    ___#####
    ____###
    _____#

    n=6

    ______#
    _____###
    ____#####
    ___#######
    __#########
    _###########
    __#########
    ___#######
    ____#####
    _____###
    ______#

    er muss für jedes beliebige n das man eingibt das passende rautenmuster anzeigen.
    wobei mir klar ist, wie ich die einzelnen muster ausgebe, ich aber leider nicht darauf komme welchen allgemeinen algorithmus ich anwenden kann.



  • Dein erstes Muster ist ganz anders, da sind Leerzeichen zwischen den Rauten. In Zukunft musst du da genauer werden, aber na ja...

    Überleg doch bitte einfach mal, wo du in den verschiedenen Muster Gesetzmäßigkeiten entdeckst. Dann kommst du auch ganz leicht auf einen Ablauf, den du in einer Schleife (oder mehreren) formulieren kannst.

    Ich mach mal den Anfang:

    wenn n=5, dann

    - muss ich in Zeile 1 5 Leerzeichen drucken, im Anschluss eine Raute
    - muss ich in Zeile 2 4 Leerzeichen drucken, im Anschluss 3 Rauten
    - muss ich in Zeile 3 3 Leerzeichen drucken, im Anschluss 5 Rauten
    ...
    Nach der Hälfte des Musters (immer nach n Durchläufen) muss ich den Ablauf umkehren
    ...

    Fällt dir was auf? Siehst du, was rauf- und was runtergezählt werden muss? Kannst du nun diese klaren Sätze als Programmcode formulieren (wie genau, kannst du dir aussuchen, es muss keine for-Schleife dabei sein, wenn du damit noch Schwierigkeiten hast) und schon mal die erste Hälfte des Musters damit verwirklichen?



  • #include <stdio.h> 
    
    int main() 
    { 
        int n, i, j ,k, m, x; 
        printf("value of n= "); 
    
        scanf("%d",&n);
        printf("\n");    ;
    
        for (i = 1, m = n, x = n; m <= n; x--)
        {
            for (j = 0; j < m; j++)
                printf(" ");
            for (k = i; k; k--)
                printf("#");
            printf("\n");
            if (x > 0) { m--; i += 2; }
            else       { m++; i -= 2; }
        }
    }
    

    😉



  • int main()
    {
        int n, i;
        printf("value of n= ");
    
        scanf("%d",&n);
        printf("\n");
    
        for (i = 1; i<2*n; i++)
        {
            int s = abs (n-i);
            while(s--)
                printf (" ");
            while (s++ < 2*(n-abs(n-i)-1))
                printf ("#");
            printf("\n");
        }
    }
    

    :p



  • Es ist ein wenig C++ drin, aber dafür ist es nicht falsch.

    #include <cstdio>
    #include <algorithm>
    int main()
    {
    	printf("value of n= ");
    	int n;
    	scanf("%d",&n);
    	putchar('\n');
    
    	for (int y=1;y<2*n;++y) {
    		int einrueckung=std::abs(y-n);
    		for (int x=0;x<=einrueckung;++x)
    			putchar('_');
    		for (int x=0;x<2*(n-einrueckung)-1;++x)
    			putchar('#');
    		putchar('\n');
    	}
    }
    


  • volkard schrieb:

    Es ist ein wenig C++ drin

    dann lösch doch das blöde std vor dem abs weg. in c++ geht's, glaub ich, sogar auch ohne.
    🙂



  • ;fricky schrieb:

    volkard schrieb:

    Es ist ein wenig C++ drin

    dann lösch doch das blöde std vor dem abs weg. in c++ geht's, glaub ich, sogar auch ohne.
    🙂

    hast recht. das weglassen des blöden std ist mir aus versehen passiert, weil ich im C-Forum gerade bin.

    #include <cstdio>
    #include <algorithm>
    int main()
    {
    	std::printf("value of n= ");
    	int n;
    	std::scanf("%d",&n);
    	std::putchar('\n');
    
    	for (int y=1;y<2*n;++y) {
    		int einrueckung=std::abs(y-n);
    		for (int x=0;x<=einrueckung;++x)
    			std::putchar('_');
    		for (int x=0;x<2*(n-einrueckung)-1;++x)
    			std::putchar('#');
    		std::putchar('\n');
    	}
    }
    

    Man kann sich denken, wie das in C aussähe.



  • der wahre c++ könner verwendet etwa:

    #ifdef __cplusplus
    using namespace std;
    #endif
    

    ^^um die tasten zu schonen. sowas ähnliches sieht man in jedem c++ tutorial auf der ersten seite.
    🙂



  • Und schon hagelt's wieder Komplettlösungen, klasse, Lerneffekt garantiert... 🙄

    Zusätzlich zum FAQ-Beitrag "Du brauchst Hilfe?" fordere ich "Du willst helfen?".



  • _matze schrieb:

    Zusätzlich zum FAQ-Beitrag "Du brauchst Hilfe?" fordere ich "Du willst helfen?".

    ^^schreib doch einen.
    🙂



  • _matze schrieb:

    Und schon hagelt's wieder Komplettlösungen, klasse, Lerneffekt garantiert... 🙄

    Ich habe keine Bedenken, daß kindlpat eine Chance gehabt hätte, das hinzukriegen. An dieser Aufgabe war nichts zu lernen. Er muß ein paar Seiten zurückblättern und die einfacheren Schleifen nochmal üben.

    Und bis dahin spicht nichts dagegen, anhand dieser Aufgabenstellung verschiedene Stilrichtungen gegenüberzustellen.



  • volkard schrieb:

    Ich habe keine Bedenken, daß kindlpat eine Chance gehabt hätte, das hinzukriegen. An dieser Aufgabe war nichts zu lernen. Er muß ein paar Seiten zurückblättern und die einfacheren Schleifen nochmal üben.

    ausserdem wird er sich die geposteten vorschläge anschauen und wenn er sie verstanden hat, hat er ganz nebenbei auch was gelernt.
    🙂



  • ;fricky schrieb:

    ausserdem wird er sich die geposteten vorschläge anschauen und wenn er sie verstanden hat, hat er ganz nebenbei auch was gelernt.
    🙂

    Bestenfalls. Ich habe von ihm keine eigene Zeile Code zu sehen bekommen und seine Einlassung, die for- Schleife nicht zu verstehen, deutet darauf hin, daß er sich gar nichts selbst erarbeiten mag (kann auch ein Mißverständnis sein und alle waren wieder mal zu schnell zur Hand).

    Ob es pädagogisch sinnvoll ist, solche "Lernenden" mit einer "C&P- Lösung" zu versorgen, kann man ganz klar mit "nein" beantworten, da geh' ich mit _matze absolut konform.

    Allerdings verstehe ich auch den Reiz, den solche "Fingerübungen" auf die versierteren Forumsbesucher ausüben, die sich dann den "fastest & most tricky"- Wettbewerb liefern.

    Irgendwo sollte man schon sagen, daß der OP wenigstens ein paar Zeilen vorlegen soll, bevor man ihm die Tastatur entreißt und mal zeigt, wie zu coden ist, besser wäre es, ihn zu einer eigenen Lösung zu führen.



  • pointercrash() schrieb:

    Ob es pädagogisch sinnvoll ist, solche "Lernenden" mit einer "C&P- Lösung" zu versorgen, kann man ganz klar mit "nein" beantworten, da geh' ich mit _matze absolut konform.

    Aha. Beweise das bitte.



  • pointercrash() schrieb:

    und seine Einlassung, die for- Schleife nicht zu verstehen, deutet darauf hin, daß er sich gar nichts selbst erarbeiten mag

    schleifen braucht man nicht dazu:

    int n;
    
    void spaces (int r)
    {
      if (r)
        spaces (r-1);
      putchar ('_');
    }
    
    void numsign (int r)
    {
      if (r)
        numsign (r-1);
      putchar ('#');
    }
    
    void line (int i)
    {
      int p;
      spaces (n-i);
      numsign (i*2-2);
      puts("");
    }
    
    void top (int r)
    {
      if (r>1)
        top (r-1);
      line(r);
    }
    
    void bottom (int r)
    {
      line (r-1);
      if (r>2)
        bottom (r-1);
    }
    
    int main()
    {
      printf("value if n= ");
    
      scanf("%d",&n);
      printf("\n");
    
      top (n);
      bottom(n);
    }
    

    🤡



  • volkard schrieb:

    Aha. Beweise das bitte.

    Daß durch reines Abpinseln wenig bis nichts gelernt wird, könnte Dir auch ohne Grundlagen der Pädagogik einleuchten.

    Davon abgesehen habe ich in den 90ern drei Semester lang Controllertechnik in einer Technikerschule gegeben. Die "Och, kannste mir das mal kopieren"-Typen aus dem Praktikum hatten in den Prüfungen immer die höchsten Durchfallraten (auch dank aufgeflogener Unterschleifversuche).

    LXL schrieb:

    schleifen braucht man nicht dazu: 🤡

    Und noch ein quick&tricky- Hack. 😉

    Was kindlpat daraus wohl lernen wird?



  • Die Lösung von LXL ist aber sehr interessant... muss ich mir mal in Ruhe ansehn. 😮



  • Genmutant schrieb:

    Die Lösung von LXL ist aber sehr interessant... muss ich mir mal in Ruhe ansehn.

    der obere teil lässt sich noch etwas runterkürzen:

    // anstatt spaces und numsign
    void character (int r, int c)
    {
      if (r)
        character (r-1, c);
      putchar (c);
    }
    
    ...
    

    🙂



  • pointercrash() schrieb:

    volkard schrieb:

    Aha. Beweise das bitte.

    Daß durch reines Abpinseln wenig bis nichts gelernt wird, könnte Dir auch ohne Grundlagen der Pädagogik einleuchten.

    Es trifft hier nicht zu, daß das einen Unterschied machen würde. Und was hat das bitte mit Pädagogik zu tun?


Anmelden zum Antworten