Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

lerne gerade C und bin bei der Übergabe von Argumenten bei Vektoren hängen geblieben. ("Programmieren lernen mit C" von Karlheinz Zehner, 4. Aufl., Aufgabe 1-31) Auch seine Lösung auf seiner Internett-Seite hat mir keine Erleuchtung gebracht... :(

Aufgabe des Programms:

Zahlen einlesen,

Z. ausgeben,

Z. sortieren,

Z. ausgeben (dieses mal sind sie sortiert).

Das ganze in 3 Funktionen zerlegt. Die Return-Anweisung hat der Aufgabensteller noch nicht ermöglicht / erklärt für diese Aufgabenstellung.

Mein Ergebnis:

Die Zahlen werden eingelesen und im Vektor korrekt abgespeichert. Ich verwende hier mal nur 5 Zahlen von möglichen 9. (Beides willkürlich, beides in main festgelegt.)

Die erste Ausgabe der nicht sortierten Zahlen funzt auch prima. Nach Aufruf der Funktion zahlen_sortieren stelle ich fest, daß der Vektor nur noch aus einem Element (,das auch mit dem eingegebenen übereinstimmt,) besteht.

Hier meine Version:

---------

#include <stdio.h>

void zahlen_einlesen (int v[], int *n)

{

int i;

printf("Bitte 5 Zahlen eingeben. Eingabe jeweils mit <return> abschliessen.\n");

printf("n = %i\n", *n); // Nur um zu sehen, ob das Argument hier angekommen ist.

i = 0;

while (i < *n) {

scanf("%i", &v);

i++;

}

printf("Eingabe beendet. \n");

}

void zahlen_ausgeben (int v[], int n)

{

int i;

printf("n = %i\n", n);

printf("Folgende Zahlen wurden eingegeben: \n");

for (i = 0; i < n; i++) {

printf("%i ", v);

}

}

void zahlen_sortieren (int v[], int n)

{

int i, speicher, sortiert;

// sortiert = 0 (unsortiert), sortiert = 1 (sortiert)

do {

sortiert = 1;

for (i = 1; i <= n; i++) {

if (v[i-1] > v) { // Bedingung fuers Tauschen

speicher = v;

v[i-1] = v;

v = speicher;

sortiert = 0;

}

}

}

while (sortiert == 0);

}

int main (void)

{

int v[9]; // Liste von max. 9 Zahlen

int n; // Anzahl der Zahlen

n = 5; // Anzahl der Zahlen wird hier willkürlich festgelegt.

zahlen_einlesen (v, &n);

zahlen_ausgeben (v, n);

zahlen_sortieren (v, n);

zahlen_ausgeben (v, n);

return 0;

}

-----------

Der Autor des Buchs hat die Sortier-Funktion wie folgt gelöst:

-----

void zahlen_sortieren (int x[], int n)

{

int sortiert;

int h;

int i;

do {

sortiert = TRUE;

for (i = 0; i < n-1; i++)

if ( x[i+1] < x ) {

h = x; x = x[i+1]; x[i+1] = h; /* tauschen */

sortiert = FALSE;

}

} while (sortiert == FALSE);

}

------

Was ist dort so wesentlich anders? Ich habe mit 0 und 1 statt TRUE und FALSE gearbeitet ...

Ich danke Euch für ein paar Hinweise ... :confused:

Ciao, Andreas

  • Autor

Was soll ich code tagen? Erscheint bei Dir nicht die grüne Schrift?

Danke für den Hinweis der Algorithmus sei fehlerhaft. Deshalb habe ich ja hier etwas geschrieben. Die Lösung aus dem Lehrbuch habe ich auch schon zitiert ...

In C gibt es durchaus Vektoren. Wie sie heißen hängt sicher vom Lehrbuch ab. Bei mir steht sie werden in der englischsprachigen Literatur "array" genannt. Ich habe aber ein deutsches Buch gekauft. Scusa. In einem englischsprachigen Forum hätte ich sicher "array" geschrieben. ;)

Worauf wolltest Du mit den angeführten Links hinaus? Ich habe hier in C programmiert, nicht C++ oder so. Was soll ich da jetzt alles lesen?

Also, dann noch ein schönes Wochenende.

Ciao, Andreas

Was soll ich code tagen? Erscheint bei Dir nicht die grüne Schrift?
Grün ist ja schön, aber noch schöner wäre die Einrückung. Die bleibt erhalten, wenn du deinen Code zwischen
 und [[color=black]/[/color]CODE] setzt.

Die Lösung aus dem Lehrbuch habe ich auch schon zitiert ...
Und da gibt es einen entscheidenden Unterschied. Dein Code greif auf v[n] zu, und das ist nicht erlaubt. Der Lehrbuch-Code tut das nicht.
In C gibt es durchaus Vektoren.

Wenn es Vektoren gibt, dann sollte Dir ja sicherlich bekannt sein, dass es einen C Standard gibt

http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

Zeige bitte, wo im Standard die Vektoren sind?

Wie sie heißen hängt sicher vom Lehrbuch ab. Bei mir steht sie werden in der englischsprachigen Literatur "array" genannt. [...] Worauf wolltest Du mit den angeführten Links hinaus? Ich habe hier in C programmiert, nicht C++ oder so.

Es gibt keine Vektoren in C, Vektoren gibt es aber in C++.

Ich habe aber ein deutsches Buch gekauft. Scusa. In einem englischsprachigen Forum hätte ich sicher "array" geschrieben. ;)

Es gibt eine gewisse Notation und Namensgebung und an die solltest Du Dich halten

Wenn es Vektoren gibt, dann sollte Dir ja sicherlich bekannt sein, dass es einen C Standard gibt

http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

Zeige bitte, wo im Standard die Vektoren sind?

Es gibt keine Vektoren in C, Vektoren gibt es aber in C++.

Natürlich ist ein (1dimensionales) array ein Vektor, denn genau das ist Definition eines Vektors. Das hat auch mit der Programmiersprache nichts zu tun, Vektor ist ein mathematischer Begriff :upps Also bleib doch lieber im Java Forum flashpixxxx :rolleyes:

Da alle anderen sich wohl zu gut waren auf die eigentliche Frage zu antworten: Dein Dreieckstausch ist falsch. Wenn du den mal Zeile für Zeile durchgingest, wird dir der Fehler auch selber auffallen, da die Implementierung so keinen Sinn macht. Außerdem geht deine Schleife einen Index zu weit.

Natürlich ist ein (1dimensionales) array ein Vektor, denn genau das ist Definition eines Vektors. Das hat auch mit der Programmiersprache nichts zu tun, Vektor ist ein mathematischer Begriff :upps Also bleib doch lieber im Java Forum flashpixxxx :rolleyes:

Wenn man in einem Programmierforum um Hilfe sucht dann wendet man in der Regel die allgemein übliche Fachsprache an. Auch wenn in der Theorie Vektor eine genauere Bezeichnung für ein eindimensionales Feld sein mag, so kenne ich wenige die in der Praxis von einem Vektor anstelle eines Arrays reden.

Da in C++ "vector" in der STL existiert ist die Verwechslungsgefahr durchaus gegeben. Ich bin beim ersten Lesen auch darauf reingefallen. So gesehen haben alle Recht, außer mit Ihrer Polemik, die ist hier Fehl am Platz.

Heult doch nicht rum... in C++ ist ein Vector doch im grunde eine Containerklasse eines Arrays.... mehr ist nicht dahinter... also finde ich nicht das es so schlimm ist wenn er von vectoren spricht wenn es sich um arrays handelt....

Würde er von listen sprechen und uns einen Code von einem Array geben dann würde ich dies beanstanden aber hier auf hochstandartkonform zutun find ich schade.. der Threadersteller wird dann sicherlich nie wieder euch um hilfe bitten... -.-

achja wenn man dann mal beim korrigieren ist...

scanf("%i", &v);

warum regt euch das nicht auf? den referenzoperator '&' gab es zu C zeiten noch nicht.. es ist ne neuerung in C++ um die pointer arithmetik zu entlasten ! also ich liebe ja solche leuts

Bearbeitet von SynonymOfGod

Das hat auch mit der Programmiersprache nichts zu tun, Vektor ist ein mathematischer Begriff :upps Also bleib doch lieber im Java Forum flashpixxxx

Dann erkläre uns doch mal, da Du ja hier neu bist, was ein Vektor in Bezug auf Topologie bzw. Vektorraum präzise mathematisch ist.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.