salve a tutti..sono nuovo nel forum..mi sono iscritto perchè spero che qualcuno possa aiutarmi a risolvere un paio di problemi con un programma in C...il programma è questo :"Sia dato un file, il cui nome viene passato come parametro sulla linea di comando, che contiene la descrizione di un insieme di rettangoli posizionati su una matrice di punti. Sia definito sulla matrice un sistema di coordinate cartesiane dove ciascuna coordinata e' un numero intero che varia da 0 a N estremi inclusi, l’origine e' il punto in alto a sinistra e le coordinate aumentano da sinistra a destra e dall’alto al basso. N e' una costante nota a priori e definita attraverso una direttiva define. Ogni riga del file contiene la descrizione di un rettangolo nel seguente formato:
<x1> <y1> <x2> <y2>
dove (<x1>, <y1>) sono le coordinate del punto in alto a sinistra del rettangolo mentre (<x2>, <y2>) sono le coordinate del punto in basso a destra (quindi x1 x2 e y1 y2).
Il numero totale di rettangoli (ovvero di righe del file) non e' noto a priori. Non assumere alcun tipo di ordinamento delle righe stesse.
Scrivere un programma in C per verificare che tutti i rettangoli descritti nel file siano privi di sovrapposizioni (occupino cioè caselle della griglia disgiunte). Il programma deve controllare il file il cui nome viene passato sulla linea di comando, posizionare i rettangoli nella matrice e scrivere il messaggio “Nessuna sovrapposizione tra i rettangoli” se il file soddisfa il criterio oppure “I rettangoli hanno (almeno) una sovrapposizione” in caso contrario. In caso di errore nel formato del file (interi non compresi tra 0 e N, o tali da non soddisfare le relazioni d’ordine previste) il programma deve produrre il messaggio “Errore nel formato del file” ed interrompere l’esecuzione.".......
.....questo è il mio programma ..nella prima parte creo il file che poi andrò ad analizzare in lettura
codice:
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(int argc,char *argv[])
{
int i,j,r,l,x1,y1,x2,y2,flag,s;
char str[12],matrice[N][N];
FILE*fp;
fp=fopen("rett.txt","w");
if(fp==NULL){
printf ("\nerrore apertura file in write\n");
return -1;
}
for(i=0;i<5;i++){
printf("\nscrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno \n");
gets(str);
fprintf(fp,"%s\n",str);
}
r=fclose(fp);
if(r==EOF){
printf("\nerrore chiusura file in write\n");
return -2;
}
if(argc!=2){
printf("\nerrore numero di parametri passati da linea di comando\n");
return -3;
}
fp=fopen(argv[1],"r");
if(fp==NULL){
printf("\nerrore apertura file in read\n");
return-4;
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
matrice[i][j]='_';
}
}
flag=0;
s=1;
while(fgets(str,12,fp)!=NULL){
l=sscanf(str,"%d %d %d %d",&x1,&y1,&x2,&y2);
printf(" num par=%d in pos %d\n",l,s);
if(l!=4){
printf("\nerrore nella formattazione dei parametri da stringa ad interi:num par= %d in pos %d\n",l,s);
return -5;
}
s++;
if(x1>=x2||y1>=y2||x1<0||x1>=N||y1<0||y1>=N||x2<0||x2>=N||y2<0||y2>=N){
printf("\nerrore nel formato del file\n");
return -6;
}
for(i=x1;i<=x2;i++){
for(j=y1;j<=y2;j++){
if(matrice[i][j]=='_')
matrice[i][j]='1';
else{
matrice[i][j]='2';
flag=1;
}
}
}
}
r=fclose(fp);
if(r==EOF){
printf("\nerrore chiusura file in read\n");
return -7;
}
if(flag==0)
printf("\nnon ci sono sovrapposizioni\n");
else
printf("\nc'e' almeno una sovrapposizione\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++){
if(matrice[i][j]!='_')
printf("\nmatrice[%d][%d]=%c\n",i,j,matrice[i][j]);
}
for(i=0;i<N;i++){
printf("\n");
for(j=0;j<N;j++)
printf("%c",matrice[i][j]);
}
}
return 0;
}
l'errore sta nel fatto che se io metto 4 numeri di massimo 2 cifre uno spazio per ogni numero e alla fine un ritorno a capo..sono 12 caratteri ma mi da un errore mentre se aumento la grandezza della stringa che deve ricevere i i dati in lettura del file va tutto bene..anche se a me sembra che siano proprio 12 i caratteri...inoltre il contatore quella 's',funziona male non so perchè mi mette una posizione in più..io lo faccio partire da uno e ogni volta che passo la possibiltà di errore lo incremento..quindi ricapitolando se metto 4 numeri di 2 cifre ciascuno con spazio tra i numeri e \n finale questo è l'effetto
scrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno
warning: this program uses gets(), which is unsafe.
11 22 33 44
scrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno
1 2 3 4
scrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno
1 2 3 4
scrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno
1 2 3 4
scrivi quattro numeri intervallati da spazio di massimo 2 cifre ciascuno
1 2 3 4
num par=4 in pos 1
num par=-1 in pos 2
errore nella formattazione dei parametri da stringa ad interi:num par= -1 in pos 2
come vedete la posizione non corrisponde anche se è la prima lui segna la seconda
.....grazie a tutti