Domanda Programmazione in C

RobotKiller

Utente Iron
24 Ottobre 2022
12
4
0
9
Ultima modifica:
Allora chiedo aiuto alla community di programmatori in C perchè io sono veramente pessimo e non riesco a fare quasi nulla.

qualcuno può aiutarmi a fare questi 2 esercizi?
ho allegato gli esercizi in questione.
Esercizi 2-3.png
 
Ultima modifica:
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

void funzione(int righe, int colonne, int matrice[righe][colonne], char nome[20], int x, int minR, int minC)
{
    int i=0,j=0;
    int min=100;
  
    for (i=0; i<righe; i++)
    {
        for(j=0; j<colonne; j++)
        {
            if(matrice[j]<min)
            {
                min = matrice[j];
                minR = i;
                minC = j;
            }
            else
            {
                return matrice[-1][-1];
            }
        }
    }
}

int main()
{
    int righe=0, colonne=0;
    
    printf("Numero righe : ");
    scanf("%d",&righe);
    printf("Numero colonne : ");
    scanf("%d",&colonne);
    
    funzione(matrice, righe, colonne, nome, x, t minR, int minC)   
}
 
Ci sono alcuni errori nel tuo codice, non rispetti la richiesta dell'esercizio; per altro trovo che l'esercizio sia anche scritto male, dire "restituire l'elemento minimo con valore inferiore a X" e poi restituire 2 invece di 1 o 0, non mi sembra il modo più chiaro di scrivere una consegna... e tralascio il resto.

Comunque, veniamo al tuo codice: i parametri vanno passati per riferimento, il ritorno è sbagliato, non puoi accedere a matrice[-1][-1], la posizione non esiste.

Ciò che devi fare è restituire le due coordinate dell'elemento, o usare queste due coordinate per memorizzare -1, qundo il valore non è presente.

Il valore di X viene passato in input, non è un valore che devi decidere tu. Inoltre manca un parametro, il nome del file. E un altro errore è l'accesso agli alementi della matrice: hai due dimensioni, non solo una, devi accedere a (i, j).

Secondo me una firma corretta per la funzione all'esercizio 2 è:

C:
void getCoords(int **matrix, int row, int cols, char *file_name, int x_value, int *x, int *y);

Quindi il tuo codice per l'esercizio 2 sarà più qualcosa di simile a:
C:
void getCoords(int **matrix, int row, int cols, char *file_name, int x_value, int *x, int *y) {
{
    int i=0,j=0;
  
    for (i=0; i<righe; i++)
    {
        for(j=0; j<colonne; j++)
        {
            if(matrice[i][j] < x_value)
            {
                *x = i;
                *y = j;
            }
        }
    }
  
    *x = -1;
    *y = -1;
}

rimane sbagliato comunque: dalla consegna non mi sembra chiarissmo, ma secondo me vuole che restituisci le coordinate dell'elemento "immediatamente inferiore" a X; o in altri termini, quel numero che sottratto a X ti da una differenza inferiore rispetto agli altri. Penso questo guardando l'esempio che fa: per restituire (0,1) da quella matrice viene considerato come valore inferiore il numero 2, e non i numeri 0 e 1; quindi mi sembra verosimile.

In tal caso dovrai inventarti altro; il primo modo veloce che mi viene in mente, è tenere traccia in una variabile della differenza tra matrix[i][j] - x_value e ogni volta che questa differenza è minore della volta precedente, salvare le nuove coordinate x e y. Non so se sono stato chiaro, chiedi pure in caso contrario.
Fatto ciò dovrai scrivere su un file la matrice, con il separatore che vuole il tuo prof.

Puoi anche chiedere al tuo prof se è questo che intende, per levarsi il dubbio...

Per l'altro esercizio vediamo in seguito; anche qui non è esattamente chiara come consegna.
 
si ora l'esercizio 2 lo ho completato ma in modo un pò diverso perchè il prof non lo voleva come hai fatto tu prima.

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

void funzione(int righe, int colonne, int matrice[100][100], int x, char nome[20], int *posx, int *posy)
{
    int i=0,j=0;
    int min = matrice[0][0];
    *posx = 0;
    *posy = 0;
    
    for (i=0; i<righe; i++)
    {
        for(j=0; j<colonne; j++)
        {
            if(matrice[i][j]<min)
            {
                min = matrice[i][j];
                *posx = i;
                *posy = j;
            }
        }
    }
    
    if(min > x)
    {
        *posx = -1;
        *posy = -1;
    }
    
    FILE *fp = NULL;
    fp=fopen(nome,"w");
    if(fp!=NULL)
    {
        for(i=0; i<righe; i++)
        {
            for(j=0; j<colonne; j++)
            {
                if(j != 0)
                {
                    fprintf(fp, "!");
                }
                fprintf(fp, "%d", matrice[i][j]);
            }
            fprintf(fp, "\n");
        }
        fprintf(fp, "-1");
    }
    else
        perror("errore nella visualizzazione\n");
    fclose(fp);
}

int main()
{
    int righe, colonne, x;
    int posx, posy;
    int i, j;
    srand(time(NULL));

    printf("Numero righe : ");
    scanf("%d",&righe);
    printf("Numero colonne : ");
    scanf("%d",&colonne);
    printf("indica il valore di x: ");
    scanf("%d", &x);
    
    int matrice[100][100];
    char nome[20];

    printf("Digita il nome del file da creare : ");
    scanf("%s",nome);
    printf("Hai deciso di creare %s file\n",nome);
    
    for(i=0; i<righe; i++)
    {
        for(j=0; j<colonne; j++)
        {
            matrice[i][j] = rand()%10;
            printf("%d  ", matrice[i][j]);
        }
        printf("\n");
    }

    funzione(righe, colonne, matrice, x, nome, &posx, &posy);

    printf("posizione del numero minimo: R.%d    C.%d", posx, posy);
    return 0;
}



l'esercizio 3 non ho idee ancora anche perchè non bene presente cosa fare con il vettore col tappo.

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

int a[6] = {3,6,4,1,9,-1};

void funzione(int a[5])
{
    int x=0, p=3;
    
    if(x<p)
    {
        x=x*2;
    }
    else
    {
        x=-1;
    }
    
}

int main()
{
    printf("%d", a[6]);
    funzione(a);
}
 
Ah, vuole l'ultimo minimo, "a caso" diciamo. Va bene, è più semplice allora.

Non ti serve fare questo però:
C:
    *posx = 0;
    *posy = 0;

sono variabili che vai a riempire (assegnando un valore) in ogni caso, non effettui operazioni prima.

Questo puoi farlo su una sola riga:
C:
    FILE *fp = NULL;
    fp=fopen(nome,"w");
  
   // Ovvero:
   
    FILE *fp = fopen(nome,"w");

State utilizzando ANSI C o una versione superiore, come C 99? Poichè nel secondo caso tutte le variabili locali dei cicli che usi per contare, puoi mantenerle appunto locali al ciclo, quindi puoi fare così:

C:
    for (int i=0; i<righe; i++)
    {
        for(int j=0; j<colonne; j++)
        {
            // Codice...
       }
 }

Per l'esercizio 3 invece.
Ti consiglierei prima di tutto di dare nomi migliori / più appropriati, a variabili e funzioni: "funzione", come nomi di una funzione, non vuol dire nulla.

A parte questo, secondo me ciò che devi fare è prima di tutto leggere in input un array di N elementi e concluderlo quando inserisci ad esempio -1 da tastiera (questo -1 è il tappo, praticamente).

Poi devi fare un ciclo, dove per ogni elemento, verifichi le condizioni di cui sopra: i < p allora numbers[i] *= 2 e così per le altre 2 condizioni.
Devi mantenere anche un contatore delle cancellazioni che incrementerai quando ti troverai in una posizione > di p E l'elemento in questione sarà uguale a X. Poi restituirai questo valore.

Qui il dubbio è cosa intenda il tuo prof per "cancellato"... se vuole che modifichi il suo valore, oppure se la cancellazione è "virtuale", ovvero che avviene incrementando la variabile contatore delle cancellazioni (potresti farlo così nel dubbio, e nel mentre chiedere delucidazioni in merito). ;)
 
Allora credo di aver capito, forse ci sono, se è ancora sbagliato ti prego non mi insultare hahaha.
come cancellato intende sostituire il numero con -1.

C:
int a[6] = {3,6,4,1,9,-1};

void cancellazione()
{
    int x=0, i=0, p=0, canc=0;
   
    while(a[i]!=-1)
    {
        if(i<p)
        {
            x=a[i];
            x=x*2;
            i=i+1;
        }
        if(i>p)
        {
            x=-1;
            canc=canc+1;
            i=i+1;
        }
    }
}

int main()
{
    int canc;
    int size = sizeof(a)/sizeof(a[0]);
     
       for (int i=0; i<size; i++)
    {    
        printf("%d ", a[i]);    
    }     
   
    cancellazione();
    printf("numero di cancellazioni effettuate: %d", canc);
}