Skip to content
Snippets Groups Projects
Commit ab86b9d1 authored by 20041679's avatar 20041679
Browse files

added Esercizi n. 6, missing last point

parent 96eb14bd
Branches master
No related tags found
No related merge requests found
CC = clang
CFLAGS = -Wall -Wextra -g
objects = list.o book.o main.o
all: $(objects)
$(CC) $(CFLAGS) $(objects) -o main
list.o: list.c list.h
$(CC) -c $(CFLAGS) $< -o $@
book.o: book.c book.h
$(CC) -c $(CFLAGS) $< -o $@
main.o: main.c
$(CC) -c $(CFLAGS) $< -o $@
clean:
rm main $(objects)
#include "book.h"
#include <stdio.h>
#include <string.h>
int book_input(Book *book) {
puts("titolo");
scanf("%63s", book->title);
puts("autore");
scanf("%63s", book->author);
puts("price");
scanf("%f", &book->price);
scanf("%u", &book->copies);
return 1;
}
void book_output(Book *book) {
printf(
"titolo: %s, autore: %s, prezzo: %f, disponibilità: %u\n",
book->title,
book->author,
book->price,
book->copies
);
}
int book_has_copies(Book *book, unsigned int n) {
return book->copies >= n;
}
int book_cmp(Book *book1, Book *book2) {
return
strcmp(book1->title, book2->title) == 0 &&
strcmp(book1->author, book2->author) == 0 &&
book1->price == book2->price;
}
#ifndef BOOK_H
#define BOOK_H
typedef struct {
char title[64];
char author[64];
float price;
unsigned int copies;
} Book;
int book_input(Book *book);
void book_output(Book *book);
int book_has_copies(Book *book, unsigned int n);
#endif
#include "list.h"
#include <stdlib.h>
List node_alloc() {
return malloc(sizeof(Head));
}
void list_input_insert_tail(List *list, int (*input) (Data *)) {
if (!(*list)) {
List next = *list;
(*list) = node_alloc();
Data data;
input(&data);
(*list)->data = data;
(*list)->next = next;
} else {
list_input_insert_tail(&(*list)->next, input);
}
}
void list_filter_output(
List list,
int (*predicate) (Data *, void *),
void *key,
void (*output) (Data *))
{
if (list) {
if (predicate(&list->data, key)) {
output(&list->data);
}
list_filter_output(list->next, predicate, key, output);
}
}
void list_rev_filter_output(
List list,
int (*predicate) (Data *, void *),
void *key,
void (*output) (Data *))
{
if (list) {
list_rev_filter_output(list->next, predicate, key, output);
if (predicate(&list->data, key)) {
output(&list->data);
}
}
}
#ifndef LIST_H
#define LIST_H
#include "book.h"
typedef Book Data;
typedef struct Head {
struct Head *next;
Data data;
} Head;
typedef Head *List;
List node_alloc();
void list_input_insert_tail(List *list, int (*input) (Data *));
void list_filter_output(List list, int (*predicate) (Data *, void *), void *key, void (*output) (Data *));
void list_rev_filter_output(List list, int (*predicate) (Data *, void *), void *key, void (*output) (Data *));
#endif
#include "list.h"
void f1(List *list) {
return list_input_insert_tail(list, book_input);
}
int has_copies(Book *book, void *n) {
return book_has_copies(book, *(int *)n);
}
void f2(List list, unsigned int x) {
list_filter_output(list, has_copies, &x, book_output);
}
void f3(List list, unsigned int x) {
list_rev_filter_output(list, has_copies, &x, book_output);
}
int main(void) { }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment