Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eduardo1012

#11
Programación C/C++ / Lista simple -- Error
17 Noviembre 2016, 03:19 AM
Buenas, mi duda surge al querer hacer una lista y mandarle los parámetros de primero y ultimo, a una función, la cual es invocada previamente. Algo como esto:
#include<iostream>//cout, cin, fixed, endl
#include<iomanip>//setw, setprecision,
#include<stdlib.h>//malloc, free
#include<conio.h>
using namespace std;

typedef struct _nodo{
int num;
char nombre[10];
struct _nodo *siguiente;
}tipoNodo; //variable
typedef tipoNodo *pNodo;

void mostrar_lista(pNodo *primero, pNodo *ultimo);
void agregar_elemento(pNodo *primero, pNodo *ultimo);
void borrar_elemento(pNodo *primero, pNodo *ultimo);
void funcion();

main(){
pNodo primero = NULL, ultimo=NULL;

funcion();

}

void funcion(){


for(int i=0; i<5; i++){
agregar_elemento(&primero, &ultimo);
}
mostrar_lista(&primero, &ultimo);
}

void agregar_elemento(pNodo *primero, pNodo *ultimo){
pNodo nuevo;
system("cls");

nuevo = (pNodo)malloc(sizeof(tipoNodo));
cout<<"Dato: ";
cin>>nuevo->num;
cin>>nuevo->nombre;
//nuevo->siguiente=NULL;

if(*primero==NULL){
//agrego l?nea
nuevo->siguiente=nuevo;

*primero = nuevo;
*ultimo = nuevo;
}else{
//agrego l?nea
nuevo->siguiente=*primero;

(*ultimo)->siguiente=nuevo;
*ultimo=nuevo;
}
getchar();
}

void mostrar_lista(pNodo *primero, pNodo *ultimo){
pNodo auxiliar, auxiliar2;
auxiliar = *primero;
auxiliar2 = *primero;
system("cls");
cout<<"Mostrando la lista completa"<<endl;
if(primero==NULL){
cout<<"No hay elementos en la lista";
}else{
while(auxiliar!=NULL){
cout<<auxiliar->num<<" "<<auxiliar->nombre<<endl;
auxiliar = auxiliar->siguiente;

if (auxiliar2->siguiente == auxiliar->siguiente){
auxiliar=NULL;
}
}
}
getchar();
}

void borrar_elemento(pNodo *primero, pNodo *ultimo){
pNodo temporal, temporal2, previo, actual;
int n_borrar;
system("cls");
if(primero==NULL){
cout<<"No hay elementos en la lista";
}else{
cout<<"Dame el valor a borrar de la lista"<<endl;
cin>>n_borrar;
temporal=*primero;
temporal2=*primero;
if(n_borrar == (*primero)->num){
*primero=(*primero)->siguiente;
//agrego l?nea
(*ultimo)->siguiente =*primero;

free(temporal);
cout<<"Elemento borrado: "<<n_borrar<<endl;
}
else{
previo=*primero;
actual=temporal->siguiente;
while(actual !=NULL && actual->num!=n_borrar){
previo=actual;
actual=actual->siguiente;
}
if(actual!=NULL){
temporal=actual;
previo->siguiente=actual->siguiente;
free(temporal);
cout<<"El elemento borrado fue: "<<n_borrar;
}
}
}
}

Donde primero y ultimo, no son declarados previamente y no encuentro solución al problema. Sé que esa función llamada "función" no me sirve de nada y que lo mejor es no ponerla, pero en el proyecto que hago dicha función hace algo.
#12
Cita de: engel lex en 14 Noviembre 2016, 15:45 PM
con ctime esto es bastante facil... te explico...

time tiene un struct (tm) que está armado de la siguiente manera



lo puedes llenar de una vez en ese orden

tal que hoy sería
Código (cpp) [Seleccionar]
struct std::tm a = {0,0,0,14,11,116};

esto con el fin de

time_t es el tipo de variable que contiene la fecha en formato unix, haciendo uso de mktime puede convertir una variable de tipo tm a time_t...

allí tienes las 2 fechas en segundos... solo las restas y listo!

aquí la referencia!

http://www.cplusplus.com/reference/ctime/

En que estoy mal? Que no logro comparar utilizando ctime.
#include <time.h>
#include<stdio.h>
time_t to_seconds(const char *date)
{
char *strptime(const char *buf, const char *format, struct tm *tm);
        struct tm storage={0,0,0,0,0,0,0,0,0};
        char *p=NULL;
        time_t retval=0;

        p=(char *)strptime(date,"%d-%b-%Y",&storage);
        if(p==NULL)
        {
                retval=0;
        }
        else
        {
                retval=mktime(&storage);
        }
        return retval;
}

int main()
{

   char *date1="20-JUN-2016";
   char *date2="21-JUN-2016";
   scanf("%s",date1);
   scanf("%s",date2);
   time_t d1=to_seconds(date1);
   time_t d2=to_seconds(date2);
   
   printf("date comparison: %s %s ",date1,date2);
   if(d1==d2) printf("equal\n");
   if(d2>d1)  printf("second date is later\n");
   if(d2<d1)  printf("seocnd date is earlier\n");
   return 0;
}
#13
Programación C/C++ / Re: Strtok--Dividir Fecha
10 Noviembre 2016, 19:26 PM
Es un proyecto en el cual tengo que solo permita la entrada de numeros y el slash en las posiciones correspondientes. Pero si lo hago como dices no le encuentro como validar todo.
Que escriba por ejemplo 21*12-06 cuando deberia ser DD/MM/AN
#14
Bueno la primera vez te muestra "correctamente" cuantos registros existen en el archivo porque conoce cuantos hay. Pero cuando lo cierras y vuelves a abrir el programa y quieres conocer esos registros tu programa no sabe cuantos existen, dado que antes ya habias ingresado por lo que num = 0. Si antes tenias 2 , los imprimes y los muestra, pero lo cierras y vuelves abrirlo y agregas 2, tu sabes que tienes 4, pero el programa sabe que num = 2, por lo que no sigue correctamente. Aquí te muestro un ejemplo de como leer un archivo.
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

void archivo();

main(){
archivo();
getch();
}

void archivo(){
int i,idd,existenciaa;
char nombree[20],fechaa[20];
FILE *ptr;
ptr = fopen("150941_Aguilar_Av1-2.txt", "r");
   
    do{
    fscanf(ptr,"%d",&idd);
    fscanf(ptr,"%s",nombree);
    fscanf(ptr,"%s",fechaa);
    fscanf(ptr,"%d",&existenciaa);
printf("%d\n",idd);
printf("%s\n",nombree);
printf("%s\n",fechaa);
printf("%d\n",existenciaa);
    printf("\n");
i++;     
    }while(!feof(ptr));
fclose(ptr);   
printf("Registros guardados %d\n",i);
}

código txt llamado :150941_Aguilar_Av1-2
1
leche
20-12-2016
10
2
arroz
22/02/2017
8
3
Huevos
25/11/2016
8
4
frijoles
29/12/2017
12
5
maiz
31/03/2017
8
6
papas
20/03/2017
8
7
caramelos
08/09/2022
15
8
gelatina
09/20/2027
15
9
refresco
09/09/2019
18
10
harina
22/05/2018
15
11
Carne
10/04/2017
15

#15
Programación C/C++ / Strtok--Dividir Fecha
10 Noviembre 2016, 00:22 AM
Buenas, Como podría hacer para validar una fecha, es decir tomar la cadena obtener los números y hacer la comparaciones para permitir menos de 31 días, menos de 12 meses. Tengo este código pero realmente no se como almacenar en una variable temporal y asi hacer las validaciones.
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
int main()
{
  char fecha[]="12/17/19";
  char *ptr;
  cout << fecha << endl;
  ptr = strtok(fecha,"/");
  while(ptr != NULL)
    {
      cout << ptr << endl;
      ptr = strtok(NULL, "/");
    }
  return 0;
}
#16
El programa si muestra algo, aunque imprime basura, los estas imprimiendo mal, no conozco acerca de ifstrem y ello, y el programa funcionara correctamente cuando cree el primer archivo, es decir que no abra uno que ya este creado. A menos que le cambies ese num en el de leer hasta que no encuentre mas caracteres, algo como feof.
Por cierto en los for los declaras como <=, los he modificado y me ha impreso.

Talvez deberías intentar con fprintf, me parece mucho mas fácil de entender y simple. Solo que como primer argumento se le pasa el puntero al archivo.

#include <iostream>
#include <fstream>
using namespace std;
void llenar (int notas [], struct lista_estudiantes[]);
void imprimir (int notas [],struct lista_estudiantes[]);
int menu ();
int num;
int asignatura=5;
string nombres[100];
int posicionesEstudiante=0;

struct lista_estudiantes{
string nombres, apellido;
char cedula[11];
int DD, MM, AAAA;
//char DD[2],MM[2],AAAA[4];
}estudiantes[100];
//Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------

void llenar (int notas [], lista_estudiantes[]){ //Asumo que paso por parametros la estructura al nombrarla en los parametros, sin pasarla en forma de referencia o valor.
system("cls");

int i, x;
fstream registrar;
registrar.open ("registro.txt",ios::out|ios::app);
if(!registrar){
cout<<"PROBLEMA AL ABRIR EL ARCHIVO"<<endl;
}


if (registrar.fail()){
cout<<"ERROR AL ABRIR EL ARCHIVO"<<endl;
system ("pause");
}
else {

cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl;
cin>>num;
cout<<endl;

for(i=0; i<num; i++){
cout<<"\nLLENE LOS DATOS DEL ESTUDIANTE "<<i+1<<endl<<endl;
cout<<"\nNOMBRE: ";
cin>>estudiantes[i].nombres;
cout<<"\nAPELLIDO: ";
cin>>estudiantes[i].apellido;
cout<<"\nC.I: ";
cin>>estudiantes[i].cedula;
cout<<"\nFECHA DE NACIMIENTO"<<endl;
cout<<"\nDIA (DD): ";
cin>>estudiantes[i].DD;
cout<<"\nMES (MM): ";
cin>>estudiantes[i].MM;
cout<<"\nANHO (AAAA): ";
cin>>estudiantes[i].AAAA;
cout<<"\n_____________________ "<<endl;
cout<<"\nINGRESE LAS NOTAS DE "<<estudiantes[i].apellido<<endl;

registrar<<"NOMBRE: "<<estudiantes[i].nombres<<endl;
registrar<<"APELLIDO: "<<estudiantes[i].apellido<<endl;
registrar<<"C.I: "<<estudiantes[i].cedula<<endl;
registrar<<"FECHA DE NACIMIENTO: "<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<"\n"<<endl;

for (x=0; x<asignatura; x++){
cout<<"\nNOTA "<<x+1<<": ";
cin>>notas[asignatura*i+x];
registrar<<"NOTA "<<x+1<<": "<<notas[asignatura*i+x]<<endl;
}
cout<<endl<<endl;
registrar<<"\n________________________________\n"<<endl;
}
registrar.close();
system ("pause");
}

}


void imprimir (int notas [], lista_estudiantes[]){
system("cls");
ifstream visualizar;
int cont=0;
int cont2=0;
visualizar.open("registro.txt");

for(int i=0;i<num;i++){
visualizar>>estudiantes[i].nombres;
visualizar>>estudiantes[i].apellido;
visualizar>>estudiantes[i].cedula;
visualizar>>estudiantes[i].DD;
visualizar>>estudiantes[i].MM;
visualizar>>estudiantes[i].AAAA;

cout<<estudiantes[i].nombres<<endl<<estudiantes[i].apellido<<endl<<estudiantes[i].cedula<<endl<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<endl;
for(int x=0; x<asignatura;x++){
visualizar>>notas[asignatura*i+x];
cout<<notas[asignatura*i+x];
}
}
visualizar.close();
system ("pause");
}








//Menu -------------------------------------------------------------
int menu (){
system("cls");
int opc;
cout<<"MENU DEL PROGRAMA\n-----------------------------------------------\n\n[1] INGRESAR EL NUMERO DE ESTUDIANTES\n\n[2] VISUALIZAR LOS DATOS DE LOS ESTUDIANTES\n\n[3] SALIR DEL PROGRAMA\n"<<endl;
cin>>opc;
cout<<"\n";
if(opc>7){
cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl;
system ("pause");
}

return opc;
}


int main(){

int notas[500];
int opc;
do{
opc=menu();
switch (opc){
case 1:
llenar(notas,estudiantes);
break;

case 2:
imprimir(notas, estudiantes);
break;
case 3:
system("cls");
cout<<"\n\nBYE BYE\n"<<endl;
break;
}
}
while (opc !=3);
system ("pause");
}
#17
char op;
op=getch();

Utiliza getch si solo vas a escribir un numero, asi evitas al usuario tener que escribir de mas. O limitalo a que pueda escribir solo un caracter
#18
Para ir almacenando de uno por uno, haz paso por referencia creando una función en la que i<5 y al salir de la función retorne un i++ a la variable en el main. Ya que si la inicializas en la función en i=0, y al salir i++, y vuelvas a entrar a la función esta será 0 siempre, y para la fecha puedes intentar algo asi:
#include<stdio.h>
#include<conio.h>
 
main(){
int dia,mes,año;
do{
printf("Ingresa: ");
scanf("%d/%d/%d",&dia,&mes,&año);
}while(dia>31 || mes>12 || año>25);
 
 
printf("%d/%d/%d",dia,mes,año);
 
getch();
}

Si lo logras mejorar avisame
#19
Programación C/C++ / Re: Validacion de fecha
29 Octubre 2016, 19:26 PM
Estaba pensando en algo como esto:
Código (cpp) [Seleccionar]
#include<stdio.h>
#include<conio.h>

main(){
int dia,mes,año;
do{
printf("Ingresa: ");
scanf("%d/%d/%d",&dia,&mes,&año);
}while(dia>31 || mes>12 || año>25);


printf("%d/%d/%d",dia,mes,año);

getch();
}

pero al ingresar //121212 debería ser invalido, como puedo solucionar esto?
#20
Programación C/C++ / Validacion de fecha
29 Octubre 2016, 17:19 PM
Buenas tengo un programa en el que debo ingresar unos artículos de venta y en estos tengo que ingresar una fecha de caducidad. El problema surge ahí cuando recibo la fecha como podría hacer que solo sea DD/MM/YY.
Estaba pensando en solo permitir introducir los números y el slash, pero puede que se ingrese //121212 o similar, alguien tiene alguna sugerencia?