#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define CLEAR_INPUT while(getchar() != '\n') /*void*/
#define BUFFER 15
typedef struct dadosMoeda{
int NiM;
char Metal[ BUFFER] ;
float Valor;
int Stock;
} imoeda;
//Abrir stream para um ficheiro
FILE* fileOpen( FILE* fp, char * fileName) {
if ( ( fp
= fopen ( fileName
, "a+" ) ) == NULL
) { printf ( "Erro ao abrir ficheiro!\n " ) ; }
return fp;
}
//Mostrar info de uma moeda
void MostraMoeda( imoeda moeda) {
printf ( "NiM da moeda: %d\n " , moeda.
NiM ) ; printf ( "Metal da moeda: %s\n " , moeda.
Metal ) ; printf ( "Valor da moeda: %.2f\n " , moeda.
Valor ) ; printf ( "Stock da moeda: %d\n " , moeda.
Stock ) ; }
//Mostrar menu do programa
void mostraMenu( void ) {
printf ( "\t Atualizar Stock\n " ) ; }
//Actualiza stock de uma moeda
int ActualizaStock( int nim, imoeda** moeda) {
int i = 0 ;
while ( moeda[ i] != NULL) {
if ( moeda[ i] -> NiM == nim)
if ( ( -- ( moeda[ i] -> Stock) ) == 0 ) {
moeda[ i] -> Stock = 0 ;
printf ( "Ruptura de Stock!\n " ) ; return 0 ;
}
}
return moeda[ i] -> Stock;
}
//Contar registos presentes no ficheiro
int ContaRegistos( FILE* fp) {
imoeda tmpMoeda;
int regCounter = 0 ;
while ( fread ( & tmpMoeda
, sizeof ( imoeda
) , 1 , fp
) ) { regCounter++;
}
return regCounter;
}
//Alocar memória para dados de moedas
imoeda* AlocaMemoria( int RegCount) {
imoeda* tmpmoeda = NULL;
if ( ( tmpmoeda
= malloc ( sizeof ( imoeda
) * RegCount
) ) == NULL
) { }
return tmpmoeda;
}
//Pede dados para moeda
imoeda PedeInfoMoeda( ) {
imoeda moeda = { 0 } ;
char op;
int check = 0 ;
while ( scanf ( "%d" , & moeda.
NiM ) != 1 || moeda.
NiM < 0 ) { printf ( "NiM inválido! Tente de novo:\n " ) ; }
CLEAR_INPUT;
printf ( "Insira o metal: [o]uro, [p]rata, [c]obre, o[u]tros\n " ) ; while ( scanf ( "%c" , & op
) != 1 || ! check
) case 'o' : strcpy ( moeda.
Metal , "Ouro" ) ; check = 1 ;
break ;
case 'p' : strcpy ( moeda.
Metal , "Prata" ) ; check = 1 ;
break ;
case 'c' : strcpy ( moeda.
Metal , "Cobre" ) ; check = 1 ;
break ;
case 'u' : strcpy ( moeda.
Metal , "Outros" ) ; check = 1 ;
break ;
default : printf ( "Metal inválido! Tente de novo:\n " ) ; check = 0 ;
CLEAR_INPUT;
}
while ( scanf ( "%f" , & moeda.
Valor ) != 1 || moeda.
Valor < 0.0 ) printf ( "Valor inválido! Tente de novo:\n " ) ; while ( scanf ( "%d" , & moeda.
Stock ) != 1 || moeda.
Stock < 0 ) printf ( "Stock inválido! Tente de novo:\n " ) ;
return moeda;
}
int main( int argc, char ** argv) {
imoeda * tmpbasedados = NULL;
FILE* fpointer = NULL;
int RegFileCount = 0 , i = 0 ;
fpointer = fileOpen( fpointer, "moedas.dat" ) ;
RegFileCount = ContaRegistos( fpointer) ;
tmpbasedados = AlocaMemoria( RegFileCount) ;
printf ( "imoeda size: %zu\n " , sizeof ( imoeda
) ) ; printf ( "tmpbasedados size: %zu\n " , sizeof ( tmpbasedados
) ) ; printf ( "tmpbasedados size 1: %zu\n " , sizeof ( imoeda
) * RegCount
) ; for ( i = 0 ; i < RegFileCount; i++ ) {
fread ( & tmpbasedados
[ i
] , sizeof ( imoeda
) , 1 , fpointer
) ; }
// for(i = 0; i < RegFileCount; i++){
// MostraMoeda(tmpbasedados[i]);
// }
// tmpbasedados = PedeInfoMoeda();
// fwrite(&tmpbasedados, sizeof(imoeda), 1, fpointer);
// tmpbasedados = PedeInfoMoeda();
// fwrite(&tmpbasedados, sizeof(imoeda), 1, fpointer);
// fseek(fpointer, 0, SEEK_SET);
// fread(&tmpbasedados, sizeof(imoeda), 1, fpointer);
// MostraMoeda(tmpbasedados);
// fread(&tmpbasedados, sizeof(imoeda), 1, fpointer);
// MostraMoeda(tmpbasedados);
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNkZWZpbmUgQ0xFQVJfSU5QVVQgd2hpbGUoZ2V0Y2hhcigpICE9ICdcbicpIC8qdm9pZCovCiNkZWZpbmUgQlVGRkVSIDE1Cgp0eXBlZGVmIHN0cnVjdCBkYWRvc01vZWRhewogICAgaW50IE5pTTsKICAgIGNoYXIgTWV0YWxbQlVGRkVSXTsKICAgIGZsb2F0IFZhbG9yOwogICAgaW50IFN0b2NrOwp9aW1vZWRhOwoKLy9BYnJpciBzdHJlYW0gcGFyYSB1bSBmaWNoZWlybwpGSUxFKiBmaWxlT3BlbihGSUxFKiBmcCwgY2hhciogZmlsZU5hbWUpewogICAgaWYoKGZwID0gZm9wZW4oZmlsZU5hbWUsICJhKyIpKSA9PSBOVUxMKXsKICAgICAgICBwcmludGYoIkVycm8gYW8gYWJyaXIgZmljaGVpcm8hXG4iKTsKICAgICAgICBleGl0KC0xKTsKICAgIH0KICAgIHJldHVybiBmcDsKfQoKLy9Nb3N0cmFyIGluZm8gZGUgdW1hIG1vZWRhCnZvaWQgTW9zdHJhTW9lZGEoaW1vZWRhIG1vZWRhKXsKICAgIHByaW50ZigiTmlNIGRhIG1vZWRhOiAlZFxuIiwgbW9lZGEuTmlNKTsKICAgIHByaW50ZigiTWV0YWwgZGEgbW9lZGE6ICVzXG4iLCBtb2VkYS5NZXRhbCk7CiAgICBwcmludGYoIlZhbG9yIGRhIG1vZWRhOiAlLjJmXG4iLCBtb2VkYS5WYWxvcik7CiAgICBwcmludGYoIlN0b2NrIGRhIG1vZWRhOiAlZFxuIiwgbW9lZGEuU3RvY2spOwp9CgovL01vc3RyYXIgbWVudSBkbyBwcm9ncmFtYQp2b2lkIG1vc3RyYU1lbnUodm9pZCl7CiAgICBwcmludGYoIk1lbnUgUHJpbmNpcGFsXG4iKTsKICAgIHByaW50ZigiXHRJbnNlcmlyIE1vZWRhXG4iKTsKICAgIHByaW50ZigiXHRBdHVhbGl6YXIgU3RvY2tcbiIpOwogICAgcHJpbnRmKCJcdFNhaXJcbiIpOwp9CgovL0FjdHVhbGl6YSBzdG9jayBkZSB1bWEgbW9lZGEKaW50IEFjdHVhbGl6YVN0b2NrKGludCBuaW0sIGltb2VkYSoqIG1vZWRhKXsKICAgIGludCBpID0gMDsKICAgIHdoaWxlKG1vZWRhW2ldICE9IE5VTEwpewogICAgICAgIGlmIChtb2VkYVtpXS0+TmlNID09IG5pbSkKICAgICAgICAgICAgaWYoKC0tKG1vZWRhW2ldLT5TdG9jaykpID09IDApewogICAgICAgICAgICAgICAgbW9lZGFbaV0tPlN0b2NrID0gMDsKICAgICAgICAgICAgICAgIHByaW50ZigiUnVwdHVyYSBkZSBTdG9jayFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtb2VkYVtpXS0+U3RvY2s7Cn0KCi8vQ29udGFyIHJlZ2lzdG9zIHByZXNlbnRlcyBubyBmaWNoZWlybwppbnQgQ29udGFSZWdpc3RvcyhGSUxFKiBmcCl7CiAgICBpbW9lZGEgdG1wTW9lZGE7CiAgICBpbnQgcmVnQ291bnRlciA9IDA7CiAgICBmc2VlayhmcCwgMCwgU0VFS19TRVQpOwogICAgd2hpbGUoZnJlYWQoJnRtcE1vZWRhLCBzaXplb2YoaW1vZWRhKSwgMSwgZnApKXsKICAgICAgICByZWdDb3VudGVyKys7CiAgICB9CiAgICByZXR1cm4gcmVnQ291bnRlcjsKfQoKLy9BbG9jYXIgbWVtw7NyaWEgcGFyYSBkYWRvcyBkZSBtb2VkYXMKaW1vZWRhKiBBbG9jYU1lbW9yaWEoaW50IFJlZ0NvdW50KXsKICAgIGltb2VkYSogdG1wbW9lZGEgPSBOVUxMOwogICAgaWYoKHRtcG1vZWRhID0gbWFsbG9jKHNpemVvZihpbW9lZGEpICogUmVnQ291bnQpKSA9PSBOVUxMKXsKICAgICAgICBwcmludGYoIkVycm8gZGUgbWVtw7NyaWEhXG4iKTsKICAgICAgICBleGl0KC0yKTsKICAgIH0KICAgIHJldHVybiB0bXBtb2VkYTsKfQoKLy9QZWRlIGRhZG9zIHBhcmEgbW9lZGEKaW1vZWRhIFBlZGVJbmZvTW9lZGEoKXsKICAgIGltb2VkYSBtb2VkYSA9IHswfTsKICAgIGNoYXIgb3A7CiAgICBpbnQgY2hlY2sgPSAwOwoKICAgIHByaW50ZigiSXNuc2lyYSBvIE5pTTpcbiIpOwogICAgd2hpbGUoc2NhbmYoIiVkIiwgJm1vZWRhLk5pTSkgIT0gMSB8fCBtb2VkYS5OaU0gPCAwKXsKICAgICAgICBwcmludGYoIk5pTSBpbnbDoWxpZG8hIFRlbnRlIGRlIG5vdm86XG4iKTsKICAgIH0KICAgIENMRUFSX0lOUFVUOwogICAgcHJpbnRmKCJJbnNpcmEgbyBtZXRhbDogW29ddXJvLCBbcF1yYXRhLCBbY11vYnJlLCBvW3VddHJvc1xuIik7CiAgICB3aGlsZShzY2FuZigiJWMiLCAmb3ApICE9IDEgfHwgIWNoZWNrKQogICAgICAgIHN3aXRjaCAodG9sb3dlcihvcCkpIHsKICAgICAgICAgICAgY2FzZSAnbyc6IHN0cmNweShtb2VkYS5NZXRhbCwgIk91cm8iKTsKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gMTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdwJzogc3RyY3B5KG1vZWRhLk1ldGFsLCAiUHJhdGEiKTsKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gMTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdjJzogc3RyY3B5KG1vZWRhLk1ldGFsLCAiQ29icmUiKTsKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gMTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd1Jzogc3RyY3B5KG1vZWRhLk1ldGFsLCAiT3V0cm9zIik7CiAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogIHByaW50ZigiTWV0YWwgaW52w6FsaWRvISBUZW50ZSBkZSBub3ZvOlxuIik7CiAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9JTlBVVDsKICAgICAgICB9CiAgICBwcmludGYoIkluc2lyYSBvIHZhbG9yOlxuIik7CiAgICB3aGlsZShzY2FuZigiJWYiLCAmbW9lZGEuVmFsb3IpICE9IDEgfHwgbW9lZGEuVmFsb3IgPCAwLjApCiAgICAgICAgcHJpbnRmKCJWYWxvciBpbnbDoWxpZG8hIFRlbnRlIGRlIG5vdm86XG4iKTsKICAgIHByaW50ZigiSW5zaXJhIG8gc3RvY2s6XG4iKTsKICAgIHdoaWxlKHNjYW5mKCIlZCIsICZtb2VkYS5TdG9jaykgIT0gMSB8fCBtb2VkYS5TdG9jayA8IDApCiAgICAgICAgcHJpbnRmKCJTdG9jayBpbnbDoWxpZG8hIFRlbnRlIGRlIG5vdm86XG4iKTsKCiAgICByZXR1cm4gbW9lZGE7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndil7CiAgICBpbW9lZGEgKnRtcGJhc2VkYWRvcyA9IE5VTEw7CiAgICBGSUxFKiBmcG9pbnRlciA9IE5VTEw7CiAgICBpbnQgUmVnRmlsZUNvdW50ID0gMCwgaSA9IDA7CgogICAgZnBvaW50ZXIgPSBmaWxlT3BlbihmcG9pbnRlciwgIm1vZWRhcy5kYXQiKTsKICAgIFJlZ0ZpbGVDb3VudCA9IENvbnRhUmVnaXN0b3MoZnBvaW50ZXIpOwogICAgdG1wYmFzZWRhZG9zID0gQWxvY2FNZW1vcmlhKFJlZ0ZpbGVDb3VudCk7CiAgICBwcmludGYoImltb2VkYSBzaXplOiAlenVcbiIsIHNpemVvZihpbW9lZGEpKTsKICAgIHByaW50ZigidG1wYmFzZWRhZG9zIHNpemU6ICV6dVxuIiwgc2l6ZW9mKHRtcGJhc2VkYWRvcykpOwogICAgcHJpbnRmKCJ0bXBiYXNlZGFkb3Mgc2l6ZSAxOiAlenVcbiIsIHNpemVvZihpbW9lZGEpICogUmVnQ291bnQpOwogICAgZm9yKGkgPSAwOyBpIDwgUmVnRmlsZUNvdW50OyBpKyspewogICAgICAgIGZyZWFkKCZ0bXBiYXNlZGFkb3NbaV0sIHNpemVvZihpbW9lZGEpLCAxLCBmcG9pbnRlcik7CiAgICB9CiAgICAvLyBmb3IoaSA9IDA7IGkgPCBSZWdGaWxlQ291bnQ7IGkrKyl7CiAgICAvLyAgICAgTW9zdHJhTW9lZGEodG1wYmFzZWRhZG9zW2ldKTsKICAgIC8vIH0KICAgIC8vIHRtcGJhc2VkYWRvcyA9IFBlZGVJbmZvTW9lZGEoKTsKICAgIC8vIGZ3cml0ZSgmdG1wYmFzZWRhZG9zLCBzaXplb2YoaW1vZWRhKSwgMSwgZnBvaW50ZXIpOwogICAgLy8gdG1wYmFzZWRhZG9zID0gUGVkZUluZm9Nb2VkYSgpOwogICAgLy8gZndyaXRlKCZ0bXBiYXNlZGFkb3MsIHNpemVvZihpbW9lZGEpLCAxLCBmcG9pbnRlcik7CiAgICAvLyBmc2VlayhmcG9pbnRlciwgMCwgU0VFS19TRVQpOwogICAgLy8gZnJlYWQoJnRtcGJhc2VkYWRvcywgc2l6ZW9mKGltb2VkYSksIDEsIGZwb2ludGVyKTsKICAgIC8vIE1vc3RyYU1vZWRhKHRtcGJhc2VkYWRvcyk7CiAgICAvLyBmcmVhZCgmdG1wYmFzZWRhZG9zLCBzaXplb2YoaW1vZWRhKSwgMSwgZnBvaW50ZXIpOwogICAgLy8gTW9zdHJhTW9lZGEodG1wYmFzZWRhZG9zKTsKICAgIGZyZWUodG1wYmFzZWRhZG9zKTsKICAgIGZjbG9zZShmcG9pbnRlcik7CiAgICByZXR1cm4gMDsKfQoK