# C Programmierung, Erklärung gesucht



## sky1234 (9. Januar 2013)

*C Programmierung, Erklärung gesucht*

Kann mir jemand erklären wie folgender Ausdruck funktioniert: Ich beschäftige mich damit auf
 welche Weise man ein Quadrat ausgeben kann. Dazu hab ich diesen Tipp bekommen aber ich verstehe das einfach nicht:
danke

void print_square (int *a, int n)
{
    int x, y;
    for (y=0; y<n; y++)
    {
        for (x=0;x<n;x++)
            printf ("%3d", a[y*n+x]);
        printf ("\n");
    }
}


----------



## chbdiablo (9. Januar 2013)

Was kannst du denn so in C programmieren? Ohne Vorkenntnise wirst du daraus eher nicht schlau, zumindest wie ein Array, ein Pointer und for-Schleifen funktionieren solltest du schon können. 
Hast dus denn mal ausprobiert ob das funktioniert?

edit: Also funktionieren tuts.


----------



## sky1234 (9. Januar 2013)

/Array, ein Pointer und for-Schleifen funktionieren /


das ist genau das was ich wissen wollte, Hilfe zur Selbsthilfe sozusagen


----------



## Onlinestate (9. Januar 2013)

Hm, also ich weiß ja jetzt echt nicht, was du unter "ein Quadrat ausgeben" verstehst, aber das hier ist aus meiner Sicht was anderes.
Ich hab jetzt grad keine C-Entwicklungsumgebung installiert, aber wie schön, dass man das ganze auch online machen kann: 
C code - 16 lines - codepad

Also a muss hier ein Array sein, welches die Zahlen enthält. Die Schleife geht von 0 bis n, schreibt darin die ersten n Zahlen raus und macht anschließend einen Zeilenumbruch.
Das blöde ist halt, dass dein Array mindestens n² groß sein muss.


----------



## Onlinestate (9. Januar 2013)

sky1234 schrieb:


> /Array, ein Pointer und for-Schleifen funktionieren /
> 
> 
> das ist genau das was ich wissen wollte, Hilfe zur Selbsthilfe sozusagen


 Achso, wenn du C lernen willst, dann les dir doch erstmal das hier durch: Galileo Computing :: C von A bis Z


----------



## sky1234 (9. Januar 2013)

danke erstmal, bin noch kompletter Anfänger


----------



## chbdiablo (9. Januar 2013)

```
void print_square (int *a, int n){          
     
     int x, y;

     for (y=0; y<n; y++){      
        
        for (x=0;x<n;x++)
        printf ("%3d", a[y*n+x]);
        printf ("\n");
        }
    } 


int main (void){
    
    int a[]={1,2,3,4,5,6,7,8,9};
    
    print_square(a,2);
    system("pause");
   
}
```
n definiert die Größe des Quadrats, in a stehen die Werte die dann zu sehen sind.
Mit dem Pointer *a wird das array übergeben, der zeigt dann auf die Adressen. 
Die for-Schleifen laufen je n-mal, also so oft wie das Quadrat groß ist.
a[y*n+x] gibt dann jeweils ein Zeichen aus.

edit: Code hier zu posten geht auch mit Tricks nicht wirklich gut 
edit 2: Danke an unten 

Wenn du keine Ahnung hast was ein Array ist, wie eine for-Schleife funktioniert oder so, dann ist das Beispiel auf jeden Fall noch zu schwierig für dich, mach erst mal was leichteres


----------



## MisterSmith (9. Januar 2013)

chbdiablo schrieb:


> edit: Code hier zu posten geht auch mit Tricks nicht wirklich gut




```
#include <stdio.h>
 
void print(int);
 
int main()
{
  int n;
 
  scanf("%d", &n);
 
  print(n);
 
  return 0;
}
 
void print(int n)
{
  static int c = 1;
 
  if (c == n+1)
    return;
 
  printf("%d\n", c);
  c++;
  print(n);
}
```
Hat aber erst in der Vorschau funktioniert, nachdem ich den Editor zum posten gewechselt habe.


----------



## Muckimann (9. Januar 2013)

Onlinestate schrieb:


> Achso, wenn du C lernen willst, dann les dir doch erstmal das hier durch: Galileo Computing :: C von A bis Z


 
Da das komplette Buch online verfügbar und somit kostenlos ist, ist das bestimmt ein guter Start wenn du mal reinschnuppern willst um dich probehalber mit C vertraut zu machen.
Allerdings hat mir mal n sehr erfahrener Programmier folgendes zu dem Buch (und nem anderen) gesagt


> Jo, sauber die beiden Bücher mit dem wohl schlechtesten Ruf "evar" rausgesucht


Also wenn du richtig einsteigeni willst, dann würd ich mich nicht auf dieses Buch stützen


----------



## sky1234 (10. Januar 2013)

Ok, ich will nächstes Semester Inf studieren. EIn Freund hat mir ein Programm gegeben, was die am ende vom ersten Semester können müssen.
Jetzt versuch ich halt daran herauszufinden, was dort eingebaut ist und was es bedeutet.

Ich hab bisher noch gar nicht programmiert. Aber fürs 1. Semester kanns ja nicht so schwer sein. Das soll mir als Vorverständnis erstmal reichen.

Ich dachte der drucken Befehl ist am einfachsten, daher kopier ich den mal hier rein.

Die ganze Datei hab ich am Ende eingefügt.
Also Array, Pointer &Schleife hab ich bisher....lol aber ich versteh bisher nur Bahnhof, ich weiß nichtmal was das mit dem Quadrat überhaupt soll.

Was werden da für Nummern getestet?
Auf jedenfall wird ein Quadrat erzeugt, aber   s += a[y*n+x];
+= bedeutet ja    s=s+(a[y*n+x]) , kann mir vielleicht noch jemand verraten was dieser Ausdruck bedeutet?

edit: hab grad eine Zahl eingegeben und jetzt ist die CPU auf 100%, sonst passiert nix, also funktioniert es nicht, aber jetzt weiß ich immerhin , oder auch nicht, was auf mich zukommt.....
Einzelne Zeilen kann man nachschlagen, aber die Gesamtidee da rein zubringen, scheint mir ziemlich heftig.

Kann man das in 1 Monat lernen (Vorbereitung, ich mein länger sollte man ja für ein Fach nicht brauchen oder?), oder ist das aussichtslos?

int pruefe_Quadrat (int *a, int n)
{
    int x, y, i, s;
    int sum = n*(n*n + 1) / 2;

    for (y = 0; y<n; y++)
    {
        s = 0;
        for (x=0; x<n; x++)
            s += a[y*n+x];
        if (sum != s)
            return 0;
    }
    for (x = 0; x<n; x++)
    {
        s = 0;
        for (y=0; y<n; y++)
            s += a[y*n+x];
        if (sum != s)
            return 0;
    }

    s = 0;
    for (i=0; i<n; i++)
        s += a[i*n+i];
    if (s != sum)
        return 0;


    s = 0;
    for (i=0; i<n; i++)
        s += a[(n-i-1)*n+i];
    if (s != sum)
        return 0;
    return 1;
}


----------



## chbdiablo (10. Januar 2013)

Du lernst das von Anfang an im 1. Semester, da jetzt direkt mit solchen Sachen anzufangen hilft dir nicht. Wenn du wirklich schon lernen willst, dann mach das von Anfang an, mit einem Buch oder Tutorial, wo C schrittweise eingeführt und erläutert wird.

a[] ist ein Array, die Zahl in der eckigen Klammer bestimmt beim Aufruf welches Element daraus ausgewählt wird, also z.B. a[3] ist eben das, was an der 4. Stelle des Arrays steht.

Aber wie schon gesagt, bevor du dich mit so einem Beispiel beschäftigst, solltest du erst mal von Anfang an lernen, was Arrays sind, wie eine for-schleife funktioniert usw.


----------



## MisterSmith (10. Januar 2013)

chbdiablo schrieb:


> a[] ist ein Array, die Zahl in der eckigen Klammer bestimmt beim Aufruf welches Element daraus ausgewählt wird, also z.B. a[3] ist eben das, was an der 4. Stelle des Arrays steht.


 Man sollte vielleicht auch noch zum besseren Verständnis erwähnen, dass a[0] die erste Stelle ist und deshalb a[3] die vierte und nicht die dritte.


----------

