Forgive me for any writing mistakes english is not my first languange.
I'm coding the MasterMind (if you are not familiar with the game you can consult its rules in here https://magisterrex.files.wordpress.com/2014/07/mastermindrules.pdf) game in C to take part in a larger project, i pretty much finish it but i'm stuck in the function when the program calculates the number of white pieces; a white piece is basically when the player guess's the right colour in the wrong spot.
My code for that function doesn't work if the board (generate at random by the computer) as two pieces of the same color and the player guesses one of them in the wrong place.
The code is in portuguese (my native tongue) i hope that doesn't prevent my from getting help.
Thanks for yout help
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define STRING_MAXIMO 10
void gerarTabuleiro(int nivel, char (*tabuleiro)[STRING_MAXIMO])
{
//Declaração e inicialização de variaveis locais
//Arrays de onde serão escolhidas aleatoriamente as cores de acordo com o nivel escolhido
char coresNivel1[6][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano"};
char coresNivel2[7][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho"};
char coresNivel3[8][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho", "roxo"};
int index;//Variavel que controlar todos os ciclos desta função
srand(time(NULL));//Iremos alimentar o tabueleiro com uma uma nova combinação de todas as vezes (rand irá se basear na data e hora do sistema)
if(nivel == 1){//Nivel 1 selecionado
for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (4 peças)
strcpy(tabuleiro[index], coresNivel1[rand() % 6]);//Será escolhido aleatoriamente uma cor do array pre-determinado
}
else if(nivel == 2){//Nivel 2 selecionado
for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (5 peças)
strcpy(tabuleiro[index], coresNivel2[rand() % 7]);//Será escolhido aleatoriamente uma cor do array pre-determinado
}
else if(nivel == 3){//Nivel 3 selecionado
for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (6 peças)
strcpy(tabuleiro[index], coresNivel3[rand() % 8]);//Será escolhido aleatoriamente uma cor do array pre-determinado
}
}
int calculaPretas(int nivel, char (*tabuleiro)[STRING_MAXIMO], char (*palpite)[STRING_MAXIMO])
{
//Declaração e incialização de variaveis locais
int index;//Variaveis que controlarão os ciclos para iterar sobre o tabuleiro e o palpite do jogador
int nDp = 0;//Variavel auxiliar que ira controlar o numero de acertos na posição correta do utilizador
for(index = 0; index != nivel + 3; index++){/*Iremos simultaneamente comparar o primeiro palpite do utilizador com a primeira posição do tabuleiro,
o segundo palpite com a segunda posição e assim sucessivamente*/
if(strcmp(palpite[index], tabuleiro[index]) == 0)//Caso a cor seja correta
nDp++;//Iremos incrementar o numero de peças acertadas em uma unidade
}
return nDp;
}
int calculaBrancas(int nivel, char (*tabuleiro)[STRING_MAXIMO], char (*palpite)[STRING_MAXIMO])
{
//Declaração e incialização de variaveis locais
int indexT, indexP;//Variaveis que controlarão os ciclos para iterar sobre o tabuleiro e o palpite do jogador (indexT iterara sobre o tabuleiro e indexP iterara sobre o palpite)
int nDp = 0;//Variavel auxiliar que ira controlar o numero de acertos na posição errada do utilizador
int contabilizado[nivel+3];//Vetor que irá armazenar se um elemento do palpite já foi contabilizado como peça branca
//Inicialização do array a 0, pois uma posição será colocada a 1 sempre que essa peça branca já tenha sido contabilizada
for(int index = 0; index != nivel + 3; index++)
contabilizado[index] = 0;
for(indexP = 0; indexP != nivel + 3; indexP++){//Ciclo que ira iterar sobre o palpite fornecido pelo jogador
for(indexT = 0; indexT != nivel + 3; indexT++){//Ciclo que ira iterar sobre as peças do tabuleiro
if((strcmp(palpite[indexP], tabuleiro[indexT]) == 0) && indexP != indexT && !contabilizado[indexP]){//Iremos verificar se a cor existe no tabuleiro mas esta colocada na posição errada
nDp++;//Incremento do numero de peças brancas no tabuleiro
contabilizado[indexP] = 1;//Incremento da peça contabilizada ao array
}
}
}
return nDp;
}
int main(int argc, char *argv)
{
//Declaração e inicialização de variaveis locais (automaticas)
int nivel;//Variavel que ira permitir ao utilizador selecionar o numero de peças no tabuleiro e as cores usadas
int numeroDecasas;//Varivel que guardará o numero de casas de acordo com o nivel escolhido
int index;//Variavel que controlar todos os ciclos desta função
//Explicação das regras do jogo
printf("#############################################################################################################\n");
printf("# O objectivo do Mastermind é descobrir uma combinação de cores determinada aleatoriamente pelo computador. #\n");
printf("# Para tal e necessario que escolha o nivel de jogo adequado #\n");
printf("# Nivel 1 -> 4 casas e 6 cores possiveis #\n");
printf("# Nivel 2 -> 5 casas e 7 cores possiveis #\n");
printf("# Nivel 3 -> 6 casas e 8 cores possiveis #\n");
printf("# Escolha o nivel pretendido #\n");
scanf("%i", &nivel);
printf("# Nivel %i selecionado #\n", nivel);
printf("#############################################################################################################\n\n\n");
//Declaração condicional do tamanho do tabuleiro de acordo com o nivel escolhido
char tabuleiro[nivel + 3][STRING_MAXIMO];/*Declaramos um array de n posições (nº casas é sempre o nivel + 3 exemplo nivel 1 -> 4 casas;
nivel 3 -> 6 casas) e com o tamanho maximo de uma string (caracteres numa cor)*/
char palpite[nivel + 3][STRING_MAXIMO];/*Array que guardará os palpites do jogador*/
gerarTabuleiro(nivel, tabuleiro);
/*Teste*/
//Impressão do tabuleiro - retirar em versão final
printf("| ");
for(index = 0; index != nivel + 3; index++){
printf("%s | ", tabuleiro[index]);
}
printf("\n\n");
/*Fim de teste*/
//Declaração e inicialização de variaveis locais
int novoPalpite;//Variavel que ira permitir ao utilizador desistir do jogo ou continuar a dar palpites (1 -> continuar || 2 -> desistir)
int tentativas = 0;//Variavel que irá contar o numero de palpites que o jogador necessitou para ganhar
int numeroDeBrancas = 0, numeroDePretas = 0;//Variaveis que informarão o jogador de quão perto se encontra de ganhar
do{
//Pedido ao utilziador do seu palpite
printf("# Insira o seu palpite #\n");
for(index = 0; index != nivel + 3; index++){//Para cada casa do nivel atual
printf("# Casa %i\t", index + 1);//Sera informada a posição atual da casa a preencher
scanf("%s", palpite[index]);//E pedido ao utilziador que escolha uma cor para a preencher
}
tentativas++;
numeroDePretas = calculaPretas(nivel, tabuleiro, palpite);
numeroDeBrancas = calculaBrancas(nivel, tabuleiro, palpite);
printf("###########################################\n");
printf("# Numero de peças pretas: %i #\n", numeroDePretas);
printf("#Numero de peças brancas: %i #\n", numeroDeBrancas);
printf("###########################################\n");
if(numeroDePretas == nivel + 3){
printf("###########################################\n");
printf("# Necessitou de %i tentativas para ganhar #\n", tentativas);
printf("# TABULEIRO #\n# ");
for(index = 0; index != nivel + 3; index++)
printf("%s # ", tabuleiro[index]);
printf("\n###########################################\n");
break;
}
printf("# Deseja introduzir um novo palpite #\n");
printf("# 1. Novo palpite #\n");
printf("# 2. Desistir #\n");
scanf("%i", &novoPalpite);
if(novoPalpite == 2){
printf("# Desistiu do jogo #\n");
printf("# Tabuleiro #\n ");
printf("| ");
for(index = 0; index != nivel + 3; index++)
printf("%s | ", tabuleiro[index]);
printf("\n\n");
}
}while(novoPalpite == 1);//Peças pretas (cor e posição correta)
return 0;
}
I make one cycle controlled by indexP iterate on the guess from the player and another cycle iterating on the board it self, if the string is the same in any position execept in the same postion of both (definition of black piece) and i verify if the piece as already conteded as a white piece (i think this is the part that isn't workin but im not sure)
OT: This code is unreadable with its often duplicated comments, even if one knows the language (which I do not.)
Here is your first function re-written:
void gerarTabuleiro(int nivel, char tabuleiro[][] ) {
char coresNivel[] = {
"vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho", "roxo"
};
srand(time(NULL));
for( int i = 0; i < nivel + 3; i++ )
strcpy( tabuleiro[ i ], coresNivel[ rand() % (nivel + 5)] );
}
Instead of copy/paste, strive to write crisp, concise code that achieves the objective.
Related
I'm allocating dynamically the amount of ram that I will need for my program. It is working fine until I came across this problem. This is when I type the content that is going to be inside of my one item that is inside the struct which is referred to as an Integer if I type more than 10 number for example (12345678912) it will send me back, a completely different number.
Here is my code:
#include <stdio.h>
#include <stdlib.h>
struct cadastro
{
char email[50];
char nome[20];
int idade;
int telefone;
};
int main()
{
int quantidade_cadastros;
int decisao = 1;
printf("\nQuantos cadastros deseja realizar?\n");
printf("Quantidade: ");
scanf("%d", &quantidade_cadastros);
getchar();
//Definindo a quantidade de cadastros que podem ser realizados no struct e o nome que sera usado para chamar o struct
struct cadastro *cad;
cad = NULL;
cad = malloc(quantidade_cadastros * sizeof(struct cadastro));
for (int i = 0; i < quantidade_cadastros; i++)
{
printf("\nDigite o NOME da pessoa que sera inserida no indice %d: ", i);
fgets(cad[i].nome, 20, stdin);
printf("Digite o EMAIL da pessoa que sera inserida no indice %d: ", i);
fgets(cad[i].email, 50, stdin);
printf("Digite a IDADE da pessoa que sera inserida no indice %d: ", i);
scanf("%d", &cad[i].idade);
getchar();
printf("Digite o TELEFONE da pessoa que sera inserida no indice %d: ", i);
scanf("%d", &cad[i].telefone);
getchar();
}
for (int i = 0; i < quantidade_cadastros; i++)
{
printf("\nNOME: %s", cad[i].nome);
printf("EMAIL: %s", cad[i].email);
printf("IDADE: %d", cad[i].idade);
printf("\nTELEFONE: %d", cad[i].telefone);
printf("\n");
}
printf("\n");
free(cad);
}
Here is the input I entered:
Quantos cadastros deseja realizar?
Quantidade: 2
Digite o NOME da pessoa que sera inserida no indice 0: Test1
Digite o EMAIL da pessoa que sera inserida no indice 0: Email1
Digite a IDADE da pessoa que sera inserida no indice 0: 19
Digite o TELEFONE da pessoa que sera inserida no indice 0: 1234567891
Digite o NOME da pessoa que sera inserida no indice 1: Test2
Digite o EMAIL da pessoa que sera inserida no indice 1: Email2
Digite a IDADE da pessoa que sera inserida no indice 1: 18
Digite o TELEFONE da pessoa que sera inserida no indice 1: 12345678912
NOME: Test1
EMAIL: Email1
IDADE: 19
TELEFONE: 1234567891
NOME: Test2
EMAIL: Email2
IDADE: 18
TELEFONE: -539222976
You are running into an int overflow. The second 'phone number' you typed in is larger than an int can store, and you are not verifying the reading. The scanf probably failed, and stored nothing in the int - which means there is still random bits in its memory area, as you never cleared it. The printf then prints those random information.
You should always verify that scanf was successful - it will return the number of successfully assigned fields, here 1. So you should use `if (scanf(...) != 1) { /handle error/ }, instead of ignoring it.
im facing one strange scenario when the output of my function return a ENORMOUS int (4225528), when im trying to sum simple values in a var and return that var to store in a struct.
Whats hapenning ? I tried a simple pointer func that i saw here, didnt work, heres my code, anyone has idea how to solve this ?
The function is "int cadastrarPedido(int Cad);"
Executable : https://repl.it/#thzmendes/UnwrittenHorizontalStructs
Here is where i call and the func
#include <stdio.h>
int cadastroPedido(int Cad);
int main(void) {
printf("Voce selecionou a opcao 4 - Cadastrar Pedido\n");
int Cad;
int vlr_T=0;
printf("\nDigite numero do cadastro: ");
scanf("%d",&Cad);
vlr_T = cadastroPedido(Cad);
printf("\n Valor total : %d",&vlr_T);
return 0;
}
int cadastroPedido(int Cad){
int Option;
int OpcaoPedido;
int valor=0;
if(Cad>0)
{
do
{
printf("\nEscolha o seu pedido: ");
printf("\n1- Pizza de Calabresa -50 reais");
printf("\n2- Pizza de Frango - 40 reais");
printf("\n2- Pizza de Mussarela - 30 reais");
printf("\n2- Coca Cola- 10 reais");
printf("\n2- Guarana- 10 reais");
scanf("%d", &OpcaoPedido);
if(OpcaoPedido == 1)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
valor +=50;
scanf("%d", &Option);
}
else
if(OpcaoPedido == 2)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
scanf("%d", &Option);
valor +=40;
}
else
if(OpcaoPedido == 3)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
scanf("%d", &Option);
valor +=30;
}
else
if(OpcaoPedido == 4)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
scanf("%d", &Option);
valor +=10;
}
else
if(OpcaoPedido == 5)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
scanf("%d", &Option);
valor +=10;
}
}while(Option == 1);
}
return valor;
}
I've slapped your code a little bit. This code snippet was enough to reproduce your "bug".
#include <stdio.h>
int cadastroPedido(int Cad);
int main(void) {
int valor = cadastroPedido(1);
printf("%d",valor);
return 0;
}
int cadastroPedido(int Cad){
int Option;
int OpcaoPedido;
int valor;
if(1==Cad)
{
do
{
printf("\nEscolha o seu pedido: ");
printf("\n1- Pizza de Calabresa -50 reais");
printf("\n2- Pizza de Frango - 40 reais");
scanf("%d", &OpcaoPedido);
if(OpcaoPedido == 1)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
valor +=50;
scanf("%d", &Option);
}
else
if(OpcaoPedido == 2)
{
printf("\nPressione 1 para continuar pedindo ou 2 para volar ao menu principal: ");
scanf("%d", &Option);
valor +=40;
}
}while(Option == 1);
}
return valor;
}
You'll see that the local variable of cadastroPedido valor is uninitialized when the function is called. This means that the program will pick a position in memory. Due to RAM shenanigans, that position in memory may have a random value already in it.
You can avoid this by explicitly declaring it like int value = 0, so you will always know the starting value of that variable and so that you aren't at the mercy of preexisting memory states.
If you don't initialize variables when you declare them in C, you're at risk of tripping into these inconsistencies, specially during += operations.
I want to document a void function, but doxygen doesnt recognize it. It only recognizes the int main() function. I do not know what I am doing wrong.
Please check the code below.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/**
* #file main.c
* #author Reymi Chacon Soto
* #date 3 de octubre 2017
* #brief El main file del ejercicio 3
*
* \mainpage Descripcion
* Programa para encontrar la solucion de una ecuacion cuadratica. EL usuario ingresa las constantes de la ecuacion
*
* \section libreria_sec Librerias usadas en este proyecto
* \subsection libreria1 Math.h
* Esta libreria permite usar la funcion sqrt(); para obtener raiz cuadrada
*/
int main(){
printf("Se va a trabajar con la ecuacion de la forma ax^2+bx+c\n\n" );
float a,b,c,x_1,x_2,x_0;
printf("Ingrese el valor de la constante a: ");
scanf("%f", &a);
printf("Ingrese el valor de la constante b: ");
scanf("%f", &b);
printf("Ingrese el valor de la constante c: ");
scanf("%f", &c);
void cuadratica(a,b,c){
/**
* #brief Funcion que se encarga de encontrar las soluciones de una ecuacion cuadratica segun los parametros
* ingresados por el usuario.
* #param a,b,c Constantes de la ecuacion cuadratica
*/
double dis = b*b-4*a*c;
double sqr = sqrt(dis);
if(dis<0){
printf("No tiene solucion en los numeros reales\n");
}
if(dis==0){
x_0= -b/(2*a);
printf("La solucion es %f\n", x_0);
}
if(dis>0){
x_1= (-b + sqr)/(2*a);
x_2= (-b - sqr)/(2*a);
printf("Las soluciones son %f y %f\n", x_1, x_2);
}
}
cuadratica(a,b,c);
}
You can't declare a function inside a function. This is not OOP, each function as to be one and only one function.
Try this:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void cuadratica(a,b,c);
/**
* #file main.c
* #author Reymi Chacon Soto
* #date 3 de octubre 2017
* #brief El main file del ejercicio 3
*
* \mainpage Descripcion
* Programa para encontrar la solucion de una ecuacion cuadratica. EL usuario ingresa las constantes de la ecuacion
*
* \section libreria_sec Librerias usadas en este proyecto
* \subsection libreria1 Math.h
* Esta libreria permite usar la funcion sqrt(); para obtener raiz cuadrada
*/
int main(void){
printf("Se va a trabajar con la ecuacion de la forma ax^2+bx+c\n\n" );
float a,b,c,x_1,x_2,x_0;
printf("Ingrese el valor de la constante a: ");
scanf("%f", &a);
printf("Ingrese el valor de la constante b: ");
scanf("%f", &b);
printf("Ingrese el valor de la constante c: ");
scanf("%f", &c);
cuadratica(a,b,c);
return (0);
}
void cuadratica(a,b,c){
/**
* #brief Funcion que se encarga de encontrar las soluciones de una ecuacion cuadratica segun los parametros
* ingresados por el usuario.
* #param a,b,c Constantes de la ecuacion cuadratica
*/
double dis = b*b-4*a*c;
double sqr = sqrt(dis);
if(dis<0){
printf("No tiene solucion en los numeros reales\n");
}
if(dis==0){
x_0= -b/(2*a);
printf("La solucion es %f\n", x_0);
}
if(dis>0){
x_1= (-b + sqr)/(2*a);
x_2= (-b - sqr)/(2*a);
printf("Las soluciones son %f y %f\n", x_1, x_2);
}
}
In C, you can't declare a function in another function.
Try to declare your function separately:
void cuadratica(a,b,c){
// Your method
}
int main(){
printf("Se va a trabajar con la ecuacion de la forma ax^2+bx+c\n\n" );
float a,b,c,x_1,x_2,x_0;
printf("Ingrese el valor de la constante a: ");
scanf("%f", &a);
printf("Ingrese el valor de la constante b: ");
scanf("%f", &b);
printf("Ingrese el valor de la constante c: ");
scanf("%f", &c);
cuadratica(a,b,c);
return 0;
}
If you want to put cuadratica() function under main() in your file, you have to declare it before as:
void cuadratica(float, float, float);
int main(){
// Method
}
void cuadratica(a, b, c){
// Method
}
$ At school we have to do a project in C, and i'm very new in C (about 3 months of programming). I would lije to have a little help with this problem that drives me crazy.
The project is a game, and in this game, you have to kill the ships that are on the water. In the program, at first you will see that i ask for what to do (a menu ), if I press 1, the program will start doing a new game. First you have to choose how you want to play, 1vs1... etc, but only we have to do a computer vs computer(case 3 of the second switch) . Later you have to give the dimension of the chart where there will be the ships. The dim has to be between 8 and 10.
There you will see 3 functions : $
void taulellprincipalinterrogants(char taulell_vaixells_interrogants[][DIM_MAX], int dim);
That creates the chart with '?' on it with the dim you gave earlier.
void taulellprincipalinterrogants ( char taulell_vaixells_interrogants[][DIM_MAX] , int dim)
{
int i, j;
printf("\n");
printf(" ");
for (i=0; i<dim; i++)
{
printf(" %i", i+1);
}
printf(" ");
printf("\n");
for (i=0; i<dim; i++)
{
printf("\n%c ", i+65);
for (j=0; j<dim; j++)
{
taulell_vaixells_interrogants[i][j] = '?' ;
printf(" %c", taulell_vaixells_interrogants[i][j]);
}
}
printf("\n");
printf("\n");
}
inicia_taulell (dim, taulell_vaixells);
this one was done by the teacher, and puts ships on it randomly. We don't have the code, it's a .o and i can't open it.
void imprimeix_taulell (char taulell_vaixells[][DIM_MAX], int dim );
And this function, prints it.
void imprimeix_taulell( char taulell_vaixells[][DIM_MAX], int dim)
{
int i, j;
printf("\n");
printf(" ");
printf("Impresion del tablero con barcos aleatoriamente colocados \n");
printf("\n");
printf(" ");
for (i=0; i<dim; i++)
{
printf(" %i", i+1);
}
printf("\n");
for (i=0; i<dim; i++)
{
printf("\n%c ", i+65);
for (j=0; j<dim; j++)
{
printf(" %c", taulell_vaixells[i][j]);
}
}
printf("\n");
printf("\n");
printf("\n");
}
This is all ok. But later, when I have to go to the second menu, and to play, while i'm trying to make a shot with the ''Dispara'' function (also was given by the teacher ) , the chart it isn't complete.... It prints something like this:
1 2 3 4 5 6 7 8
A - - - - - - X
B - - -
C - - - -
D X X X X - - -
E - - - -
F - - X X - - -
G - - - -
H X X X X X
I can't do a good table, but there should be 8 ''things'' on each line...there are some missing things.
There are missing parts.... i can't understand why does this...and if i don't have the entire chart, i can't make the shots and finish the game...
what should i do? HELP! PLEASE! .
This is the entire main.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tipus.h"
#include "funcions.h"
#include "vaixells.h"
int main ()
{
int col=0, tecla = 0,tecla2=0, opciocrearjoc,dim,res,cont;
char fila,taulell_vaixells[dim][DIM_MAX], taulell_vaixells_interrogants[dim][DIM_MAX];
bool nofimenu, noficrearjoc,segonmenu,vaixellstrobats=false;
/* Codi de l'algorisme */
nofimenu=true;
noficrearjoc=true;
segonmenu=true;
while ( (nofimenu) && (tecla!=4 ) && (tecla!=6)) {
/* Menu principal sense algunes opcions */
printf ("******************** HUNDIR LA FLOTA ********************\n");
printf("1.Crear un nou joc\n");
printf("2.Carregar un joc emmagatzemat\n");
printf("5.Veure pòdium\n");
printf("6.Sortir del joc\n");
printf(" ************************ \n");
printf("Escull una opció : \n");
printf("\n");
scanf("%d",&tecla);
/* Opcio per a poder entrar en el crear joc nou i poder escollir mode de joc */
switch (tecla) {
case 1:
system("clear");
printf("Has triat la opcio de crear un nou joc\n");
while (noficrearjoc==true) {
printf("Per crear un nou joc, has d'escollir el mode de joc:\n \t 1 - Un jugador \n \t 2 - Dos jugadors \n \t 3 - L'ordinador sol \n");
scanf("%d",&opciocrearjoc);
switch (opciocrearjoc){
case 1 :
printf( "Has triat la opcio d'un jugador\n");
printf(" He escollit el primer nivell, per sortir apreta el 6 : \n") ;
scanf("%d",&tecla);
break;
case 2 :
printf( "Has triat la opcio de dos jugadors\n");
printf(" He escollit el primer nivell, per sortir apreta el 6 : \n") ;
scanf("%d",&tecla);
break;
case 3:
/* Nivell escollit = Nivell 1 */
system("clear");
printf( "Has triat la opcio de l'ordinador sol\n");
printf( " Introdueix la dimensió del taulell, que pot ser 8, 9 o 10 : \n ");
scanf ( "%d",&dim);
/* Comprovant si la dimensio es correcta o no */
if ( dim == 8 ) {
taulellprincipalinterrogants(taulell_vaixells_interrogants, dim);
/* creo el taulell principal sense vaixells */
inicia_taulell (dim, taulell_vaixells); /* El passo per la funcio inicia_taulell per a que hi posi els vaixells */
imprimeix_taulell (taulell_vaixells, dim ); /* Imprimeixo el taulell amb els vaixells posats */
printf("Presiona '1' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%d",&tecla);
}
if ( dim == 9 ) {
taulellprincipalinterrogants(taulell_vaixells_interrogants, dim);
inicia_taulell (dim, taulell_vaixells);
imprimeix_taulell (taulell_vaixells, dim );
printf("Presiona '1' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%i",&tecla);
}
if ( dim == 10 ) {
taulellprincipalinterrogants(taulell_vaixells, dim);
inicia_taulell (dim, taulell_vaixells);
imprimeix_taulell (taulell_vaixells, dim );
printf("Presiona '1' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%i",&tecla);
}
noficrearjoc=false;
segonmenu=true;
break;
}
break;
case 2:
printf("Has triat la opcio de carregar un joc\n");
printf("En el nivell 1, el que he escollit, no s'ha de poder carregar el joc");
printf("Presiona '1' si vols continuar o '6' si vols sortir: \n");
scanf("%i",&tecla);
nofimenu = false ;
segonmenu=true;
break;
case 5:
printf("Has triat la opcio de veure podium\n");
printf("Presiona '1' si vols continuar o '6' si vols sortir: \n");
scanf("%i",&tecla);
nofimenu = true;
break;
case 6:
printf("Has triat la opcio de sortir\n");
nofimenu=false;
break;
}
nofimenu=true;
while((tecla!=6) && (segonmenu==true) && (tecla==1) && (nofimenu==true))
{
noficrearjoc=true;
printf("1.Crear partida\n");
printf("2.Carregar partida\n");
printf("3.Jugar partida\n");
printf("4.Emmagatzemar el joc\n");
printf("5.Veure podium\n");
printf("6.Sortir del joc\n");
printf(" ************************ \n");
printf("Escull una opció : \n");
printf("\n");
scanf("%i",&tecla2) ;
switch (tecla2) {
case 1:
system("clear");
printf("Has triat la opcio de crear un nou joc\n");
while (noficrearjoc==true) {
printf("Per crear un nou joc, has d'escollir el mode de joc:\n \t 1 - Un jugador \n \t 2 - Dos jugadors \n \t 3 - L'ordinador sol \n");
scanf("%d",&opciocrearjoc);
switch (opciocrearjoc){
case 1 :
printf( "Has triat la opcio d'un jugador\n");
printf(" He escollit el primer nivell, per sortir apreta el 6 : \n") ;
scanf("%d",&tecla);
break;
case 2 :
printf( "Has triat la opcio de dos jugadors\n");
printf(" He escollit el primer nivell, per sortir apreta el 6 : \n") ;
scanf("%d",&tecla);
break;
case 3:
/* Nivell escollit = Nivell 1 */
system("clear");
printf( "Has triat la opcio de l'ordinador sol\n");
printf( " Introdueix la dimensió del taulell, que pot ser 8, 9 o 10 : \n ");
scanf ( "%d",&dim);
/* Comprovant si la dimensio es correcta o no */
if ( dim == 8 ) {
taulellprincipalinterrogants(taulell_vaixells_interrogants, dim);
/* creo el taulell principal sense vaixells */
inicia_taulell (dim, taulell_vaixells); /* El passo per la funcio inicia_taulell per a que hi posi els vaixells */
imprimeix_taulell (taulell_vaixells, dim ); /* Imprimeixo el taulell amb els vaixells posats */
printf("Presiona 'c' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%d",&tecla);
}
if ( dim == 9 ) {
taulellprincipalinterrogants(taulell_vaixells_interrogants, dim);
inicia_taulell (dim, taulell_vaixells);
imprimeix_taulell (taulell_vaixells, dim );
printf("Presiona '1' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%i",&tecla);
}
if ( dim == 10 ) {
taulellprincipalinterrogants(taulell_vaixells, dim);
inicia_taulell (dim, taulell_vaixells);
imprimeix_taulell (taulell_vaixells, dim );
printf("Presiona '1' si vols continuar, si vols sortir presiona 6 : \n");
scanf("%i",&tecla);
}
noficrearjoc=false;
segonmenu=true;
break; }
break;
case 2:
printf("Has triat la opcio de carregar un joc\n");
nofimenu = false ;
segonmenu=true;
printf("Presiona '1' si vols continuar : \n");
scanf("%i",&tecla);
break;
case 3:
/* accio jugar */
while ( (vaixellstrobats==false) || (col==8))
{
fila= rand() % (dim);
fila=fila+65;
col = rand() % (dim+1);
imprimeix_taulell(taulell_vaixells, dim);
res = dispara (fila, col, taulell_vaixells);
printf("\nResultat (%c,%d): %d", fila, col, res);
if (res==3)
{
cont++;
if (cont ==10) {
vaixellstrobats=true;
}
}
}
break;
case 4:
printf("En el nivell escollit no s'ha de guardar el joc\n");
break;
case 5:
/*accio llegir podium del fitxer */
break ;
case 6 :
printf("Has triat sortir del joc\n");
nofimenu=false;
break;
}
}
}
}
}
return (0);
}
First at all english its not my first language i will try my best.
Hello guys, I have a problem i'm trying to delete a determinate position of the struct, so instead of deleting the info inside by modifying the string with strcpy or just setting the int or float to 0 i want to erase the data in the struct by changing the position with the next one so 1.2.3.4.5 will be 1.2<-3.4.5 and stay this way 1.2.3.4, problem is after 1h trying to make it works there are some problems, first: if there's only one student after the program ask me for the id to erase, the new id seems to be a random number or like garbage data, so i guess the position changed but the data inside of this id persist.
Example:
id: 1
name: john
lastname: smith
score1: 2
score2: 5
score3: 6
After the function ask me for the id to be erased:
id: 425262
name: john
lastname: smith
score1: 2
score2: 5
score3: 6
the second issue is, if i insert some students, and the program ask for the id to be erased, all id numbers changes to that id i just insert instead of deleting the id target.
Heres the full code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct alumnos{
int id;
char alumno[10];
char apellido[15];
float nota1;
float nota2;
float nota3;
};
int insertar_notas(struct alumnos notas[20],int n,int *id_alumno);
void mostrar_notas(struct alumnos notas[20],int n);
void buscar_alumno(struct alumnos notas[20],int n);
void cambiar_notas(struct alumnos notas[20],int n);
void eliminar_alumno(struct alumnos notas[20],int n);
int main (void){
int menu = 0, n = 0, id_alumno = 1;
struct alumnos notas[20];
puts("\n<><><>Bienvenido al recuento de notas de la escuela<><><>\n");
puts("\nQue deseas hacer?\n");
while (menu != 6){
puts("\n1)Insertas las notas de un alumno\n2)Ver todas las notas\n3)Ver las notas de un alumno\n4)Modificar notas\n5)Eliminar datos del alumno\n6)Salir\n");
scanf("%d", &menu);
switch(menu){
case 1:
n=insertar_notas(notas,n,&id_alumno);
break;
case 2:
mostrar_notas(notas,n);
break;
case 3:
buscar_alumno(notas,n);
break;
case 4:
cambiar_notas(notas,n);
break;
case 5:
eliminar_alumno(notas,n);
break;
}
}
}
int insertar_notas(struct alumnos notas[20], int n,int *id_alumno){
char resp[3];
system("cls");
puts("\n \a Insercion del alumno\n");
while (!strstr(resp,"no")){
fflush(stdin);
printf("\nEl ID de este alumno sera: %d\n", *id_alumno);
notas[n].id=*id_alumno;
(*id_alumno)++;
puts("\nDime el nombre del Alumno\n");
scanf("%10s", notas[n].alumno );
system("cls");
fflush(stdin);
puts("\nDime el apellido del Alumno\n");
scanf("%10s", notas[n].apellido );
system("cls");
puts("\nDime la Primera nota trimestral del Alumno[1.23]\n");
scanf("%f", ¬as[n].nota1 );
system("cls");
puts("\nDime la Segunda nota trimestral del Alumno[1.23]\n");
scanf("%f", ¬as[n].nota2 );
system("cls");
puts("\nDime la Tercera nota trimestral del Alumno[1.23]\n");
scanf("%f", ¬as[n].nota3 );
n++;
system("cls");
puts("\nQuieres volver a insertar otro?[si|no]\n");
scanf("%3s", resp);
strlwr(resp);
}
return n;
}
void mostrar_notas(struct alumnos notas[20],int n){
int i;
system("cls");
if (n != 0 ){
puts("\nLos alumnos insertados son:\n");
for (i = 0; i < n; i++)
{
printf("\n\nID %d\n\n Nombre:%s\n Apellido: %s\n Primera nota:%0.2f\n Segunda nota:%0.2f\n Tercera nota:%0.2f\n\n", notas[i].id, notas[i].alumno, notas[i].apellido ,notas[i].nota1 ,notas[i].nota2 ,notas[i].nota3 );
}
}
else
{
puts("\n \aNo hay registro\n");
}
}
void buscar_alumno(struct alumnos notas[20],int n){
int num = 0;
float media;
if (n != 0){
char ape_alumno[15];
system("cls");
puts("\n\aBusqueda por alumno\n");
puts("\nDime el apellido del alumno\n");
scanf("%15s", ape_alumno);
for ( num = 0; num < n ; num++){
if (strcmp(notas[num].apellido,ape_alumno)==0){
printf("\nEl alumno introducido es: %s %s\n", notas[num].alumno, notas[num].apellido );
media=(notas[num].nota1+notas[num].nota2+notas[num].nota3)/3;
printf("\nLa nota media es %0.2f \n", media);
if (media<5){
puts("\nSuspendido no hace media\n");
}
if (media=5 & media>6){
puts("\nSuficiente\n");
}
}
}
}else{
puts("\a\nRegistro vacio\n");
}
}
void cambiar_notas(struct alumnos notas[20],int n){
char ape_notas[15];
float nueva_nota1,nueva_nota2,nueva_nota3,nota_n1t,nota_n2t,nota_n3t;
int j = 0, submenu_mod = 0, nota_mod;
if (n != 0){
system("cls");
puts("\n \aDime el apellido del alumno a modificar las notas\n");
scanf("%15s", ape_notas);
for (j = 0;j < n; j++){
if (strcmp(notas[j].apellido,ape_notas)==0){
printf("\nLas notas de este alumno %s %s son:\n \n1r Trimestre:%0.2f\n \n2n Trimestre:%0.2f\n \n3r Trimestre:%0.2f\n", notas[j].alumno,notas[j].apellido,notas[j].nota1 ,notas[j].nota2 ,notas[j].nota3 );
while(submenu_mod != 3){
puts("\nQue quieres hacer?:\n\n1)Modificar todas las notas\n2)Modificar solo una nota\n3)Salir\n");
scanf("%d", &submenu_mod);
switch(submenu_mod){
case 1:
puts("\nDime la primera nota trimestral\n");
scanf("%f", &nueva_nota1);
puts("\nDime la segunda nota trimestral\n");
scanf("%f", &nueva_nota2);
puts("\nDime la tercera nota trimestral\n");
scanf("%f", &nueva_nota3);
notas[j].nota1=nueva_nota1;
notas[j].nota2=nueva_nota2;
notas[j].nota3=nueva_nota3;
printf("\nLas nuevas notas de este alumno son:\n \n1r Trimestre:%0.2f\n \n2n Trimestre:%0.2f\n \n3r Trimestre:%0.2f\n", notas[j].nota1 ,notas[j].nota2 ,notas[j].nota3 );
system("pause");
break;
case 2:
while (nota_mod != 4){
puts("\nQue nota trimestral quieres modificar?:\n");
printf("\n1)Nota trimestral %0.2f\n2)Nota trimestral %0.2f\n3)Nota trimestral %0.2f\n4)Salir", notas[j].nota1,notas[j].nota2,notas[j].nota3);
scanf("%d", ¬a_mod);
switch(nota_mod){
case 1:
puts("\nDime la nueva nota del Primer trimestre:\n");
scanf("%f", ¬a_n1t);
notas[j].nota1=nota_n1t;
printf("La nueva nota del primer trimestre para el alumno %s %s es: \n%0.2f", notas[j].alumno,notas[j].apellido,notas[j].nota1);
break;
case 2:
puts("\nDime la nueva nota del Segundo trimestre:\n");
scanf("%f", ¬a_n2t);
notas[j].nota2=nota_n2t;
printf("La nueva nota del Segundo trimestre para el alumno %s %s es: \n%0.2f", notas[j].alumno,notas[j].apellido,notas[j].nota2);
break;
case 3:
puts("\nDime la nueva nota del Tercer trimestre:\n");
scanf("%f", ¬a_n3t);
notas[j].nota3=nota_n3t;
printf("La nueva nota del Tercer trimestre para el alumno %s %s es: \n%0.2f", notas[j].alumno,notas[j].apellido,notas[j].nota3);
break;
}
break;
}
}
}
} else {
puts("\nNo se ha encontrado ese apellido\n");
}
}
} else {
system("cls");
puts("\n \aRegistro vacio\n");
}
}
The function:
void eliminar_alumno(struct alumnos notas[20],int n){
int id_eli = 0, r = 0;
mostrar_notas(notas,n);
puts("\nInserta la id del alumno a eliminar\n");
scanf("%d",&id_eli);
for(r = 0;r < n;r++){
if (notas[r].id = id_eli){
notas[r].id=notas[r+1].id;
n--;
}
}
}
Compile with warnings:
if (notas[r].id = id_eli){
should be
if (notas[r].id == id_eli){
Also, this is wrong:
if (media=5 & media>6){
Suficiente = [5 - 6) right? Then you want if (media >= 5 && media < 6)
Try the following changes in your eliminar_alumno function-
for(r = 0;r < n;r++){
if (notas[r].id == id_eli){
for(i=r;i < (n-1);i++)
notas[i]=notas[i+1];
notas[i].id -= 1;
n--;
}
}