Forum: Compiler & IDEs selektive Kopierfunktion für Arrays in C


von Mitch (Gast)


Lesenswert?

Schreiben Sie eine selektive Kopierfunktion für Arrays
Schreiben Sie eine Funktion namens copy welche die folgenden Parameter 
entgegen nimmt:

Zwei Integer Arrays
die Größe der beiden Arrays als Integer
Einen Schwellwert als Integer
Ihre Funktion soll die Werte des ersten Arrays in das zweite Array 
kopieren aber Werte die über dem gegebenen Schwellwert sind ignorieren

kann mir jemand helfen dabei

von A. S. (Gast)


Lesenswert?

Klar, gerne.
Wo haperts?
Was hast Du bisher?
Gibt es Begriffe oder Teile in der Aufgabe, die Du nicht verstehst?

von Paul (Gast)


Lesenswert?

Wo genau liegt das Problem?

von Dirk B. (dirkb2)


Lesenswert?

Du brauchst eine Schleife.

von Misel D. (Gast)


Lesenswert?

Ich habe

Sample Input:

42 2 3 7 23

und der

Sample Output:

2 3 7 23 0

habe Schwierigkeiten dabei die Funktion aufzustellen

von entscheidung (Gast)


Lesenswert?

Mitch oder Misel? entscheide dich.
Array auf Array kopieren ist klar?

von A. S. (Gast)


Lesenswert?

Misel D. schrieb:
> Sample Input:
> Sample Output:
Was ist das jetzt?

Wenn Du eine Aufgabenstellung hast, dann poste sie hier (Foto, 
Copy&Paste).

> habe Schwierigkeiten dabei die Funktion aufzustellen

Hast Du schon mal eine Funktion in C aufgestellt? Falls ja, poste sie 
hier.

Weisst Du was ein Array ist? Ein Parameter?

von Einer (Gast)


Lesenswert?

Misel D. schrieb:
> habe Schwierigkeiten dabei die Funktion aufzustellen

Na, wie schreibt man denn eine Funktion in C? Damit könntest Du anfangen 
und hier posten.

von Dirk B. (dirkb2)


Lesenswert?

Misel D. schrieb:
> habe Schwierigkeiten dabei die Funktion aufzustellen

Weißt du nicht, wie man in C eine Funktion definiert oder hapert es am 
Algorithmus?

von Rolf M. (rmagnus)


Lesenswert?

Misel D. schrieb:
> habe Schwierigkeiten dabei die Funktion aufzustellen

Welche Schwierigkeiten? Wenn man dir hier einfach eine Lösung 
hinschreibt, lernst du nichts. Also zeige deinen Ansatz oder stelle 
konkrete Fragen zu den Teilen, wo du nicht weiter kommst, dann kann man 
dir helfen.
Generell solltest du mit dem Funktionskopf anfangen. Wie muss er 
aussehen? Der Inhalt kommt dann danach.

PS: Die Aufgabe ist leider ziemlich unpräzise formuliert, aber das 
wundert mich nicht, wenn die von einem Lehrer kommt.

von Einer (Gast)


Lesenswert?

Schade, dass dieser Thread hierher verschoben wurde. Da wird der 
Fragesteller ihn nicht mehr finden.

Aber egal. Ich programmiere schon eine Weile nicht mehr in C, aber es 
war nicht schwer, die Aufgabe zu lösen:
1
#include <stdio.h>
2
3
void copy(int *s, int *d, int ss, int ds, int m)
4
{
5
    while (ss --&& ds)* s ++<= m?* d ++= *(s -1), ds --:0 ;
6
}
7
8
int main()
9
{
10
    int a[] = {42, 2, 3, 7, 23};
11
    int b[] = {0, 0, 0, 0, 0};
12
13
    copy(a, b, 5, 5, 33);
14
15
    for (int i = 0; i < 5; i++)
16
        printf("%d, ", b[i]);
17
18
    puts("");
19
}

Ich denke, meine Lösung wird dem Lehrer gefallen.

von Nicht ganz so fies (Gast)


Lesenswert?

Einer schrieb:
> while (ss --&& ds)* s ++<= m?* d ++= *(s -1), ds --:0 ;

Boah, bist du fies. Du hättest es wenigstens wie folgt hinschreiben 
können:
Dann versteht "man" wenigstens auf Anhieb, was gemeint ist ;-)

while (ss-- && ds) *s++ <= m ? *d++ = *(s-1), ds--: 0 ;

Eine korrekte Ausgabe liefert deine Funktion auch nur, wenn du das 
Ausgabearray mit Nullen vorinitialisierst.

von Einer (Gast)


Lesenswert?

Nicht ganz so fies schrieb:
> Eine korrekte Ausgabe liefert deine Funktion auch nur, wenn du das
> Ausgabearray mit Nullen vorinitialisierst.

Nope. Das war nicht Teil der Aufgabenstellung:

Mitch schrieb:
> Ihre Funktion soll die Werte des ersten Arrays in das zweite Array
> kopieren aber Werte die über dem gegebenen Schwellwert sind ignorieren

Da steht nichts, von Array mit Nullen auffüllen.

Geliefert wie bestellt.

von A. S. (Gast)


Lesenswert?

Einer schrieb:
> void copy(int *s, int *d, int ss, int ds, int m)
> {
>     while (ss --&& ds)* s ++<= m?* d ++= *(s -1), ds --:0 ;
> }

Einer schrieb:
> Ich denke, meine Lösung wird dem Lehrer gefallen.

ich vermute, es gibt nur eine Arraygröße. Und nicht addieren, sondern 
kopieren. Das wär deutlich einfacher (und ohne Schleifenkörper)
1
void copy(int *d, int *s, int n, int l)
2
{
3
    while(n-->0 && (s[n]>l || d[n]=s[n] || 1));  
4
}

von Dirk B. (dirkb2)


Lesenswert?

Sinnvoll wäre ein Rückgabewert, der die Anzahl der kopierten Werte 
angibt.

von C ist so lustig weil... (Gast)


Lesenswert?

Dirk B. schrieb:
> Sinnvoll wäre ein Rückgabewert, der die Anzahl der kopierten Werte
> angibt.

Die Aufgabe lautete nicht "die Aufgabenstellung hinterfragen und 
verbessern", auch wenn ich ganz bei deinem Verbessrungsvorschlag bin.

Obige Implementationsentwürfe finde ich so toll weil sie den Kern von C 
so wunderbar auf den Punkt bringen UND weil sie Gleichzeitig den 
Aufgabesteller (Lehrer?) auf die Probe stellen :-)

Wer C unterrichtet/lehrt/lernt/übt MUSS ZWINGEND sowas abkönnen!

von Nicht ganz so fies (Gast)


Lesenswert?

Einer schrieb:
> Nope. Das war nicht Teil der Aufgabenstellung:
>
> Mitch schrieb:
>> Ihre Funktion soll die Werte des ersten Arrays in das zwemenite Array
>> kopieren aber Werte die über dem gegebenen Schwellwert sind ignorieren

Naja, es gibt noch den Sample In&Output. Das letzte Null-Byte von Output 
muss ja irgendwoher kommen ;-)

C ist so lustig weil... schrieb:
> Wer C unterrichtet/lehrt/lernt/übt MUSS ZWINGEND sowas abkönnen!

Dem würde ich zustimmen.

von MaWin (Gast)


Lesenswert?

Einer schrieb:
> Ich denke, meine Lösung wird dem Lehrer gefallen.

Die Grösse beider Arrays soll gleich sein und mit nur einem 
Integerparameter angegeben werden.

An statt sinnvollerweise die Anzahl der kopierten Elemente des sich 
ergebenden Zielarray als Result der Funktion zurückgegeben soll offenbar 
der ungenutzte Rest mit 0 gefüllt werden.

A. S. schrieb:
> ich vermute

Es soll nicht so werden wie du geschrieben hast, bei 0 abbrechen, immer 
Quelle an derselben Position in Ziel kopieren.

von achs (Gast)


Lesenswert?

MaWin schrieb:
> Es soll nicht so werden wie du geschrieben hast, bei 0 abbrechen, immer
> Quelle an derselben Position in Ziel kopieren

Ha? Ok, Du meinst so?:

while(n-->0 && (s[n]>l || *d++=s[n] || 1));

von achs (Gast)


Lesenswert?

achs schrieb:
> bei 0 abbrechen

 n Mal durchlaufen tun beide ;-) spiegeln nur die zweite

von MaWin (Gast)


Lesenswert?

achs schrieb:
> Du meinst so?:

Ja, wobei noch 0 hintendran gefüllt werden müssen.

von achs (Gast)


Lesenswert?

Ah, sample, sorry

while(n-->0) *s>l||*d++=*s,s++;

von Rolf M. (rmagnus)


Lesenswert?

MaWin schrieb:
> Einer schrieb:
>> Ich denke, meine Lösung wird dem Lehrer gefallen.
>
> Die Grösse beider Arrays soll gleich sein und mit nur einem
> Integerparameter angegeben werden.

Davon steht in der Aufgabe nichts, aber man könnte es so interpretieren. 
Wie ich oben schon sagte, ist die Aufgabe (nicht nur an dieser Stelle) 
fürchterlich unpräzise formuliert.

> An statt sinnvollerweise die Anzahl der kopierten Elemente des sich
> ergebenden Zielarray als Result der Funktion zurückgegeben soll offenbar
> der ungenutzte Rest mit 0 gefüllt werden.

Das kann ich nun aus der Aufgabe nirgends herauslesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.