Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //operazioni tra matrici
- #include<stdio.h>
- #include<stdlib.h> // libreria per uscita di errore exit() ed altre belle cose
- #include<ctype.h> // libreria per funzione toupper() che converte a maiuscole ed altre belle cose
- #define DIM 100 // definisce DIM come "100" in modo che tu scrivi DIM invece di scrivere 100 ogni volta
- #define DB "esame.dat" // definisce DB come "esame.dat" in modo che basta scrivere DB invece di "esame.dat"
- void leggimatrice(int n, int m, double a[][DIM], FILE *fp);
- void somma_matrici( int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
- void prodotto_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
- void differenza_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
- void funzione(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
- int main (void) {
- int scelta, nrighe1, ncolonne1, nrighe2, ncolonne2;
- double a[DIM][DIM]={0}, b[DIM][DIM]={0}, c[DIM][DIM]={0};
- char lettera, lettera2;
- FILE *fp;
- fp = fopen(DB, "a"); // Apre il file "esame.dat" (scrivere DB o "esame.dat" è uguale, vedi riga 7)
- // con l'attributo "a", ovvero modalità "APPEND", che scrive "in coda", alla fine del file.
- for(;;) // for vuoto senza condizione di uscita perchè quest'ultima sta già in TUTTI i vari casi
- // per un ciclo di questo tipo meglio scrivere while(1) invece di for(;;)
- {
- printf("Inserisci le dimensioni della prima matrice(mxn): ");
- scanf("%dx%d", &nrighe1, &ncolonne1);
- printf("Inserisci le dimensioni della seconda matrice(mxn): ");
- scanf("%dx%d", &nrighe2, &ncolonne2);
- printf("Inserisci gli elementi della prima matrice:\n");
- leggimatrice(nrighe1, ncolonne1, a, fp); // richiama la funzione che legge la matrice
- printf("Inserisci gli elementi della seconda matrice:\n");
- leggimatrice(nrighe2, ncolonne2, b, fp); // la stessa funzione che legge la matrice ma con parametri diversi
- for(;;) // leggi riga 28 per for(;;)
- {
- // lista delle funzioni del programma
- printf("Quale operazione vuoi svolgere? Inserisci 1 per la somma di matrici, 2 per il prodotto, 3 per la differenza, 4 per la matrice f(A,B): ");
- scanf("%d", &scelta); //in base al numero inserito esegue un operazione del programma.
- switch (scelta) {
- // inserendo un numero della lista sceglie l'operazione
- // richiama la relativa funzione passando i valori delle matrici inserite prima
- // il 'break' alla fine serve per uscire dal ciclo infinito 'for(;;)', altrimenti senza il programma non termina MAI.
- case 1: somma_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
- case 2: prodotto_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
- case 3: differenza_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
- case 4: funzione(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
- default: printf("Scelta sbagliata!\n"); break;
- }
- printf("Vuoi svolgere altre operazioni sulle matrici?(S/N): ");
- scanf("%s", &lettera); // legge la scelta dell utente, se S o N
- if(toupper(lettera) == 'N') // se metti N
- // la funzione 'toupper' della libreria 'ctype.h' rende tutto maiuscolo
- // perchè l'if verifica la S e N --SOLO-- se sono maiuscole, quindi con 'toupper'
- // ci assicuriamo che tutto funzioni anche se l'utente mette s e n minuscole
- {
- fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
- printf("\nArrivederci!\n"); // saluta l'utente, buona educazione..
- fclose(fp); // chiude il file di log
- exit(EXIT_SUCCESS); // esce con successo
- } else if(toupper(lettera) == 'S') // invece se metti S {
- fprintf(fp, "L'utente ha scelto di eseguire altre operazioni!\n"); // scrive nel file di log
- printf("Vuoi cambiare matrici?(S/N): ");
- scanf("%s", &lettera2); // legge la scelta dell utente, se S o N
- //per info toupper leggi riga 60
- if(toupper(lettera2) == 'S') { // se metti S
- fprintf(fp, "L'utente ha scelto di cambiare matrici\n"); // scrive nel file di log
- break; // esce dal ciclo
- } else if(toupper(lettera2) == 'N') { // se metti N
- fprintf(fp, "L'utente ha scelto di non cambiare matrici!\n"); // scrive nel file di log
- } else {
- fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
- printf("\nScelta sbagliata!\n");
- fclose(fp); // chiude il file di log
- exit(EXIT_SUCCESS); // esce con successo
- }
- } else { // se non metti ne S ne N ti avvisa che hai sbagliato!
- fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
- printf("\nScelta sbagliata!\n");
- fclose(fp); // chiude il file di log
- exit(1); // esce con codice errore
- }
- }
- }
- }
- // QUA INIZIANO LE FUNZIONI USATE DAL PROGRAMMA, COPIARE COME STANNO!
- void leggimatrice(int n, int m, double a[][DIM], FILE *fp) {
- int i, j;
- fprintf(fp, "La matrice è:\n");
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- printf("Inserisci l'entrata di posto [%d;%d]: ", i+1, j+1);
- scanf("%lf", &a[i][j]);
- fprintf(fp, "%8.2f", a[i][j]);
- }
- fprintf(fp, "\n");
- }
- }
- void somma_matrici( int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
- int i, j;
- fprintf(fp, "L'utente ha scelto l'operazione somma matrici\n");
- if(n==n1 && m==m1) {
- printf("La matrice somma è:\n");
- fprintf(fp, "La matrice somma è:\n");
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- printf("%8.2f", a[i][j] + b[i][j]);
- fprintf(fp, "%8.2f", a[i][j] +b[i][j]);
- }
- printf("\n");
- fprintf(fp, "\n");
- }
- } else {
- printf("Impossibile calcolare la matrice somma!\n");
- fprintf(fp, "Scelta sbagliata!\n");
- }
- }
- void prodotto_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
- int i, j, k;
- double c[DIM][DIM]={0}, sum=0;
- fprintf(fp, "L'utente ha scelto l'operazione prodotto \n");
- if(m==n1) {
- fprintf(fp, "La matrice prodotto è:\n");
- printf("La matrice prodotto è: \n");
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- for(k=0; k<m; k++) {
- sum += a[i][k] * b[k][j];
- }
- c[i][j] = sum;
- sum=0;
- }
- }
- for(i=0;i<n;i++) {
- for(j=0; j<m1; j++){
- printf("%8.2f", c[i][j]);
- fprintf(fp, "%8.2f", c[i][j]);
- }
- printf("\n");
- fprintf(fp, "\n");
- }
- } else {
- printf("Impossibile calcolare la matrice prodotto!\n");
- fprintf(fp, "Scelta sbagliata\n");
- }
- }
- void differenza_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
- int i, j;
- fprintf(fp, "L'utente ha scelto l'operazione differenza\n");
- if(n==n1 && m==m1) {
- fprintf(fp, "La matrice differenza è:\n");
- printf("la matrice differenza è:\n");
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- printf("%8.2f", a[i][j] - b[i][j]);
- fprintf(fp, "%8.2f", a[i][j] - b[i][j]);
- }
- printf("\n");
- fprintf(fp, "\n");
- }
- } else {
- printf("Impossibile calcolare la matrice differenza!\n");
- fprintf(fp, "Scelta sbagliata\n");
- }
- }
- void funzione(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
- int i, j, somma=0;
- double c[DIM][DIM]={0};
- fprintf(fp, "L'utente ha scelto di effettuare la funzione\n");
- if(n==n1 && m==m1) {
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- somma += (a[i][j] + b[i][j]);
- }
- }
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- c[i][j]= (a[i][j] + b[i][j])/somma;
- }
- }
- fprintf(fp, "La matrice della funzione è:\n");
- printf("La matrice risultante è:\n");
- for(i=0; i<n; i++) {
- for(j=0; j<m; j++) {
- printf("%8.2f", c[i][j]);
- fprintf(fp, "%8.2f", c[i][j]);
- }
- printf("\n");
- fprintf(fp, "\n");
- }
- } else {
- printf("Impossibile calcolare la matrice risultante!\n");
- fprintf(fp, "Scelta sbagliata!\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement