C mehrere Übergabeparameter

Hallo Habo , ich sitze gerade für die uni an einer kleinen Programmieraufgabe.
Ziel ist es Werte aus einer *.dat Datei einzulesen, auszugeben und entsprechend zu verarbeiten. Das einlesen und ausgeben der Werte funktioniert soweit auch ganz prima!
In der *.dat sind Werte im Bereich - / + vorhanden. Ich soll eine Funktion schreiben, die die negativen Werte, positiven Werte und die Null erkennt und die Anzahl zurück gibt.


Der Prof hat folgenden Funktionsaufruf vorausgesetzt :

void signs (int werte[], int i, int anz_pos, int anz_null, int anz_negativ)

int werte[] ist mein Array mit den einzelnen Werten aus der *.dat
int i ist die Anzahl der Werte aus der *.dat (35-Zahlen)
anz_pos sind soll die Anzahl der positiven Werte werden
anz_neg .... negative Werte
anz_null halt die Nullen.

Jetzt habe ich gerade irgendwie ein Problem :

Im Hauptprogramm lese ich quasi nur die Werte ein siehe Quellcode.
Jetzt muss ich der Funktion signs aber auch direkt Werte für die anz_pos,anz_neg und anz_null übergeben oder verstehe ich das falsch?

Wir sind gerade beim Thema Zeiger, die brauche ich ja um mehrere Werte quasi überall verfügbar zu machen, weil eine Funktion nicht soviele Parameter zurückgeben kann.

Ich hab bis jetzt folgendes geschrieben :

Code:
#include <stdio.h>
void ausgeben (int werte[], int i)
{
int y=0, t=0;
  for(y=0;y<i-1;y++)
  {
  printf("%4i", werte[y]);
  t++;
    if(t==7)
    {
    printf("\n");
    t=0;
    }
  }
}

void signs (int werte[], int i, int *anz_pos, int *anz_null, int *anz_negativ)
{
int a=0;
  for(a=0;a<i-1;a++)
  {
    if(werte[a]==0)
    {
    *anz_null = *anz_null +1;
    }
  }


}
int main()
{
FILE *datei;

int werte[100];

int i=0;

if((datei =fopen("werte.dat" , "r")) ==NULL)
{
printf("Fehler!\n");
}
else
{
  while(!feof(datei))
  {
  fscanf(datei, "%d", &werte[i]);
  i++;
  }
}
fclose(datei);

ausgeben(werte,i);
signs(werte,i);

return 0;

Bei der Funktion signs bin ich mir noch nicht ganz sicher, ob ich dass so realisieren kann.
Ich muss im Prinzip ja nur prüfen ob die Zahl ==0 , Zahl <0 oder Zahl > 0 ist.
Kann man das so machen?

Hat irgendwer hilfreiche Tipps zur Lösung meines Problems?

LG,
weau
 
Code:
#include <stdio.h>
void ausgeben (int werte[], int i)
{
int y=0, t=0;
  for(y=0;y<i-1;y++)
  {
  printf("%4i", werte[y]);
  t++;
    if(t==7)
    {
    printf("\n");
    t=0;
    }
  }
}

void signs (int werte[], int i, int *anz_pos, int *anz_null, int *anz_negativ)
{
int a=0;
  for(a=0;a<i-1;a++)
  {
    if(werte[a]==0)
    {
    *anz_null = *anz_null +1;
    }
  }


}
int main()
{
FILE *datei;

int werte[100];

int i=0;

if((datei =fopen("werte.dat" , "r")) ==NULL)
{
printf("Fehler!\n");
}
else
{
  while(!feof(datei))
  {
  fscanf(datei, "%d", &werte[i]);
  i++;
  }
}
fclose(datei);

ausgeben(werte,i);
signs(werte,i);

return 0;

Ok, da du ja nach vorgaben arbeitest stellt sich die Frage ob die Funktion sign(..) die Werte nur zählen oder, gleich mit ausgeben soll.

Da du gerade mit Pointern und Referenzen arbeitest denke ich dass die Anzahl nicht gleich in der Funktion ausgegeben werden soll.
In dem Fall hier meine Lösung.

Code:
#include <stdio.h>
void ausgeben (int werte[], int i)
{
int y=0, t=0;
  for(y=0;y<i-1;y++)
  {
  printf("%4i", werte[y]);
  t++;
    if(t==7)
    {
    printf("\n");
    t=0;
    }
  }
}

void signs (int werte[], int i, int *count_pos, int *count_neg, int *count_zero)
{
int a=0;
  for(a=0;a<i-1;a++)
  {
    if(werte[a]==0)
       ++(*count_zero); 
    if(werte[a]<0)   
       ++(*count_neg);
    if(werte[a]>0) 
       ++(*count_pos);
  }


}
int main()
{
FILE *datei;
int count_pos = 0, count_neg = 0, count_zero = 0;
int werte[100];

int i=0;

if((datei =fopen("werte.dat" , "r")) ==NULL)
{
printf("Fehler!\n");
}
else
{
  while(!feof(datei))
  {
  fscanf(datei, "%d", &werte[i]);
  i++;
  }
}
fclose(datei);

ausgeben(werte,i);
signs(werte,i, &count_pos, &count_neg, &count_zero);
printf("Positive Zahlen:%d\nNegative Zahlen:%d\nNullen:%d\n", count_pos, count_net, count_zero);
return 0;

Du kannst natürlich auch Zeiger an signs übergeben, indem du davor
int *ptr1 = &count_pos, *ptr2 = &count_neg, *ptr3 = &count_zero;

und dann die funktion so aufrufst :
signs(werte,i, ptr1, ptr2, ptr3);

aber das ist einfach nur umständlich.
 
Also erst einmal vielen Dank prEs!
Mein Ansatz war ja soweit schon ganz gut oder? :P
Genau so ähnlich hatte ich mir das auch vorgestellt! Zeiger sind am Anfang was kompliziert wie ich finde, aber genau an solchen Beispielen wächst man natürlich.

Danke
 
Kein Problem.

Ich würde dir empfehlen in Zukunft überall wos geht Zeiger/Referenzen zu verwenden, damit du dich so schnell wie möglich daran gewöhnst.

Pointer sind einfach unumgägnlich, und ausserdem machen sie dir das Leben um einiges leichter , wenn du erstmal verstanden hast wie du sie einsetzen kannst.

Du könntest ja ab jetzt öfters anstatt das Ergebniss einer Funktion über denn Return-Wert zurückzugeben einfach einen Pointer als Argument der Funktion übergeben, auch wenns nicht umbedingt notwendig ist, aber sich lieber gleich daran gewöhnen, sonst wirst du wenn du erstmal mit Netzwerkprogrammierung und denn ganzen Sys-Calls arbeites vollkommen alt aussehen.
 
Zurück
Oben