# [C] Zeilenumbruch nach 10 Zahlen



## spooner11235813 (29. Oktober 2010)

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.


----------



## kickerxy123 (29. Oktober 2010)

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:

```
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


----------



## spooner11235813 (29. Oktober 2010)

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


----------



## Bratkartoffel (29. Oktober 2010)

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


----------



## spooner11235813 (29. Oktober 2010)

```
#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");
}
```


----------



## spooner11235813 (29. Oktober 2010)

```
#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");
}
```


----------



## Bratkartoffel (29. Oktober 2010)

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:

```
#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


----------



## kickerxy123 (29. Oktober 2010)

```
#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;
}
```


----------



## spooner11235813 (29. Oktober 2010)

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?


----------



## Bratkartoffel (29. Oktober 2010)

Hi,

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


```
#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


----------



## Trulleberg (31. Oktober 2010)

Lasse in deiner while-Schleife einen zusätzlichen Zähler mitlaufen, der bei jedem 10. Durchlauf einen Zeilenumbruch erzeugt, z.B.

```
int z=0;
...
        while (ausgangszahl != 1)                                     
            {    
                if (ausgangszahl % 2 == 0)                           
                    {                     
                        ausgangszahl = ausgangszahl / 2;                
                        printf("%d ", ausgangszahl);
                    }
                else                                                
                    {                    
                        ausgangszahl = (3*ausgangszahl) + 1;
                        printf("%d ", ausgangszahl);         
                    }
                if( ++z%10 == 0 ) puts("");
        
            
            }
```


----------



## scsved (1. November 2010)

z=z+1

warum schreibt ihr da if(z % 10 ==0)

warum den modulo da benutzen langt  if(z==10) nicht?


----------



## scsved (1. November 2010)

und dieses puts("") ist das selbe wie printf("\n"); ?


----------



## sheel (1. November 2010)

scsved hat gesagt.:


> z=z+1
> 
> warum schreibt ihr da if(z % 10 ==0)
> 
> warum den modulo da benutzen langt  if(z==10) nicht?


 
Nein, z%10==0 stimmt nicht nur 10, sondern auch für 0 20 30 40...überall wo die Einerstelle 0 ist



scsved hat gesagt.:


> und dieses puts("") ist das selbe wie printf("\n"); ?


Macht das gleiche, ja.


----------



## scsved (1. November 2010)

ah ok hatte das so gemacht
z=z+1
if(z==10)
printf("\n");
z=0

aber eleganter find ich jetzt auch

if(++z%10==0)
put("");


----------



## sheel (1. November 2010)

Ich hoffe, das steht nicht so im Code
Im ersten Code fehlt bei Zeile 1 der Strichpunkt und beim if die {} Klammern un das printf und das z=0
Beim zweiten Code gehört statt put puts hin (s für string)


----------

