Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-01-2015, 16:35   #1
caramelleamare
Member
 
Iscritto dal: Jan 2010
Messaggi: 166
[C] scanf ?

Se è possibile dovrei risolvere per domani, grazie.
Questa funzione, funziona. Fa quello che deve, posso poi continuare con tutte le altre operazioni e tutto va bene. Ma, quando chiudo il programma, sia da selezione del menu che ho creato, sia direttamente la finestra, mi va in segmentazione. SOLO se ho usato questa funzione di inserimento dati.
Se cancello lo studente inserito non da più problemi. !?
Se da questa funzione elimino le scanf alle stringhe nome e cognome... nessun problema. Davvero non capisco.

Codice:
void inserisciStudente(STUDENTE* studenti) {
	int i;
	char ch;

	system("cls");
     fflush(stdin);
     printf("INSERIMENTO NUOVO STUDENTE \n\n");
     fflush(stdin);
     printf("\nNome: ");
     scanf("%49[^\n]", studenti[n_stud].nome);
     fflush(stdin);
     printf("Cognome: ");
     scanf("%49[^\n]", studenti[n_stud].cognome);
     studenti[n_stud].matricola = ++matricola;
     printf("Matricola assegnata: 00%d\n\n", matricola);
     printf("Inserire voti\n(zero per esame non sostenuto):\n\n");
     for(i = 0; i < NUM_MAT; i++) {
          printf("\t\t%s: ", materia[i].materia);
          studenti[n_stud].voto[i] = controlloValore(VOTO_MIN, VOTO_MAX);
     }
     n_stud++;
     printf("\n\n");
     system("PAUSE");
     return;
}
Questo è tutto il codice se volete testarlo:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUD 200
#define NUM_MAT 6
#define MIN_MATRICOLA 1
#define MAX_MATRICOLA 200
#define VOTO_MIN 18
#define VOTO_MAX 30

int n_stud = 0;
int matricola = 0;

// DICHIARAZIONE STRUTTURA

typedef struct STUDENTE{
	char nome[50];
	char cognome[50];
	int matricola;
	int voto[NUM_MAT];
}STUDENTE;

struct I_anno{
	char materia[50];
} materia[NUM_MAT] = {{"Programmazione"},{"Analisi"},{"Algebra e Geometria"},{"Architetture"},{"Inglese"},{"Algoritmi"}};


// PROTOTIPI FUNZIONE

int controlloValore(int, int);
void inserisciStudente(STUDENTE*);
void nuoviInserimenti(STUDENTE*, int);
void cancellaStudente(STUDENTE*);
void cercaStudente(STUDENTE*);
void stampaArchivio(STUDENTE*);
void noEsame(STUDENTE*);
void fuoriCorso(STUDENTE*);

//INIZIO MAIN

int main() {

	int i, end = 0;
	char ch[1];
	STUDENTE* studenti;

     studenti = (STUDENTE*)malloc(MAX_STUD * sizeof(STUDENTE));
     if(studenti == NULL) {
          printf("Errore di allocazione!\n\n");
          system("PAUSE");
          return;
     }
	do {
		system("cls");
		printf("SEGRETERIA STUDENTI\n\n\n");
		printf("Scegli un'operazione selezionando il codice\n(Premere 'Q' per terminare)\n\n\n");
		printf("A -> inserisci studente \nB -> fuori corso \nC -> cerca studente\n");
		printf("D -> cancella studente \nE -> archivio studenti \nF -> esame non dato\n\nSelezione: ");
          scanf("%s", ch);
          strupr(ch);

		switch(ch[0]) {
               case 'A':
                    inserisciStudente(studenti);
                    break;
               case 'B':
                    fuoriCorso(studenti);
                    break;
               case 'C':
                    cercaStudente(studenti);
                    break;
               case 'D':
                    cancellaStudente(studenti);
                    break;
               case 'E':
                    stampaArchivio(studenti);
                    break;
               case 'F':
                    noEsame(studenti);
                    break;
               case 'Q':
                    end++;
                    break;
               default:
                    fflush(stdin);
                    printf("\n\nCodice operazione non corretto.\n\n");
                    system("PAUSE");
                    break;
               }
     }
     while(end == 0);
     free(studenti);
     return 0;
}

// FUNZIONE INSERIMENTO STUDENTE

void inserisciStudente(STUDENTE* studenti) {
	int i;
	char ch;

	system("cls");
     fflush(stdin);
     printf("INSERIMENTO NUOVO STUDENTE \n\n");
     fflush(stdin);
     printf("\nNome: ");
     scanf("%49[^\n]", studenti[n_stud].nome);
     fflush(stdin);
     printf("Cognome: ");
     scanf("%49[^\n]", studenti[n_stud].cognome);
     studenti[n_stud].matricola = ++matricola;
     printf("Matricola assegnata: 00%d\n\n", matricola);
     printf("Inserire voti\n(zero per esame non sostenuto):\n\n");
     for(i = 0; i < NUM_MAT; i++) {
          printf("\t\t%s: ", materia[i].materia);
          studenti[n_stud].voto[i] = controlloValore(VOTO_MIN, VOTO_MAX);
     }
     n_stud++;
     printf("\n\n");
     system("PAUSE");
     return;
}

// FUNZIONE CANCELLA STUDENTE

void cancellaStudente(STUDENTE* studenti) {
	int i, j, elimina;

	system("cls");
     fflush(stdin);
	printf("CANCELLAZIONE STUDENTE\n\n");
	if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
	}
	else {
          printf("Numero di matricola dello studente da eliminare: ");
          elimina = controlloValore(MIN_MATRICOLA, MAX_MATRICOLA);
          for(i = 0; i < n_stud; i++) {
               if(studenti[i].matricola == elimina) {
                    printf("\n\nOperazione avvenuta con successo!\n");
                    printf("Lo studente %s %s e' stato rimosso dall'archivio.\n\n", studenti[i].nome, studenti[i].cognome);
                    for(j = i; j < n_stud; j++) {
                         studenti[j] = studenti[j + 1];
                    }
                    n_stud--;
                    system("PAUSE");
                    return;
               }
          }
          printf("\n\nIl numero di matricola inserito non e' in archivio.\n\n");
	}
     system("PAUSE");
     return;
}

// FUNZIONE RICERCA SINGOLO STUDENTE

void cercaStudente(STUDENTE* studenti) {

	char ch[1], cerca_nome[50], cerca_cognome[50];
	int i, j, conta = 0, cerca_matricola;

	system("cls");
	printf("RICERCA STUDENTE \n\n");

	if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
          system("PAUSE");
          return;
	}
	fflush(stdin);
	printf("Scegli il tipo di ricerca da effettuare: \n\n\nNome       -->  (N)\nCognome    -->  (C)\nMatricola  -->  (M)\n\n\nInserisci il codice:  ");
	scanf("%s", &ch[0]);
	strupr(ch);
	switch(ch[0]) {
		case 'N':
			fflush(stdin);
			printf("\n");
               printf("Digita il nome dello studente:  ");
			scanf("%s", cerca_nome);
			for(i = 0; i < n_stud; i++) {
				if(strcmp(studenti[i].nome, cerca_nome) == 0) {
                         conta++;
					printf("\n\nMatricola: %d\n", studenti[i].matricola);
                         printf("\nNome: %s %s, ", studenti[i].nome, studenti[i].cognome);
                         printf("\n\n\tVoti: \n");
                         for(j = 0; j < NUM_MAT; j++) {
                              printf("\t%s: %d\n", materia[j].materia, studenti[i].voto[j]);
                         }
				}
			}
			if(conta == 0) {
                    printf("\n\nNome non trovato!\n\n");
			}
			break;
		case 'C':
			fflush(stdin);
			printf("\n");
			printf("Digita il cognome dello studente:  ");
			scanf("%s", cerca_cognome);
			for(i = 0; i < n_stud; i++) {
				if(strcmp(studenti[i].cognome, cerca_cognome) == 0) {
                         conta++;
					printf("\n\nMatricola: %d\n", studenti[i].matricola);
                         printf("\nNome: %s %s, ", studenti[i].nome, studenti[i].cognome);
                         printf("\n\n\tVoti: \n");
                         for(j = 0; j < NUM_MAT; j++) {
                              printf("\t%s: %d\n", materia[j].materia, studenti[i].voto[j]);
                         }
				}
			}
			if(conta == 0) {
                    printf("\n\nCognome non trovato!\n\n");
			}
			break;
		case 'M':
			fflush(stdin);
			printf("\n");
			printf("Digita la matricola dello studente:  ");
			scanf("%d", &cerca_matricola);
			for(i = 0; i < n_stud; i++) {
				fflush(stdin);
				if(studenti[i].matricola == cerca_matricola) {
                         conta++;
					printf("\n\nMatricola: %d\n", studenti[i].matricola);
                         printf("\nNome: %s %s, ", studenti[i].nome, studenti[i].cognome);
                         printf("\n\n\tVoti: \n");
                         for(j = 0; j < NUM_MAT; j++) {
                              printf("\t%s: %d\n", materia[j].materia, studenti[i].voto[j]);
                         }
				}
			}
			if(conta == 0) {
                    printf("\n\nMatricola non trovata!\n\n");
			}
			break;
		default:
			printf("\n\nIl carattere inserito non corrisponde a nessuna delle scelte possibili.\n");
               system("PAUSE");
               return;
	}
	printf("\n\n");
	system("PAUSE");
     return;
}

// FUNZIONE STAMPA ARCHIVIO

void stampaArchivio(STUDENTE* studenti) {
	int i, j;

	system("cls");
	fflush(stdin);
	printf("ARCHIVIO STUDENTI\n\n");
	if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
          system("PAUSE");
          return;
	}
     i = 0;
     do {
          printf("\nMatricola: %d\n", studenti[i].matricola);
          printf("\nNome: %s %s, ", studenti[i].nome, studenti[i].cognome);
          printf("\n\n\tVoti: \n\n");
          for(j = 0; j < NUM_MAT; j++) {
               printf("\t%s: %d\n", materia[j].materia, studenti[i].voto[j]);
          }
          i++;
     } while(i < n_stud);
     printf("\n\n");
	system("PAUSE");
	return;
}

// STUDENTI SENZA SPECIFICO ESAME

void noEsame(STUDENTE* studenti) {
     int i, j, ID_esame, flag;

     system("cls");
     printf("STUDENTI SENZA SPECIFICO ESAME\n\n\n");

     if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
          system("PAUSE");
          return;
	}
     printf("Elenco esami:\n\n");
     printf("01 -> Programmazione\n");
     printf("02 -> Analisi\n");
     printf("03 -> Algebra e Geometria\n");
     printf("04 -> Architetture\n");
     printf("05 -> Inglese\n");
     printf("06 -> Algoritmi\n\n");

     printf("Scegli codice: ");
     scanf("%d", &ID_esame);

     printf("\nChi non ha dato %s:\n\t", materia[ID_esame - 1].materia);
     flag = 0;
     for(i = 0; i < n_stud; i++) {
          for(j = 0; j < NUM_MAT; j++) {
               if(studenti[i].voto[ID_esame - 1] == 0) {
                    flag++;
               }
          }
          if(flag) {
               printf("\nMatricola %d: ", studenti[i].matricola);
               printf("%s %s", studenti[i].nome, studenti[i].cognome);
          }
     }
     if(!flag) {
          printf("\n\n\n\tNessuno, tutti bravi qua dentro.\n\n");
     }
     printf("\n\n");
     system("PAUSE");
     return;
}

// FUNZIONE FUORI CORSO

void fuoriCorso(STUDENTE* studenti) {
     int i, j, flag_1, flag_2;

     system("cls");
     printf("STUDENTI FUORI CORSO\n\n\n");
     if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
          system("PAUSE");
          return;
	}
     flag_2 = 0;
     for(i = 0; i < n_stud; i++) {
          flag_1 = 0;
          for(j = 0; j < NUM_MAT; j++) {
               if(studenti[i].voto[j] == 0) {
                    flag_1++;
                    flag_2++;
               }
          }
          if(flag_1 > 0) {
               printf("\nMatricola: %d\n", studenti[i].matricola);
               printf("Nome: %s %s, ", studenti[i].nome, studenti[i].cognome);
               printf("\n\nEsami non sostenuti: \n\n");
               for(j = 0; j < NUM_MAT; j++) {
                    if(studenti[i].voto[j] == 0)
                    printf("\t%s\n", materia[j].materia);
               }
          }
     }
     if(flag_2 == 0) {
          printf("Nessuno studente fuoricorso.\n\n");
     }
     system("PAUSE");
     return;
}

// FUNZIONE CONTROLLO VALORE

int controlloValore(int MIN, int MAX) {			     // tramite min e max posso usare la funzione senza modificarla di volta in volta
	int valore, check;

	do {
		fflush(stdin);
		check = scanf("%d", &valore);
		if(check) {			                    // c restituisce valori booleani quindi chiedo se check esiste(1) cioè se è stato letto valore
			if(valore >= MIN && valore <= MAX || valore == 0) {		// se è corretto..
				check = 1;                         // check è 1 , TRUE
			}
			else {                                  // altrimenti FALSE e resto nel ciclo
				check = 0;
				printf("\t\tValore non corretto.\n\t\tInserisci un valore tra %d e %d: ", MIN, MAX);
			}
		}
		else {
			check = 0;
			printf("\t\tValore non corretto.\n\t\tInserisci un valore tra %d e %d: ", MIN, MAX);
		}
	}
	while(!check);	                                    // fin che check = 0
     return valore;
}

Ultima modifica di caramelleamare : 15-01-2015 alle 16:50.
caramelleamare è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2015, 19:42   #2
caramelleamare
Member
 
Iscritto dal: Jan 2010
Messaggi: 166
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
Sta stringa di formato mi sembra strana:

Codice:
"%49[^\n]"
puo' essere accettabile ma non mi sembra di averla mai vista prima...
Lo so, faccio per fare esperienza. Per questo ho provato anche con una semplice %s, ma non cambia niente.
Quel formato dice di prendere 49 caratteri escludendo l'invio finale, se non erro.

http://www.cplusplus.com/reference/c...canf/?kw=scanf
caramelleamare è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2015, 21:55   #3
caramelleamare
Member
 
Iscritto dal: Jan 2010
Messaggi: 166
cos'è ddd ?
caramelleamare è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 11:21   #4
caramelleamare
Member
 
Iscritto dal: Jan 2010
Messaggi: 166
Il problema è proprio che non so debuggare. Scrivo codice da tre mesi e perdo molto tempo per capire dove sono alcuni errori. Fin che posso risolver inserendo dei printf qua e la ok, ma a volte non so come procedere e perdo tempo inutile.
Il problema nel frattempo è stato risolto: nel main, dichiaro ch[1] invece che ch[2] per il carattere \0.
Un debugger me lo avrebbe segnalato?
caramelleamare è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 15:05   #5
caramelleamare
Member
 
Iscritto dal: Jan 2010
Messaggi: 166
Per il momento windows, solo quello. Scrivo con CodeBlocks, all'inizio con Dev.
Il secondo ha un suo debugger ho visto, mentre in CB le icone del debug sono inattive, devo installarcene uno io? Come si fa?
Ci sono guide per prendere dimestichezza col debug?
Sono convinto fin dall'inizio che sia fondamentale saperlo usare bene, prima che vada in loop il cervello per niente.
caramelleamare è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Atlas 960E SuperPoD, la risposta di Huaw...
IA militare e nucleare: esperti USA e ci...
Dieci mini-reattori nucleari in Europa d...
CONTROL Resonant su PC: Path Tracing, Ra...
ColorOS 17 arriva su circa 90 dispositiv...
GTA VI, il multiplayer potrebbe debuttar...
Aggiornamento KB5002914 rompe Excel: ecc...
Processo Huawei a Brooklyn: l'FBI mostra...
WhatsApp introduce nuovi temi per le cha...
NVIDIA, Google e Emerald AI uniscono le ...
iPhone 18 Pro Max, il test sulla vapor c...
Fine estate in giardino: le proposte sco...
Batterie allo stato solido dietro l'ango...
Gears of War: E-Day raggiunge la fase Go...
GTA 6 avrà un'edizione fisica, ma...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v