Merge Sort für struct umschreiben

#1
Guten Tag,
ich bin et Student im 2. Semester die C Grundlagen habe ich soweit eigentlich ganz gut verstanden glaube ich jedenfalls.^^
Nun haben wir es aber mit Algorithmen zu tun und sollen ein Programm schreiben welches eine Struktur Student mit Vorname(char[100]) Nachname(char[100] und note(double) bei note soll alles größer 4,0 zu 5 gemacht werden,dann soll man das ganze mit merge nach note sortieren.
Ich habe bereits die Struktur eingelesen und muss nur noch herausfinden wie ich merge welches ich nur für int habe umschreibe für double und das ganze dann auch wirklich die Strukturen umsortiert und nicht die note einem anderen Student gibt.
Ich wäre sehr Dankbar für gute Tipps
LG etnoob :)

anbei tu ich mal meinen Code bisher

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void merge(int *A, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int* L = (int*)malloc(sizeof(int)*(n1 + 1));
int* R = (int*)malloc(sizeof(int)*(n2 + 1));
int i, j, k;
for (i = 0; i < n1; ++i)
{
L = A[p + i];
}
for (i = 0; i < n2; ++i)
{
R = A[q + 1 + i];
}
L[n1] = R[n2] = INT_MAX;
i = j = 0;

for (k = p; k <= r; ++k)
{
if (L <= R[j])
{
A[k] = L;
i++;
}
else if (L > R[j])
{
A[k] = R[j];
j++;
}
}
free(L);
free(R);
}
void merge_sort(int *A, int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
merge(A, p, q, r);
}
}
struct student
{
char vorname[100];
char nachname[100];
float note;
};
int main()
{
int n, i;
char inhalt[250];
printf("Geben Sie die anzahl der studenten ein: ");
scanf("%d", &n);

struct student *a = (struct student*)malloc(n * sizeof(student));

for (i = 0; i < n; i++)
{
printf("geben sie fuer student %d ein vorname nachname note: ", i + 1);
scanf("%s", a.vorname);
scanf("%s", a.nachname);
scanf("%f", &a.note); if (a.note > 4) { a.note = 5; } printf("%f", a.note);
}
getchar();
getchar();
return 0;
}
 

AGGROStar1991

Well-Known Member
c-b Experte
#2
Benutz erstmal code tags, das kann so ja niemand lesen.

und für den Sort : dem gibst du am besten von beginn an einen Funktionspointer auf eine Vergleichsfunktion mit und die Vergleichsfunktion kann einfach sortieren, du musst nicht einmal vorher drüberiterieren um die Zahlen anzupassen, das kannst du im selben Durchlauf machen.
 
#3
Benutz erstmal code tags, das kann so ja niemand lesen.

und für den Sort : dem gibst du am besten von beginn an einen Funktionspointer auf eine Vergleichsfunktion mit und die Vergleichsfunktion kann einfach sortieren, du musst nicht einmal vorher drüberiterieren um die Zahlen anzupassen, das kannst du im selben Durchlauf machen.
Dumme Frage was sind Code Tags bin halt wirklich noch anfänger hab das einfach aus meinem visual studio copy and paste genommen
 
#5
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void merge(int *A, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int* L = (int*)malloc(sizeof(int)*(n1 + 1));
int* R = (int*)malloc(sizeof(int)*(n2 + 1));
int i, j, k;
for (i = 0; i < n1; ++i)
{
L = A[p + i];
}
for (i = 0; i < n2; ++i)
{
R = A[q + 1 + i];
}
L[n1] = R[n2] = INT_MAX;
i = j = 0;

for (k = p; k <= r; ++k)
{
if (L <= R[j])
{
A[k] = L;
i++;
}
else if (L > R[j])
{
A[k] = R[j];
j++;
}
}
free(L);
free(R);
}
void merge_sort(int *A, int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
merge(A, p, q, r);
}
}
struct student
{
char vorname[100];
char nachname[100];
float note;
};
int main()
{
int n, i;
char inhalt[250];
printf("Geben Sie die anzahl der studenten ein: ");
scanf("%d", &n);

struct student *a = (struct student*)malloc(n * sizeof(student));

for (i = 0; i < n; i++)
{
printf("geben sie fuer student %d ein vorname nachname note: ", i + 1);
scanf("%s", a.vorname);
scanf("%s", a.nachname);
scanf("%f", &a.note); if (a.note > 4) { a.note = 5; } printf("%f", a.note);
}
getchar();
getchar();
return 0;
}

ich habe in visual studio gesucht...^^ jetzt fühl ich mich dumm
 
#6
ich muss eigentlich nur herausfinden wie ich die struct array umsortiere mit merge da das ja für arrays von integern in angegebener int länge ist die länge habe ich aber bereits vom user
 

German

Well-Known Member
c-b Experte
#7
Du hast jetzt nicht etwa den bereits durch verschwundene Codeeinrückungen und missinterpretierten (und dadurch entfernten) [i]s völlig kaputten Code aus dem ersten Post, nun in Code Tags gepackt, oder? :rolleyes: Was glaubst du warum du darum gebeten wurdest, den Code noch mal neu zu posten?
 

Mat

Well-Known Member
c-b Experte
#8
Du hast jetzt nicht etwa den bereits durch verschwundene Codeeinrückungen und missinterpretierten (und dadurch entfernten) [i]s völlig kaputten Code aus dem ersten Post, nun in Code Tags gepackt, oder? :rolleyes: Was glaubst du warum du darum gebeten wurdest, den Code noch mal neu zu posten?
Oh, herrlich. :D

Beim dritten Mal klappts sicher. Dieses Mal am besten auch gleich mit C-Syntax [CODE=c]... statt allgemein.

Siehe auch: https://www.coding-board.de/threads/faq.33345/
 
#9
C:
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void merge(int *A, int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    int* L = (int*)malloc(sizeof(int)*(n1 + 1));
    int* R = (int*)malloc(sizeof(int)*(n2 + 1));
    int i, j, k;
    for (i = 0; i < n1; ++i)
    {
        L[i] = A[p + i];
    }
    for (i = 0; i < n2; ++i)
    {
        R[i] = A[q + 1 + i];
    }
    L[n1] = R[n2] = INT_MAX;
    i = j = 0;

    for (k = p; k <= r; ++k)
    {
        if (L[i] <= R[j])
        {
            A[k] = L[i];
            i++;
        }
        else if (L[i] > R[j])
        {
            A[k] = R[j];
            j++;
        }
    }
    free(L);
    free(R);
}
void merge_sort(int *A, int p, int r)
{
    if (p < r)
    {
        int q = (p + r) / 2;
        merge_sort(A, p, q);
        merge_sort(A, q + 1, r);
        merge(A, p, q, r);
    }
}
struct student                                                                                    //struktur char char double
{
    char vorname[100];
    char nachname[100];
    float note;
};
int main()
{
    int n, i;
    char inhalt[250];
    printf("Geben Sie die anzahl der studenten ein: ");                                                //eingabe anzahl int
    scanf("%d", &n);

    struct student *a = (struct student*)malloc(n * sizeof(student));                                //malloc dyn array struct

    for (i = 0; i < n; i++)
    {                                                                                                //einlesen in die struct
        printf("geben sie fuer student %d ein vorname nachname note:    ", i + 1);
        scanf("%s", a[i].vorname);
        scanf("%s", a[i].nachname);
        scanf("%f", &a[i].note);            if (a[i].note > 4) { a[i].note = 5; }            printf("%f", a[i].note);
    }
    getchar();
    getchar();
    return 0;
}
[CODE=c]
 
Gefällt mir: Mat
Oben