Proglab 34–Verifica se il vettore A è contenuto in B
main chiama una funzione per leggere i vettori A e B di lunghezza n e m.
Poi main verifica se gli elementi di A sono tutti presenti in B.
Ad esempio, se A=[9, 7, 2] e B=[3, 2, 88, 9, 7, 5] la risposta è sì.
Se A=[33, 6, 7, 8, 2] la risposta è no.
#include <stdlib.h>
#include <stdio.h>
int leggiarray(int X[]);
main() {
int A[100], B[100], i, j, n, m, flag;
n = leggiarray(A);
m = leggiarray(B);
flag = 1;
for (i=0; i<n; i++) { flag = 0;
for (j=0; j<m; j++) { if (A[i] == B[j]) flag = 1;
}
if (flag == 0) {
printf ("\n\nA non e' contenuto in B\n\n");
break;
} }
if (flag == 1)
printf("\n\nl'array A e' contenuto in B\n\n");
system ("pause");
return(0);
}
Proglab 35 – Trova sottomatrice 3 x 3 somma max
Il programma costruisce una matrice n x m di numeri casuali tali che 0 A[i][j] 50. Poi la matrice viene stampata. Poi viene individuata la sottomatrice 3 x 3 la cui somma degli elementi sia massima. Tale sottomatrice viene stampata.
Ad esempio, se la matrice generata è:
3 1 2 1
1 8 7 9
4 7 8 7
2 7 1 5
vi sono quattro sottomatrici 3 x 3:
la somma degli elementi della prima vale 41 la somma della seconda vale 50
la somma della terza vale 45 la somma della quarta vale 59
per cui viene stampata la quarta sottomatrice.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX 100
void generamatrice(int A[MAX][MAX], int n, int m);
int sommamatrice(int A[MAX][MAX], int n, int m, int i, int j);
void stampamatrice(int A[MAX][MAX], int n, int m);
main() {
int A[MAX][MAX], n, m, somma, sommamax, i, j, imax, jmax;
printf("numero di righe e di colonne: ");
scanf("%d %d", &n, &m);
generamatrice(A, n, m);
stampamatrice(A, n, m);
sommamax = 0;
imax = 0;
jmax = 0;
for (i=0; i<n-2; i++) { for (j=0; j<m-2; j++) {
somma = sommamatrice(A, n, m, i, j);
if (somma > sommamax) { sommamax = somma;
imax = i;
jmax = j;
} } }
printf ("\n\nla sottomatrice 3 x 3 massima:\n");
for (i=imax; i<imax+3; i++) { for (j=jmax; j<jmax+3; j++) printf("%4d", A[i][j]);
printf("\n");
}
system ("pause");
return(0);
}
void generamatrice(int A[MAX][MAX], int n, int m) { int i, j;
srand(time(NULL));
for (i=0; i<n; i++) for (j=0; j<m; j++)
A[i][j] = rand() % 50;
return;
}
void stampamatrice(int A[MAX][MAX], int n, int m) { int i, j;
for (i=0; i<n; i++) { for (j=0; j<m; j++)
printf("%4d", A[i][j]);
printf("\n");
}
return;
}
int sommamatrice(int A[MAX][MAX], int n, int m, int i, int j) { int s, h, k;
s = 0;
for (h=0; h<3; h++) for (k=0; k<3; k++) s = s+A[i+h][j+k];
return(s);
}
Proglab 38 – Inserisce una frase in una matrice
Inserire in un vettore una frase le cui parole sono separate da uno o più spazi. Inserire le parole, una per riga, in una matrice char e stamparla.
Ad esempio, se la frase è “mi piace l’estate” la matrice sarà:
mi piace l’estate
#include <stdlib.h>
#include <stdio.h>
void stampamatrice(char M[20][20], int n);
int main(void) {
char s[50], M[20][20];
int k=0, j=0, n=0;
printf("digita una stringa di caratteri: ");
scanf("%[^\n]", s);
while (s[k] != '\0') { j = 0;
while (s[k] != ' ' && s[k] != '\0') { M[n][j] = s[k];
j++;
k++;
}
M[n][j] = '\0';
while (s[k] == ' ') k++;
if (j > 0) n++;
}
stampamatrice(M, n);
system ("pause");
return(0); }
void stampamatrice(char M[20][20], int n) { int i;
for (i=0; i<n; i++)
printf("%s\n", &M[i][0]);
return; }
Proglab 40 – Converte stringa di cifre in numero
La funzione main legge una stringa di cifre comprese tra 0 e 9 e chiama una funzione che la converte nel numero intero corrispondente.
Ad esempio, se la stringa è s=”4723” viene stampato il numero 4723.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int convert(char s[]);
int main(void) {
char s[10];
int n;
printf("digita un numero: ");
scanf("%s", s);
n = convert(s);
printf("il valore inserito e' %d\n", n);
system ("pause");
return(0);
}
int convert(char s[]) {
int k, p, c, n, i;
k = strlen(s);
n = 0;
p = 1;
for (i=k-1; i>=0; i--) { c = s[i] - 48;
n = n + c*p;
p = p*10;
}
return(n);
}
Proglab 43 – Selection sort applicato a una lista
Letta in input una lista di numeri interi stamparla e poi ordinarla utilizzando l’algoritmo selection sort. Stampare la lista ordinata.
IMPORTANTE: organizzare il programma in funzioni, non utilizzare array e liste ausiliarie, non introdurre variabili globali.
Esempio. Se la lista di partenza è:
55 -> 23 -> 9 -> 41 -> 89 -> 20 -> NULL la lista si trasforma in:
9 -> 20 -> 23 -> 41 -> 55 -> 89 -> NULL
#include <stdlib.h>
#include <stdio.h>
struct nodo *crealista(void);
void printlista(struct nodo *p);
void selectionsort(struct nodo *p);
void swap(int *a, int *b);
struct nodo { int dato;
struct nodo *next;
};
main() {
struct nodo *p;
p = crealista();
printlista(p);
selectionsort(p);
printlista(p);
system ("pause");
return(0);
}
void selectionsort(struct nodo *p) { struct nodo *q;
while (p != NULL) { q = p->next;
while (q != NULL) {
if (p->dato > q->dato)
swap(&p->dato, &q->dato);
q = q->next;
}
p = p->next;
}
return;
}
void swap(int *a, int *b) {
int c;
c = *a;
*a = *b;
*b = c;
return;
}
Proglab 44 –Lista contenente espressione algebrica
main chiama una funzione che crea una lista i cui nodi contengono tre campi: operando int, operatore char, *next puntatore.
La lista rappresenta un’espressione algebrica che viene stampata.
Poi main chiama una funzione che calcola il valore dell’espressione (supponiamo che gli operatori abbiano eguale priorità) e lo restituisce a main che provvede alla stampa. Il campo operatore dell’ultimo nodo contiene il carattere ‘=’.
Ad esempio, se viene digitato:
15 + 3 * 2 – 6 / 5 = viene creata la lista:
(15, +) --> (3, *) --> (2, -) -> (6, /) --> (5, =) --> NULL e viene fuori il risultato: 6
#include <stdlib.h>
#include <stdio.h>
struct nodo *crealista(void);
int calcola(struct nodo *p);
void printlista(struct nodo *p);
struct nodo { int operando;
char operatore;
struct nodo *next;
};
main () {
struct nodo *primo;
int valore;
primo = crealista();
printlista(primo);
valore = calcola(primo);
printf("%d\n", valore);
printf ("\n\n");
system ("pause");
return 0;
}
struct nodo *crealista(void) {
struct nodo *p, *primo = NULL, *ultimo;
printf("inserisci l'espressione: ");
do {
p = (struct nodo *) malloc(sizeof(struct nodo));
scanf("%d %c", &p->operando, &p->operatore);
p->next = NULL;
if (primo == NULL) primo = p;
else
ultimo->next = p;
ultimo = p;
} while (p->operatore != '=');
return(primo);
}
int calcola(struct nodo *p) {
int valore;
valore = p->operando;
while (p->operatore != '=') { if (p->operatore == '+')
valore = valore + p->next->operando;
else if (p->operatore == '-')
valore = valore - p->next->operando;
else if (p->operatore == '*')
valore = valore * p->next->operando;
else
valore = valore / p->next->operando;
p = p->next;
}
return(valore);
}
void printlista(struct nodo *p) {
printf ("\n\n");
while (p != NULL) {
printf("%d %c ", p->operando, p->operatore);
p = p->next;
}
return;
}
Proglab 46 – Aggancio di due liste
Letti in input n e m, costruire due liste di n ed m numeri interi casuali compresi tra 0 e 9 e stamparle. Agganciare la lista la cui media dei valori sia minore in coda a quella con la media dei valori maggiore. Stampare la lista.
IMPORTANTE: utilizzare una funzione per creare le liste, un’altra per stamparle, una terza per calcolare la media, un’altra per concatenare le due liste. Non utilizzare array e liste ausiliarie, non introdurre variabili globali.
Ad esempio, se la lista A è composta dai nodi:
8 -> 1 -> 5 -> 4 -> 4 -> NULL (media 22/5=4.4) e la lista B dai nodi:
4 -> 6 -> 2 -> 8 -> NULL (media 20/4=5.0) la lista A viene agganciata in coda a B ottenendo la lista:
4 -> 6 -> 2 -> 8 -> 8 -> 1 -> 5 -> 4 -> 4 -> NULL
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void concatena(struct nodo *a, struct nodo *b);
float medialista(struct nodo *p);
struct nodo *crealista();
void printlista(struct nodo *p);
struct nodo { int dato;
struct nodo *next;
};
main() {
struct nodo *u, *v;
u = crealista();
printlista (u);
v = crealista();
printlista(v);
if (medialista(u) > medialista(v)) { concatena(u, v);
printlista(u);
} else {
concatena(v, u);
printlista(v);
}
system ("pause");
return(0);
}
float medialista(struct nodo *p) { int somma = 0, n = 0;
while (p != NULL) {
somma = somma + p->dato;
n++;
p = p->next;
}
return((float)somma/n);
}
void concatena(struct nodo *a, struct nodo *b) { struct nodo *p;
p = a;
while (p->next != NULL) { p = p->next;
}
p->next = b;
return;
}
struct nodo *crealista() {
struct nodo *p, *start, *last;
int i, n, x;
start = NULL;
srand (time (NULL));
printf("quanti nodi ha la lista ? ");
scanf("%d", &n);
for (i=0; i<n; i++){
p = (struct nodo *) malloc (sizeof (struct nodo));
if (i == 0) start = p;
if (i != 0)
last->next = p;
p->dato = rand()%10;
p->next = NULL;
last = p;
}
printf ("\n\n");
return(start);
}
void printlista(struct nodo *p) {
while (p != NULL) {
printf("%d --> ", p->dato);
p = p->next;
}
printf("NULL\n\n\n");
}