• Viernes 26 de Abril de 2024, 20:17

Mostrar Mensajes

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


Mensajes - ProfesorX

Páginas: 1 ... 3 4 [5] 6 7 ... 32
101
C# / Re:ficheros de acceso aleatorio
« en: Viernes 26 de Octubre de 2012, 21:57 »
La clase FileStream del namespace System.IO permite el acceso a archivos de manera aleatoria, para mas informacion te dejo el siguiente enlace:

http://msdn.microsoft.com/es-es/library/y0bs3w9t%28v=vs.100%29.aspx

Saludos :)

102
C/C++ / Re:Funciones con matrices
« en: Sábado 13 de Octubre de 2012, 00:17 »
Hola, alejandro222

Mira, no puedes definir dinamicamente el tamaño de una matriz de la forma en que lo estas haciendo, o sea, la siguiente linea es incorrecta:

    int matrizA[dim][dim];

Para definir una matriz la manera correcta seria definir su tamaño de manera estatica o sea:

    int matrizA[10][10];

Hay una forma de crear matrices con tamaño dinamico, pero requieren el uso de apuntadores y memoria dinamica y es un tema mas largo del que te podria explicar en unas cuantas lineas, asi que la manera mas simple en tu caso seria definir tu matriz estaticamente, y colocar una validacion para que tu matriz no exceda el tamaño que definiste de manera estatica.

Dicho eso,. te dejo el codigo corregido, te quedaria de tarea colocar una validacion para que el tamaño de dim no sea mayor a el tamaño maximo de tu matriz:

Código: [Seleccionar]
# include <stdio.h>
# include <iostream>

using namespace std;

int dim; //una variable para guardar las dimensiones de la matriz

int matrizA[10][10]; //creo la matriz con la que quiero trabajar


void imprimir(int matriz[][10],int fila,int columna); //la funcion que me da errores

int main()
{

    cout << "Introduzca la dimensión n de la matriz (cuadrada): "; //pedir el rango
    cin >> dim; //guardarlo

    /*Pillar los datos de la matriz*/
    cout << "Introduzca los datos, empezando por la primera fila, de izda. a derecha y arriba a debajo, conforme se le van pidiendo: " << endl;

    for(int i = 0; i <dim; i++)  //recorrer las filas
    {

        for(int j = 0; j < dim; j ++)  //recorrer las columnas
        {
            cout << "Elemento " <<i +1<< j +1<<" : "; //indicar al usuario que dato está introduciendo
            cin >> matrizA[i][j]; //guardar el dato en la posición correspondiente de la matriz
        }

    }

    imprimir(matrizA,1,2); //Imprimir la posición 1,2 (por poner algo, podría ser cualquier otra posición que necesitara)

    return 0;

}

void imprimir(int matriz[][10],int fila,int columna)  //la función pide una matriz, una fila y una columna
{

    cout << matriz[fila][columna];//imprime a consola el elemento correspondiente

}

Saludos :)

103
C/C++ / Re:MATRIZ DE CARACOL CON RECURSIVIDAD
« en: Viernes 5 de Octubre de 2012, 16:40 »
No se hacen tareas

104
C/C++ / Re:buen dia
« en: Jueves 27 de Septiembre de 2012, 22:47 »
No se hacen tareas

105
C/C++ / Re:Problemas a la hora de insertar un nodo al principio de la lista
« en: Jueves 27 de Septiembre de 2012, 17:28 »
Hola abelique, bienvenid al foro.

Tienes 2 errores,

1. No estas creando el nodo adentro del ciclo, sino afuera, entonces solo creas un nodo y no 3, por lo tanto estas encimando el valor de un nodo anterior con un nuevo valor. Debes poner la creacion del nodo adentro del ciclo, para que en cada iteracion cree un nuevo nodo.

2. Despues del ciclo ya no es necesario que modifiques el valor del siguiente nodo, porque lo estas haciendo dentro el ciclo, si lo haces, lo que estaras obteniendo es una lista circular, y las listas circulares se manejan de manera diferente.

La funcion mostrar esta correcta, no necesita cambios.

Dicho eso, te dejo el codigo corregido:

Código: [Seleccionar]
void insertar_principio()
{
    struct nodo *nuevo_nodo ;
    for (int i=0 ; i<3 ; i++)
    {
        nuevo_nodo = new struct nodo;
        nuevo_nodo->sgte=NULL;
        cout<<endl<<"Introduzca el primer numero: ";
        cin >>nuevo_nodo->numero;
        nuevo_nodo->sgte=principio;
        principio=nuevo_nodo;     
    }
    // Esto no es necesario, puesto que adentro del ciclo
    // ya estas asignando al nodo el valor del siguente nodo
    //principio->sgte=nuevo_nodo;
}

Saludos :)

106
C/C++ / Re:Problema con if-else
« en: Lunes 17 de Septiembre de 2012, 06:49 »
La condicion del if esta mal, deberia ser:

Código: [Seleccionar]
    if (st == 0 || nd == 0)

Saludos :)

107
C/C++ / Re:Duda, declaracion miembros de Estructura
« en: Sábado 15 de Septiembre de 2012, 06:46 »
Me parece que malinterpretaste lo que significa un arreglo, un arreglo NO es un tipo de variable, yo diria que un arreglo es un conjunto de variables del mismo tipo, agrupadas bajo el mismo nombre para facilitar su manejo.

O sea en lugar de tener 3 variables de tipo complex:

Código: C++
  1. complex c1, complex c2, complex c3;

ponemos:

Código: C++
  1. complex c[3]:

de esa forma cuando queremos referirnos a cada complex podemos usar c[0], c[1], c[2], (recuerda que los arreglos comienzan en cero) en lugar de c1, c2, c3, es mas, incluso podemos utilizar una variable indice (c[ i ]) para referirnos a la variable, con lo que podriamos poner un ciclo para imprimir los tres valores:

Código: C++
  1. for (i=0; i<3; i++)
  2. printf("%f %f\n", c[i].re, c[i].im]);
  3.  

en lugar de:

Código: C++
  1. printf("%f %f\n", c1.re, c1.im);
  2. printf("%f %f\n", c2.re, c2.im);
  3. printf("%f %f\n", c3.re, c3.im);
  4.  

ahora imaginate que quisieras utilizar, como en tu ejemplo, 100 variables de tipo complex, seria demasiado laborioso hacer:
complex c1, c2, c3, c3, c5, c6, c7, c8 asi hasta llegar a c100

Asi que tu respuesta a:

Citar
se puede hacer eso??

es SI, y de hecho es la manera mas eficiente para manejar 100 valores de tipo complex

Saludos :)

108
C# / Re:Form hijo sin salir del form Padre
« en: Jueves 23 de Agosto de 2012, 17:41 »
El error esta en que le estas diciendo al hijo que su formulario padre es el Padre de tu formulario Padre, pero tu formulario padre no tiene padre, por eso los muestra separados.

La manera correcta es decirle al formulario hijo que su padre es tu formulario padre (ya parece trabalenguas jaja)

Para que te quede mas claro, te deijo como debe ser

Código: [Seleccionar]
            Form Hijo = new frmHijo();
            Hijo.MdiParent = this;
            Hijo.Show();

Saludos :)

109
C/C++ / Re:Misplaced else
« en: Viernes 17 de Agosto de 2012, 01:02 »
El error esta en que la sentencia if contiene varias sentencias de codigo, y en C/C++ una sentencia termina con ; por lo tanto eso significa que tu if termina mucho antes que el else, y por eso no lo reconoce.

O sea segun tu codigo el if termina aca:

Código: [Seleccionar]
    if (desition == 1)
        printf("Then enter the a "); // Aca termina el if


Cuando en realidad necesitas que termine aca:

Código: [Seleccionar]
    printf("The discriminant of the ecuation is: %d", result);
    // Aca es donde en realidad deberia terminar el if
    else printf("Nothing to calculate, press enter and Alt+F4 to leave ");

En estos casos, lo que se debe utilizar son llaves {} para indicar que tu if contiene mas de una sentencia

A continuacion de dejo el codigo corregido:

Código: [Seleccionar]
int main()
{
    int a, b, c, result, bwpow, desition;
    printf("Welcome to the iDeveloper's (manudo) discriminant calculator! ");
    getchar();
    printf("Do you know the a, b, and c of the ecuation? [Y=1/N=0] ");
    scanf("%d", &desition);
    if (desition == 1)
    { // Se utilizan llaves {} para indicar un bloque de sentencias dentro de un if
        printf("Then enter the a ");
        scanf("%d", &a);
        printf("Enter the b ");
        scanf("%d", &b);
        printf("Enter the c ");
        scanf("%d", &c);
        bwpow = b * b;
        result = bwpow - 4*a*c;
        printf("The discriminant of the ecuation is: %d", result);
    } // Cerramos la llave para indicar que es el fin del bloque
    else printf("Nothing to calculate, press enter and Alt+F4 to leave ");
    return 0;
}

Saludos :)

110
C# / Re:extraer valor especifico de una cadena
« en: Viernes 3 de Agosto de 2012, 19:59 »
Hola alexisgondola.

¿Para que inventar el hilo negro si ya tenemos un namespace llamado System.Xml, que nos permite trabajar y manipular directamente archivos XML?

Te dejo un ejemplo de como hacerlo, suponiendo que tienes un archivo XML llamado Ejemplo.xml que contiene:

Código: [Seleccionar]
<?xml version='1.0' encoding='UTF-8'?>
<errors>
  <error>error x.</error>
  <error>error y.</error>
</errors>

Este programa te dara como salida
error x.
error y.

Código: [Seleccionar]
using System;
using System.Xml;

namespace ConsoleApplication1
{
    public class Program
    {
        public static XmlDocument doc;
        public static XmlTextReader reader;
        public static XmlNodeList listaNodos;

        static void Main(string[] args)
        {
            doc = new XmlDocument();
            reader = new XmlTextReader("Ejemplo.xml");
            doc.Load(reader);
            listaNodos = doc.GetElementsByTagName("error");
            for (int i = 0; i < listaNodos.Count; i++)
            {
                Console.WriteLine(listaNodos[i].InnerXml);
            } 
        }
    }
}

Saludos :)

111
C/C++ / Re:compresion - cifrado con huffman - duda
« en: Martes 10 de Julio de 2012, 19:06 »
Me parece que estas un poco confundido respecto a como funcionan estos algoritmos.

Para empezar, tenemos dos tipos de algoritmo de compresion, con perdida y sin perdida.

En la compresion con perdida se reduce el tamaño de los datos de tal manera que si descomprimimos los datos se obtiene una secuencia de datos que es muy parecida a la secuencia original, pero no es exactamente igual a la secuencia original. Un ejemplo de este tipo de compresion son los archivos de imagenes jpg, los de musica mp3 y los de video mpg. Es por esta razon que por ejemplo cuando comprimes y descomprimes por ejemplo un archivo de musica, no suena como el original, ya que siempre habra perdida de informacion.

En la compresion sin perdida se reduce el tamaño de los datos de tal manera que si descomprimimos los datos obtenemos EXACTAMENTE la secuencia de datos original. Un ejemplo de este tipo de compresion son los archivos ZIP y RAR.

Acalarado esto vamos a los puntos.

Citar
Pero note que en una frase de 15 bits, esta llegaba a 72 Bits. (nom comprime ...)

Respecto a esto, parece que crees que cuando comprimes informacion, siempre deberia disminuir su tamaño. Pero esto no funciona asi. Este tipo de algoritmo es un algoritmo sin perdida, o sea que debes ser capaz de obtener la secuencia original de datos.

Supongamos que de 15 bits se reduce a 1 bit. Ahora un bit solo representa 0 y 1, entonces piensalo, solo tengo 2 valores a elegir, es imposible que de esos 2 valores pueda "reconstuir" la secuencia original de 15 bits. Recuerda que en realidad el algoritmo funciona elaborando una tabla de frecuencias con los valores contenidos en la secuencia de datos, y cuantas veces se repite cada dato. Entonces el tamaño "adicional" que aparece cuando comprimes una frase pequeña es donde esta contenida esta tabla de frecuencias.

Esto significa en realidad que el algoritmo es mas eficiente (o sea, comprime mas) entre mas grande sea la secuencia de datos, y tenga mayor cantidad de datos "repetidos", o sea mayor sera su porcentaje de compresion. Esta es la razon por la que por ejemplo un archvo de mapa de bits (BMP) se comprime en un porcentaje mayor que un archivo de imagen JPG cuando las comprimes en un archivo zip. (nota que hablo de porcentajes de compresion y no de tamaño en si).


Citar
como se puede ver es posible la lectura de los caracteres usados en la supuesta encriptacion.
la frase usada fue: pruebadetexto1

la duda es:
. en realidad esto esta cifrado?
. por que puedo el texto si la idea de huffman es convertilo a binario?

Ahora, recuerda que todo caracter tiene una representacion en codigo ASCII, y este codigo en realidad es un numero en binario y viceversa. Esto significa tambien que CUALQUIER numero en binario se puede representar como un caracter ASCII.

Por ejemplo, la letra A mayuscula se representa con el numero 01000001 en binario, 41 en hexadecimal y 65 en decimal, esto tambien significa que si tu guardaras el numero 65 en binario en un archivo, y lo ves con el Hexdump, tu lo verias como si fuera la A mayuscula y no como el numero 65.

Entonces lo que tu ves en el hexdump es la representacion en ASCII de los numeros en binario, y pareciera que puedes ver el texto original, pero no es asi, si te fijas bien tambien aparecen la letra m y x, que no estan en tu texto original, ademas que las letras no aparecen en el orden de tu frase, recuerda tambien que este no es un algoritimo de cifrado, es un algoritmo de compresion, y aunque pareciera que cifrar y comprimir es lo mismo no es asi.

Espero que con esto te haya aclarado un poco las dudas.

Saludos :)

112
Pues la unica manera de instalar SQL (supongo que te refieres a SQL Server y no al lenguaje SQL en general) es que se lo instales por separado no hay de otra.

Otra opcion es que en lugar de utilizar SQL Server completo, utilices una base de datos embebida como SQLite http://en.wikipedia.org/wiki/Sqlite, o SQL Server CE http://en.wikipedia.org/wiki/SQL_Server_Compact, de esa forma puedes distribuir tu aplicacion sin depender de que previamente tengas instalado un servidor SQL.

Saludos :)

113
C# / Re:ArgumentOutOfRangeException
« en: Jueves 14 de Junio de 2012, 17:33 »
Podrias poner la definicion de la variable Obs??

Porque asi, sin ver como defines Obs no es posible ayudarte ya que no sabemos de que tipo son los elementos de Obs, ni cuantos elementos tiene el vector Obs.

Saludos :)

114
C/C++ / Re:Conversión de un array de caracteres a un array de números
« en: Lunes 4 de Junio de 2012, 16:40 »
A raiz de lo que me comentas, ¿poner char *cadena, no es lo mismo que char cadena[]?

No, no es lo mismo. char cadena* es un apuntador a caracteres, mientras que char cadena[] es un arreglo de caracteres, en el primer caso, es una variable que apunta a una direccion de memoria, no reserva espacio ni nada, su funcion es solo apuntar valga la redundancia, mientras que char cadena[] reserva espacio en memoria para guardar el arreglo. A veces existe la confusion de que son lo mismo debido a que en algunos casos puedes usar el apuntador como si fuera un arreglo y viceversa, pero hay que tener en cuenta el significado de cada uno.

Te dejo un ejemplo que te lo aclara mejor:

Código: [Seleccionar]
    char *clave1 = "abcd";
    char clave2[] = "fgh";

    // El siguiente codigo no marcara error, ya que clave1 es un apuntador a char
    // asi que puede apuntar a cualquier variable de tipo char
    clave1 = clave2;
    // El siguiente codigo marcara error de compilacion, pues clave2 no es un
    // apuntador a char, por lo tanto solo puede contener la direccion de la
    // cadena originalmente asignada "fgh"
    clave2 = clave1;

Citar
Es decir, si yo declaro:

Código: C
  1. char *cadena = "ABCD";

¿Qué significado tiene?

Como dije antes, un apuntador a char

Citar
Por otra parte, te pongo dos versiones. ¿Son ambas correctas?

Bueno, veo que modificaste la version con punteros para hacer la variable cadenafinal estatica, en este caso al ser estatica no se elimina al salir de la fiuncion, y aunque funciona, aun asi me parece peligroso, tienes el problema que te dije en mi mensaje anterior, estas accediendo a una variable que es local a la funcion tonumber por medio de un apuntador desde fuera de la funcion, en un codigo grande es facil perder a donde esta apuntando la variable, en mi parecer como te dije antes seria mucho mejor asignar espacio para cadenafinal desde afuera de la funcion y pasarle como parametro el arreglo.

Aunque tienes un error, estas regresando el valor, en lugar de la direccion, lo correcto es:

Código: [Seleccionar]
int *tonumber(char *cadena) /*Versión con punteros*/
{
  char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  int numeros[100], i, j;
  static int *cadenafinal;

  for(i=0; i<25;i++) numeros[i] = i;
  for(i=25; i<50;i++) numeros[i] = (i-25);

  for(i=0; i<strlen(cadena); i++){
     for(j=0; j<strlen(letras); j++){
         if(cadena[i] == letras[j])
            *(cadenafinal + i) = numeros[j];}}
  // Regresa la direccion, no el valor
  return cadenafinal;

}

Saludos :)

115
C/C++ / Re:Conversión de un array de caracteres a un array de números
« en: Domingo 3 de Junio de 2012, 01:44 »
Bueno aqui tienes un error muy comun a los que comienzan a trabajar con punteros, y es regresar un puntero a una variable local (en este caso un puntero a cadenafinal).

Ten en cuenta que las variables locales y por lo tanto su direccion, solo son validas dentro de la funcion, una vez saliendo de la funcion, esa variable se destruye, y su contenido ya no es valido, es por eso que return *cadenafinal; no te regresa al valor correcto.

Tienes dos opciones, que utilices memoria dinamica y reserva memoria con malloc dentro de la funcion, para que el valor se conserve, o mejor, no te compliques tanto y tan solo pasa como parametro tu arreglo(vector), y guardas el resultado ahi, sin usar punteros, te dejo el codigo de la segunda opcion para que te des una idea:

Código: [Seleccionar]
void tonumber(char cadena[], int cadenafinal[])
{
    char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    int numeros[100];//, cadenafinal[100];

    unsigned int i, j;

    for(i=0; i<25; i++) numeros[i] = i;
    for(i=25; i<50; i++) numeros[i] = (i-25);

    for(i=0; i<strlen(cadena); i++)
    {
        for(j=0; j<strlen(letras); j++)
        {
            if(cadena[i] == letras[j]) cadenafinal[i] = numeros[j];
        }
    }

    //return cadenafinal;

}

Saludos :)

116
C/C++ / Re:Leer ficheros caracter a caracter [Clases]
« en: Lunes 28 de Mayo de 2012, 20:00 »
Es raro, porque asi es como se debe definir una clase como si fuera una estructura.

Dices que te da error en el getline, pero no pones el codigo completo, ni tampoco mencionas cual es el error que te marca. Mi recomendacion es que publiques el codigo completo y el error, de esa manera podemos ver mas claramente cual es el error, ya que es probable que el error este en otra parte del porgrama o algo que estas poniendo mal.

Otra cosa, ultiliza [ code] en lugar de [ quote], ya que con el quote, los [ i ] se traduce como texto en italica (inclinado) y si te fijas, tu codigo aparece con letras inclinadas.

Saludos :)

117
C/C++ / Re:[Problema] Error de compilación en el prototipado de una función.
« en: Sábado 21 de Abril de 2012, 21:16 »
Seria bueno que explicaras en donde estaba tu error y que hiciste para solucionarlo, de esa manera, si alguien comete el mismo error y busca ayuda, sabra que hacer =)

118
C/C++ / Re:Programa en c++
« en: Sábado 21 de Abril de 2012, 00:44 »
Hola de nuevo Alehtokita.

En primer lugar, no es necesario que pongas toda la lista de errores, si en todas es el mismo errro, si te fijas, en todas es el mismo error, solo que en diferente linea, asi que con la primera linea basta.

En segundo lugar, siempre es bueno aclarar con que compilador y sistema operativo estas trabajando, asi se te puede brindar una mejor ayuda.

Bueno, ahora sobre tu problema, estas utilizando los arreglos de manera equivocada, no estas colocando los indices, en el caso de los arreglos de char cuando representan cadenas solo necesitas el primer indice, ya que el segundo indice representa la longitud de la cadena, en el caso de los arreglo de int, si necesitas los dos indices, no solo uno, de lo contrario tambien marcara error. Tambien es mejor que inviertas los indices de tu arreglo cantidades, para que coincida con tu arreglo de articulos.

Dicho eso, solo te pondre los dos pirmeros ejemplos, te queda de tarea hacer el resto de correcciones en tu programa.

Código: [Seleccionar]
#include <iostream>
#include <stdlib.h>

// las clases cin y cout se encunetran dentro del namespace std
using namespace std;

int main()
{   char articulos[10][30];
    // Invierte los indices, para que coincidan con la declaracion de
    // tu arreglo de cadenas
    int cantidades[10][3];     //3turnos  10 articulos
    for(int i=0;i<10;i++){
     cout<<"Ingrese el nombre del articulo Nº"<<i+1<<" : ";
     // Indice del arreglo de cadenas articulos
     // Solo necesitas uno, pues los arreglos de cadenas
     // se manejan como si fueran vectores pero si debes
     // colocar un indice, en tu codigo lo pusiste sin indice
     cin.getline(articulos[i],30);
     cout<<"Ingrese la produccion en el primer turno : ";
     // En este caso dado que son int, si necesitas los dos indices
     // aunque de igual manera en tu codigo solo ponias un indice
     cin>>cantidades[i][0];

Saludos :)

119
C/C++ / Re:Programa en c++
« en: Viernes 20 de Abril de 2012, 19:11 »
Necesitas poner el namespace en donde se encuentran las clases cin y cout:

Código: [Seleccionar]
#include <iostream>
#include <stdlib.h>

// las clases cin y cout se encuentran dentro del namespace std
using namespace std;

int main()
{

Saludos :)

120
C/C++ / Re:Necesito de su opinion, C++
« en: Domingo 15 de Abril de 2012, 20:13 »
Lee, analiza y luego comenta, no te estoy diciendo que me digas algo contextual, algo pre-fabricado, si no que algo muy propio, algo personal, lo que vos entendas.... Con mis tareas no me conforme con la opinión de alguien, si no que lo investigo....

Solo quiero un apiolen..

Estamos.

En todo caso, el que debe leer, analizar y comentar eres tu, tu eres el que tiene que dar respuestas a esas preguntas, respuestas que como te dijeron arriba las puedes encontrar en algun libro, o buscando en google, ademas este foro es de dudas sobre codigo en C/C++, no sobre preguntas de teoria de lenguaje C, no seas perezoso, y lee analiza y comenta tu, no esperes que otra gente lea, analice y comente por ti.

Saludos :)

121
C/C++ / Re:Problema con doble validacion
« en: Sábado 31 de Marzo de 2012, 21:13 »
El problema viene de la falta de precision de los numeros de punto flotante, aunque tu no lo veas a simple vista, cuando tu guardas un numero de punto flotante siempre habra un error de redondeo, al haber un error de redondeo  entonces cuando tu preguntas while(c!=1); si c no es exactamente uno, la condicion sera verdadera y seguira ejecutando el ciclo. En tu caso usando los valores que pones, la suma de 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.0 me dio internamente 1.00000011920928960000, que como puedes ver no es exactamente el numero uno.

Hay varias soluciones para este problema, la mas sencilla que veo en tu caso es sacar el valor absoluto de la diferencia c-1.0 y utilizar un valor de "tolerancia" para determinar hasta que digito consideras que el numero es igual o diferente.

Dicho de otro modo deberas cambiar la condicion de tu do..while:

Código: [Seleccionar]
while(c!=1);

por:

Código: [Seleccionar]
while(fabs(c-1.0) > 0.1);

Si deseas una menor tolerancia, simplemente modifica el 0.1 por el valor que consideres que seria el mas adecuado para tu caso (0.01, 0.001, 0.0001, etc.)

Saludos =)

122
Java / Re:Problemas con Ejercicio Sencillo
« en: Sábado 24 de Marzo de 2012, 23:20 »
Hola de nuevo.

Bueno ahora si publicaste tu codgio completo y analizandolo me doy cuenta que cometes un error de logica en el siguiente fragmento:

Código: [Seleccionar]
                for (i=0;i<=1;i++)
                       
                {
                        if (clientes[i].dni == dnis)
                                r=clientes[i].saldo;
                        else
                                r=0;
                               
                               
                       
                }

Utilizas un ciclo for para buscar el DNI, pero nunca sales del ciclo cuando lo encuentras, ademas en el else pones r=0, de esa forma aun cuando lo encuentras, vuelves a poner el saldo en cero. Asi como esta si por ejemplo tienes 10 DNI, solo en una pasada del ciclo haces r=clientes[ i ].saldo;, pero en las otras nueve pasadas haces r=0.

En mi opinion lo mas correcto es eliminar el else, esta de mas, ya que de todas formas antes de entrar al ciclo haces r=0, ademas debes agregar una forma de salir del ciclo una vez que encuentras el DNI, lo mejor es utilizar break, que te permite salir del for antes de que se ejecute n numero de veces.

Sin embargo veo otro problema, ¿que pasa si algun cliente tiene un saldo de cero? No tienes forma de distinguir cuando no encuentras el DNI, y cuando el saldo es cero, ya que en ambos casos te dara cero el resultado. En este supuesto yo sugeriria que en lugar de hacer r=0, hagas r=-1, ya que un saldo nunca podra tener un valor negativo, de esa manera separarias cuando el DNI no se encuenta de cuando alguien tiene un saldo de cero.

Dicho eso, el codigo corregio seria algo como:

Código: [Seleccionar]
import java.util.*;
 
 
public class Cajero   {
 
       
       
       
        public Cliente[] clientes = new Cliente[2];
       
       
        public static void main(String[] args) {
                int valor;
                int dnisearch;
                int i;
                Scanner s = new Scanner(System.in);
                Cajero ca = new Cajero();
                               
                for (i=0;i<=1;i++)
                {
                ca.clientes[i] = new Cliente();
                System.out.println("Ingrese Cliente, DNI y Saldo");
                ca.clientes[i].setData();
                       
                }
               
       
               
                for (i=0;i<=1;i++)//compruebo q los datos estan bien ingresados
                {
                        System.out.println("Cliente: "+ca.clientes[i].nombre);
                        System.out.println("Saldo: "+ca.clientes[i].saldo);
                }
               
               
                System.out.println("ingrese dni para obtener saldo");
                dnisearch = s.nextInt();
               
                valor= ca.getSaldo(dnisearch);
                if (valor == -1)
                System.out.println("DNI no encontrado");
                else
                System.out.println("saldo "+valor);
 
        }
 
       
        public int getSaldo (int dnis)
       
        {
               
                int i;
                // r = -1 para indicar que no encontro el dni
                int r=-1;
                for (i=0;i<=1;i++)
                       
                {
                        if (clientes[i].dni == dnis)
                        {
                                r=clientes[i].saldo;
                                // Salir del for si encuentra el DNI
                                break;
                              }
// Eliminamos esto, que es innecesario
//                        else
//                                r=0;
                               
                               
                       
                }
       
                        return(r);             
                       
               
               
        }
}

Ahora respecto a:
Citar
Supongan que tengo ke leer un entero en el metodo getSaldo(), deberia definir como lo hice en el main Scanner s = new Scanner(System.in); y ahi justamente es donde radica mi duda, porqué lo tengo que definir de nuevo??? si ya lo he hecho en el main.

El que lo definas en el main no significa que sera vaildo para todo el programa, ya que la variable "Scanner s" al estar definida dentro del main, solo es valida para ese metodo, entra en el ambito de lo que son "variables locales". Para que puedas utilizar esa variable en toda la clase debes definirla como tu mismo dices en los atributos de la clase, y ademas me parece que debes definirla como static, ya que de lo contrario tendrias que instanciar la clase Cajero para poder utilizar la variable.

Bueno espero con esto haber aclarado tus dudas.

Saludos =)

123
Java / Re:Problemas con Ejercicio Sencillo
« en: Sábado 24 de Marzo de 2012, 01:59 »
Hola franZn, bueno das muy poca informacion para poder ayudarte, en el codigo que publicaste estas usando la clase Cliente, pero no veo su definicion, sospecho que el error esta en que el miembro saldo de la clase Cliente no es de tipo entero, digo sospecho porque si no pones el codigo es imposible de saber.

Ahora respecto a esto:

Citar
porque tengo ke definir 2 veces esto: Cajero ca = new Cajero(), intente ponerlo fuera de los metodos pero no funciona.

Al decir "no me funciona" no podemos saberlo sin mas datos, disculpa si parezco algor rudo, pero no somos adivinos. Para saber por que no funciona, necesitamos saber exactamente cual es el error que te da, ¿es error de sintaxis?, ¿o acaso es error de logica?, por lo tanto deber colocar cual es el error EXACTO que te marca, si es error de compilador, o es un error en el resultado, ademas debes colocar EXACTAMENTE el codigo tal como lo tienes, y la linea en que te esta marcando el error.

De esa manera se puede analizar y ver que estas haciendo mal, de otra forma, es solo adivinar.

Saludos :)

124
Power Builder / Re:Codigo Fuente De Un Sist. Inventario Y Facturacion
« en: Sábado 28 de Enero de 2012, 17:07 »
por favor puedes enviarme el programa a mi correo soy nuevo y quisiera que me ayudes con eso mi correo es: nehru_lex@hotmail.com

Bueno, me parece que no viste la fecha del mensaje, febrero de 2005, este mensaje tiene 7 años, y la persona ya no visita el foro, no creo que obtengas respuesta de el.

Hay que revisar siempre la fecha del mensaje antes de postear, no es correcto revivir hilos tan viejos.

Saludos :)

125
C# / Re:Grid Editable y actualizable con Linq
« en: Jueves 26 de Enero de 2012, 21:54 »
Lo que mencionas es posible de hacer, pero el codigo excede con mucho lo que seria una simple duda.

Sugiero que comiences con algo sencillo, diseña un grid primero, luego utiliza los eventos para hacerlo editable, y al final añade la funcionalidad poco a poco para actualizarlo mediante LINQ enlazado a datos.

Tambien puedes revisar la pagina de http://www.codeproject.com (en ingles), Ahi encontraras muchos ejemplos de codigo en diversos lenguajes de programacion, quizas encuentres algun codigo de grid, que sirva a lo que necesitas.

Saludos :)

Páginas: 1 ... 3 4 [5] 6 7 ... 32