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 - seryioo

#11
Programación C/C++ / Duda sobre registros en C++
6 Septiembre 2015, 23:28 PM
Hola a todos, estoy haciendo un ejercicio en el que se me pide hacer una agenda con el nombre, apellidos y número de cada contacto.

En una parte del enunciado se me dice lo siguiente:"
void leer_contacto(Tentrada& ent),
que se encargará de pedir y leer, de la consola, los datos de un contacto, pasar nombre y apellido a mayúsculas, y rellenar con ellos los campos de la entrada ent que recibe como argumento."


No entiendo bien a qué se refiere con " pedir y leer, de la consola".
¿Dónde están esos datos que tengo que pedir y leer?¿Están ya en la entrada o tiene que meterlos el usuario?

Si me está dando en el argumento de la función acceso al registro (Tentrada& ent) y las declaraciones son las siguientes, cómo accedo  a los campos del array entradas para discernir entre cada entrada con sus respectivos contactos?

Código (cpp) [Seleccionar]
struct Tentrada {
string nombre;
string apellido;
long numero;
};

struct Tagenda {
Tentrada entradas [DIM];
Unsigned numEntradas;
};




Gracias.
#12
subforo equivocado amigo
#13
En el ejercicio se me pide calcular Vo en función de los parámetros del circuito.



La verdad es que he intentado varias cosas, el teorema de superposición, representar el modelo circuital con fuentes de tensión dependientes, por tensiones nodales... pero no me aclaro con las 3 resistencias a la izquierda del nodo 1.

Os cuento lo que he razonado:

En el NODO 1 hay Vg2/2 porque lo que tenemos a la patilla positiva del A.O. es un divisor de tensión y por cortocircuito virtual, cómo las tensiones entre terminal positivo y negativo son iguales y las corrientes que circulan son 0, Vp=Vg2/2 =Vn que es la tensión en el NODO 1
En el NODO 2 tenemos Vg1/4, ya que tenemos otro divisor de tensión.
En el NODO 3 observamos que tenemos inmediatamente Vg2.

Ahora empiezo con analizando el AO con los datos que he obtenido.

(Vo-Vi)/2R = (V1-V2)/R + (V1-Vg2)/R

Tengo algún razonamiento erróneo?

Gracias
#14
Muchas gracias, duda resuelta. Es algo que no sabía.
#15
Otra cosa más, por qué restas aquí el ASCII de '0' ?

Código (cpp) [Seleccionar]
num += palabra[i]-'0'

Es que si no lo pongo me pasa lo siguente:

#16
No entiendo por qué pones '' si estás comparando 2 números, el que está dentro de la cadena y el 0 por ejemplo. ¿Qué diferencia hay entre ponerlos o no?

Código (cpp) [Seleccionar]
  if(palabra[i] <'0' || palabra[i] >'9')

Si pones '5', por ejemplo, lo que se mira es el codigo ASCII no?
Me he hecho un lío. Entonces, cuándo pongo '0' y cuando pongo 0?
#17
Buenas a todos, aquí sigo, peleando con las cadenas de caracteres.
Veréis, se me plantea el siguiente ejercicio: (no puedo usar ninguna función predefinida que haga el trabajo de cadena_a_int)

Código (cpp) [Seleccionar]
/*15) Función para producir el valor numérico correspondiente a una cadena de dígitos; p.e.
para la cadena "-234" debe producir el número -234. La función comprobará si todos los
caracteres son dígitos y devolverá el parámetro ok a true o false según haya podido
producir el valor o no.
void cadena_a_int(const TCadena cad, int& num, bool& ok)*/


Pero el programa que he escrito no me funciona, no se por qué, agrego al código explicando algunas cosillas con comentarios a ver si veis lo que pasa.

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
using namespace std;

typedef char TCadena[];

//---------------------------

void cadena_a_int(const TCadena cad, int& num, bool& ok);

int  longitud (const TCadena cad);

//---------------------------

int main (){
   int num=0;
   char cad[]={99};
   bool ok;
   cadena_a_int(cad, num, ok);
   cout<<num;

   return 0;
}

//---------------------------

void cadena_a_int(const TCadena cad, int& num, bool& ok){
   int  pos=longitud(cad)-1;
   int i=0;
   ok=true;
   bool error=false;           //CONTROLA MAS ADELANTE QUE SE ENCUENTRE ALGUN CARACTER QUE NO SEA NUMERO
   bool negativo=false;           //CONTROLA MAS ADELANTE QUE SI HEMOS ENCONTRADO EN PRIMER LUGAR UN '-' SE MULTIPLIQUE NUM*-1
   if(cad[0]=='-') negativo=true;           //CONTROL PARA NUMEROS NEGATIVOS
   while(cad[pos]>=0 && !error){           //MIENTRAS LA POSICION ES MAYOR O IGUAL QUE 0 Y NO HAY ERROR
       if(cad[pos]>=0 && cad[pos]<=9){           //SI LO QUE TENEMOS ES UN NUMERO, ENTONCES NUM+X*10^i= NUM
           num+=cad[pos]*pow(10,i);
           cout<<cad[pos];           //ESTOY COMPROBANDO SI SE EJECUTA EL BUCLE... POR LO VISTO NO SE EJECUTA...
           ++i;
       }else{
       error=true;
       ok=false;
       }//end else
       --pos;
   }//end while

   if(negativo) num*-1;          // PARA NUMEROS NEGATIVOS, NUM*-1
}

int longitud (const TCadena cad){
   int l=0;
   while(cad[l]!='\0') ++l;
   return l;
}
#18
Buenas, gracias por tu respuesta.

He arreglado eso que dices, pero sigo teniendo el mismo error:

Código (cpp) [Seleccionar]
void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
       if(longitud(destino)<dim){
           destino[longitud(destino)]=c;
            destino[longitud(destino)+1]='\0';
            ok=true;
       }else ok=false;
}


PD:

Lo he arreglado, me he dado cuenta que al añadir el caracter la longitud de destino aumenta, por lo que guardo la longitud inicial para usarla correctamente despues, donde añado \0

Código (cpp) [Seleccionar]
void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
       unsigned i=longitud(destino);
       if(longitud(destino)<dim){
           destino[i]=c;
            destino[i+1]='\0';
            ok=true;
       }else ok=false;
}



Sigue sin funcionarme la función "encadenar". A ver si consigo encontrar el error y corregirla.

Código (cpp) [Seleccionar]

void encadenar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
    unsigned lor=longitud(origen);
    unsigned ldes=longitud(destino);
    if(lor+ldes<=dim){
        ok=true;
        unsigned i=0;
        while(origen[i]!='\0'){
            destino[ldes+i]=origen[i];
            ++i;
        }//end while
        destino[i]='\0';
    } ok=false;
}
#19
Buenas a todos, tengo una duda.

Si tengo las dimensiones de una cadena de caracteres...

Código (cpp) [Seleccionar]

char cadena1[80]


... e introduzco por ejemplo en cadena1: "El pajaro vuela", el caracter nulo "\0" estaría inmediatamente después de vuela\0 o estaría en la posición 80 de cadena1 por haber definido su tamaño previamente?

PD: Es que en un ejericio me salen datos basura... no se qué estoy haciendo mal.
Os dejo el código. El main ya venía hecho.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

typedef char TCadena [];

// Funciones para modificar cadenas de caracteres ----------------------

unsigned longitud (const TCadena cad);

void copiar(TCadena destino, const unsigned dim, const TCadena origen,
                                                              bool& ok);
// Copia los caracteres de la cadena origen en la cadena destino de
// tamañoo dim. Devuelve false en ok si no tiene capacidad suficiente

void agregar_char(TCadena destino, const unsigned dim, const char c,
                                                           bool& ok);
// Agrega el carácter c al final de la cadena destino.
// Devuelve ok a false cuando no tiene capacidad suficiente

void encadenar(TCadena destino, const unsigned dim,
                                 const TCadena origen, bool& ok);
// Agrega todos los caracteres de la cadena origen al final de la cadena
// destino. Devuelve ok a false cuando no tiene capacidad suficiente


//- Programa de prueba -------------------------------------------------

int main(){
    setlocale(LC_ALL, "spanish");

    char cadena1[80], cadena2[80];
    char c;
    bool ok;

    cout << "Introducir una cadena:\n";
    cin >> ws;
    cin.getline(cadena1,79);

    cout << "Introducir un carácter: ";
    cin >> c;
    agregar_char(cadena1, 80, c, ok);
    if(ok){
      cout << "Al agregarle el carácter la cadena queda:\n";
      cout << cadena1 << endl;
    } else {
      cout << "No hay espacio para agregar un carácter\n";
    }

    copiar(cadena2, 80, cadena1, ok);
    if (ok){
          cout << "La cadena copiada es: \n";
          cout << cadena2 << endl;
    } else {
          cout << "No hay espacio para la copia" << endl;
    }

    cout << "Pegando las dos cadenas resulta: \n";
    encadenar(cadena2, 80, cadena1, ok);
    if (ok){
          cout << cadena2 << endl << endl;
    } else {
          cout << "No hay espacio para encadenar" << endl;
    }

    cout<<longitud(cadena2);
    return 0;
}

//- Definiciones de funciones ------------------------------------------

unsigned longitud (const TCadena cad){
    unsigned pos=0;
    while (cad[pos]!='\0') ++pos;
    return pos;
}


void copiar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
    if(longitud(origen)<=dim){
        ok=true;
        unsigned i=0;
        while(origen[i]!='\0'){
            destino[i]=origen[i];
            ++i;
        }//end while
    }else ok=false;
}

void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
        if(longitud(destino)<dim){
            destino[longitud(destino)]=c;
             ok=true;
        }else ok=false;
}

void encadenar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
    if(longitud(origen)>dim-longitud(destino)){
        unsigned i=longitud(destino)+1;
        unsigned pos=0;
        while(origen[pos]!='\0'){
            destino[i]=origen[pos];
            ++i;
        }//end while
        ok=true;
    }else ok=false;
}


#20
Hola a todos. Esta vez traigo una duda con ejercicios de cadenas de caracteres.
Tengo que hacer una función que compare 2 cadenas ignorando las mayúsculas y minúsculas y me devuelva si son o no iguales.

Había pensado en hacerme una función "void aMayuscula (TCadena cad)" que convirtiera toda la cadena a mayuscula para implementarla en otra función y comparar las 2 cadenas pasadas a mayúscula. Pero para hacer esto tendría o que crear una cadena nueva copiando el contenido de la original  ya en mayúscula o sobrescribir la original, cosa que no puedo porque en la pLantilla que me dan me pasan las cadenas como "const"
Lo que he hecho al final es una función "char aMayuscula (TCadena cad, unsigned pos)" que va dentro de un while que recorre las 2 cadenas y compara una a una las letras devueltas por la función "char aMayuscula".

Código (cpp) [Seleccionar]

char aMayuscula(TCadena cad, unsigned pos){
    char a;
    if(cad[pos]!='\0'){
        if(cad[pos]>='a' and cad[pos]<='z'){
            a=cad[pos]-32;
        }//end if
    }//end if
    return a;
}


A continuación, la función que compara las cadenas:

Código (cpp) [Seleccionar]

bool iguales_ignorando_tipo(const TCadena cad1, const TCadena cad2){
    unsigned i=0;
    bool es=true;
    while(es && cad1[i]!='\0'&& cad2[i]!='\0' ){
        if(aMayuscula(cad1,i)!=aMayuscula(cad2,i)) es=false;
        ++i;
    }
    return es;
}



Al compilar me da error "invalid conversion from 'const char*' to 'char*'" Y no entiendo por qué sale.


¿Qué tengo mal?