[C] Zeilenumbruch nach 10 Zahlen

S

spooner11235813

Hallo,
Ich soll ein programm schreiben in dem eine Zahl eingegeben werden soll und daraus folgende zahlenfolge erstellt:


Ich schau erst ob die zahl gerade oder ungerade ist.
wenn gereade: zahl =zahl/2
wenn ungerade: zahl= (zahl*3)+1
und das solange bis zahl <=1

Die Zahlen der Folge sind auf dem Bildschirm auszugeben und zwar so, dass je 10 Zahlen in einer Zeile stehen. Außerdem ist die Anzahl der Folgeglieder und die Summe über alle Glieder der Folge zu ermitteln und am Ende der Folge auf dem Bildschirm auszugeben.

Beispiel
soll dann so aussehen:


eingegebene zahl=11
11 34 17 52 26 13 40 20 10 5
16 8 4 2 1

Anzahl der Folgeglieder:
Summe:




Ich bin bis jetzt so weit das meine ausgabe so aussieht:
eingegebene zahl=11
11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

bekomme das mit dem zeilenumbruch aber einfach nicht hin.
 
Hallo Gast,
ohne zu sehen, wie du das bis dahin realisiert hast, ist es schwierig deine Frage zu beantworten.
Ich würde den output so verwirklichen:
C++:
for(unsigned short i = 0; i < elemente; i++)
{
      if(i%10==0) cout << "\n";
      cout << arr[i] << " ";
}
Setzt voraus, dass du die Werte zuvor in einem Array gespeichert hast.

Gruß,
kickerxy
 
Ich fange erst an mit dem Programmieren

bedingung ist aber das es in C geschrieben ist nur mit hilfe von schleifen.
Array ist nicht erlaubt:(
 
Hi,

in deiner Schleife für die Collatz-Folge lässt du einen Zähler mitlaufen. Bei jedem Durchgang der Schlefie prüfst du ob die Zahl Modulo 10 gleich 0 ist und gibst dann einen Zeilenumbruch aus (ähnlich wie bei kickerxy123)

Gruß
BK
 
C++:
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int ausgangszahl;

		do
			{
				printf("Gib eine beliebe positive Ganzahl kleiner 200 ein: ");   
				scanf("%d", &ausgangszahl);   
				if (ausgangszahl == 0)
					{
						break;
				    }
			}
		while ((ausgangszahl >= 200) || (ausgangszahl < 0));

		             

        printf("%d ", ausgangszahl);                               

        while (ausgangszahl != 1)                                     
			{ 	 
				if (ausgangszahl % 2 == 0)                           
					{				      
						ausgangszahl = ausgangszahl / 2;                
			            printf("%d ", ausgangszahl);
			        }
			    else                                                
					{                    
						ausgangszahl = (3*ausgangszahl) + 1;
						printf("%d ", ausgangszahl);		 
			        }
		
			
			}
	
    system("Pause");
}
 
C++:
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int ausgangszahl;

		do
			{
				printf("Gib eine beliebe positive Ganzahl kleiner 200 ein: ");   
				scanf("%d", &ausgangszahl);   
				if (ausgangszahl == 0)
					{
						break;
				    }
			}
		while ((ausgangszahl >= 200) || (ausgangszahl < 0));

		             

        printf("%d ", ausgangszahl);                               

        while (ausgangszahl != 1)                                     
			{ 	 
				if (ausgangszahl % 2 == 0)                           
					{				      
						ausgangszahl = ausgangszahl / 2;                
			            printf("%d ", ausgangszahl);
			        }
			    else                                                
					{                    
						ausgangszahl = (3*ausgangszahl) + 1;
						printf("%d ", ausgangszahl);		 
			        }
		
			
			}
	
    system("Pause");
}
 
Hi,

Dein Code ist leicht redundant und ich denke, dass sich die Collatzfolge sicherlich schöner über eine Funktion lösen lässt. Ob man hier auf einen iterativen oder rekursiven Ansatz ist einem selbst überlassen.

Mein Ansatz würde wie folgt aussehen:
C:
#include <stdio.h>

void doCollatz(int i) {
  unsigned long number = i;
  printf("%u ", number);

  int zaehler = 0;
  while(number > 1) {
    if((number & 1) == 1)
      number = (number * 3) + 1;
    else
      number >>= 1;

    if(++zaehler % 10 == 0) {
      zaehler = 0;
      puts("");
    }
    printf("%u ", number);
  }
}

int main(int argc, const char** argv) {
  if(argc == 2) doCollatz(atoi(argv[1]));
  else printf("Usage: %s <NUMBER>\n", *argv);

  return 0;
}

Das Programm erwartet als ersten Parameter die Zahl, von der ausgegangen werden soll.

Gruß
BK
 
Zuletzt bearbeitet:
C++:
#include <stdio.h>
#include <stdlib.h>

unsigned short g_zaehler = 0;  

void printOut(unsigned short zahl, unsigned short zahlenProReihe)
{
if(g_zaehler%zahlenProReihe==0)printf("\n");          
printf("%d ", zahl);
g_zaehler++;   
}

int main()
{
    float tmp;
    unsigned short ausgangszahl;
 
        do
            {
                printf("Gib eine beliebe positive Ganzahl kleiner 200 ein: ");   
                scanf("%f", &tmp);   
                if (tmp == 0)
                    {
                        break;
                    }
            }
        while (tmp != (int)tmp || (tmp >= 200) || (tmp < 0));
 
             
        ausgangszahl = (int)tmp;       
        printf("%d ", ausgangszahl); 
        printf("\n#####################################################################");                              
 
        while (ausgangszahl != 1)                                     
            {    
                if (ausgangszahl % 2 == 0)                           
                    {                     
                        ausgangszahl = ausgangszahl / 2;      
                        printOut(ausgangszahl, 10);
                    }
                else                                                
                    {                    
                        ausgangszahl = (3*ausgangszahl) + 1;
                        printOut(ausgangszahl, 10);
                    }
        
            
            }
    printf("\n#####################################################################\n");  
    system("Pause");
    return 0;
}
 
Vielen dank für deine mühe.

Das Problem ist wir handeln C Imperativ ab und ich darf nur das zur hilfe nehmen was wir bis jetzt behandelt haben.
Funktionen bis auf die main(ohne parameter) sind uns bis jetzt noch nicht bekannt und dürfen in dem Programm nicht benutzt werden.

Es soll nur mit schleifen geschrieben sein, das es dadurch redundant wird lässt sich nicht vermeiden:(

Ich dachte an eine verschachtelte for-schleife, geht das vielleicht damit?
 
Hi,

hört sich nach einer Aufgabe in der Schule an ;)
Nun ja, kopier dir einfach die Funktion in die main() rein :)

C:
#include <stdio.h>

int main(int argc, const char** argv) {
  if(argc != 2) {
    printf("Usage: %s <NUMBER>\n", *argv);
    return 1;
  }

  int arg = atoi(argv[1]);

  if(arg <= 0) {
    printf("Usage: %s <NUMBER>\n", *argv);
    return 1;
  }

  unsigned long long number = arg;
  printf("%u ", number);

  int zaehler = 0;
  while(number > 1) {
    if((number & 1) == 1)
      number = (number * 3) + 1;
    else
      number >>= 1;

    if(++zaehler % 10 == 0) {
      zaehler = 0;
      puts("");
    }
    printf("%u ", number);
  }

  return 0;
}

Gruß
BK
 
Zurück