Wątek przeniesiony 2023-01-14 02:46 z Edukacja przez somekind.

Dopisać funkcje na liście dynamicznej :D

0

Zakładając, że lista dynamiczna, stworzona przy użyciu dostarczonej aplikacji, będzie posortowana wg nazwy towaru, dopisać funkcję, której zadaniem będzie znalezienie maksymalnej ceny jednostkowej elementów, noszących nazwę „mleko”*).
Odpowiedni sposób sortowania uzyskuje się zmieniając wartość zmiennej "sortowanie" w funkcji main().

Poszukiwanie powinno trwać tylko do momentu, w którym będzie można mieć pewność, że dalsze sprawdzanie jest zbędne. W przypadku braku elementów spełniających kryterium należy wyświetlić stosowny komunikat.

*) Porównania ciągów znaków x1 i x2 można dokonać z użyciem funkcji strcmp(x1,x2). Funkcja zwraca wynik <0 (gdy x1 0 (gdy x1>x

Język C ;)

#include <stdio.h>
#include <stdlib.h>

typedef struct{
char nazwa[50];
int ilosc;
float cena_jedn;
struct tTowar *next;
} tTowar;
typedef tTowar *wTowar;

wTowar poczatek=NULL, koniec;
char *nazwaPliku="sprawdzian.txt";

int main()
{
int i,n,sortowanie=1;
char *sort;
printf("Sortowanie wg ");
switch(sortowanie){
case 1: sort="nazwy";
break;
case 2: sort="ilosci";
break;
case 3: sort="ceny jednostkowej";
break;
default: sort="nieokreslone";
}
printf("%s.\n\n",sort);
pobierz(&poczatek,&koniec,nazwaPliku,sortowanie);
printf("Wprowadz liczbe dodawanych elementow: "); scanf("%d",&n);
printf("\n");
for(i=1;i<=n;i++){
printf("%d element:\n",i);
dodajElement(&poczatek,&koniec,sortowanie);
}
printf("\nWykaz towarow:\n");
wyswietlListe(poczatek);
zapisz(poczatek,nazwaPliku);
return 0;
}

wTowar miejsceWstNazwa(wTowar p, char *naz){
while(p!=NULL && strcmp(naz,p->nazwa)>0)
p=p->next;
return p;
}

wTowar miejsceWstIlosc(wTowar p, int ile){
while(p!=NULL && ile>p->ilosc)
p=p->next;
return p;
}

wTowar miejsceWstCena(wTowar p, float cena){
while(p!=NULL && cena>p->cena_jedn)
p=p->next;
return p;
}

wTowar miejscePrzed(wTowar p, wTowar w){
if(p==NULL || p==w) return NULL;
while(p->next!=w) p=p->next;
return p;
}

void wprowadzRekord(char naz[], int *ile, float *cena){
printf("Wprowadz nazwe towaru: "); getchar(); fgets(naz,50,stdin);
naz[strlen(naz)-1]='\0';
printf("Wprowadz ilosc towaru: "); scanf("%d",&(*ile));
printf("Wprowadz cene towaru: "); scanf("%f",&(*cena));
}

void wstawElement(wTowar *p, wTowar k, char naz[], int ile, float cena, int parametr){
wTowar q, w1, w2;
q=(tTowar
)malloc(sizeof(tTowar));
strcpy(q->nazwa,naz); q->ilosc=ile; q->cena_jedn=cena;
if((*p)==NULL){
(*p)=q; (*k)=q; (*k)->next=NULL;
}
else {
switch(parametr){
case 1: w2=miejsceWstNazwa((*p),naz); break;
case 2: w2=miejsceWstIlosc((*p),ile); break;
case 3: w2=miejsceWstCena((*p),cena); break;
default: w2=miejsceWstNazwa((*p),naz);
}
w1=miejscePrzed((*p),w2);
if(w1==NULL){q->next=(*p); (*p)=q;}
else if(w2==NULL){(*k)->next=q; q->next=NULL; (*k)=q;}
else {w1->next=q; q->next=w2;}
}
}

void dodajElement(wTowar *p, wTowar *k, int parametr){
wTowar q, w1, w2;
char naz[50];
int ile;
float cena;
wprowadzRekord(naz,&ile,&cena);
wstawElement(&(*p),&(*k),naz,ile,cena,parametr);
}

void wyswietlListe(wTowar p){
while(p!=NULL){
printf("%s %d %3.2f\n",p->nazwa,p->ilosc,p->cena_jedn);
p=p->next;
}
}

void pobierz(wTowar *p, wTowar *k, char *nazwaPliku, int parametr){
FILE *plik; char naz[50]; int ile; float cena;
plik=fopen(nazwaPliku,"rt");
if(plik==NULL){
printf("Nie mozna otworzyc pliku z danymi.\n");
return;
}
while(!feof(plik)){
fgets(naz,50,plik); naz[strlen(naz)-1]='\0';
fscanf(plik,"%d %f\n",&ile,&cena);
wstawElement(&(*p),&(*k),naz,ile,cena,parametr);
}
fclose(plik);
}

void zapisz(wTowar p, char *nazwaPliku){
FILE *plik;
plik=fopen(nazwaPliku,"wt");
while(p!=NULL){
fprintf(plik,"%s\n%d %3.2f\n",p->nazwa,p->ilosc,p->cena_jedn);
p=p->next;
}
fclose(plik);
}

1

Zrobiłem, co dalej??

1 użytkowników online, w tym zalogowanych: 0, gości: 1