Foros del Web » Programación para mayores de 30 ;) » Programación General »

char[] con C

Estas en el tema de char[] con C en el foro de Programación General en Foros del Web. Hola muchachos(as) gracias de antemano. quiero que por favor analizen este codigo: #include <iostream.h> #include <conio.h> void main() { int dec, aux; char chain[100]; cout ...
  #1 (permalink)  
Antiguo 21/11/2003, 18:21
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
char[] con C

Hola muchachos(as) gracias de antemano. quiero que por favor analizen este codigo:

#include <iostream.h>
#include <conio.h>
void main()
{
int dec, aux;
char chain[100];
cout << "Introducir Decimal: ";
cin >> dec;
if (dec < 0) {
cout << "\nERROR; Entrada no valida";
main();
}
else {
while (dec < 0) {
aux = (dec % 2);
chain == chain + aux;
dec = (dec / 2);
}
cout << "\nEl numero en Binario es: " << chain;
}
}



no se si lo notaron, pero es para convertir numeros decimales a binarios, en fin. el problema es que para mostrar el cadena chain, tengo que agregarle los resultados de las divisiones. al correr el programa, salen simbolos raros, y si en vez de asignar, igualo (=)
el programa muestra error.

pueden ayudar? se los agradezco mucho.
  #2 (permalink)  
Antiguo 22/11/2003, 08:57
Flaviog
Invitado
 
Mensajes: n/a
Puntos:
consejos

Hola!
a mi me parece problema esta en los tipos de datos y en la asignacion.
seria mejor usar
char *chain;
chain =new *char;
y asignas:
*chain=aux;
aux es de tipo int,asi q quizas sea bueno ponerle una mascara (char)
en esta compu no tengo c++,asi q no puedo explicar 100% correctamente.
suerte!
  #3 (permalink)  
Antiguo 22/11/2003, 11:52
 
Fecha de Ingreso: septiembre-2003
Mensajes: 172
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola, el problema básico es que estas asignando a una posicion de memoria un entero, la linia
chain=chain + aux
no cambia el valor del caracter de la cadena, si no que cambiaria la direccion del primer elemento de la cadena chain (el nombre de una cadena es un apuntador a la primera posicion, igual que los vectores.)
Luego otra cosa, si asignas un entero aux a un caracter de chain, la cadena guardara el caracter de codigo ascii aux, con lo que si contiene un 0 o un 1 estarias guardando caracteres no imprimibles, sumandole el caracter '0' te devuelve el codigo correcto.
Por ultimo la conversion la realizaba al reves, yo he optado por darle la vuelta a la cadena usando una auxiliar, pero se podria hacer de otras maneras.

Espero haberte sido de ayuda.

Saludos!


#include <iostream.h>
#include <conio.h>
void main()
{
int dec, aux,i,j;
char chain[100],reverse[100];
cout << "Introducir Decimal: ";
cin >> dec;
if (dec < 0) {
cout << "\nERROR; Entrada no valida";
main();
}
else {
i=0; //indice de la cadena
while (dec > 0) {
aux = (dec % 2);
chain[i]= aux+'0'; //suma el 0 para transformar el número a su número deciaml
dec = (dec / 2);
i++;
}
chain[i]='\0'; //cierra la cadena
i--; //vuelve una posicion atras
for (j=0;i>=0;i--,j++) //le da la vuelta al numero
{reverse[j]=chain[i];}
reverse[j]='\0'; //cierra la cadena
cout << "\nEl numero en Binario es: " << reverse;
}
}
__________________
Sr.Propio
  #4 (permalink)  
Antiguo 22/11/2003, 17:31
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
amigo, gracias.

es mucho pedir, lo se.
pero no entiendi nada, podrias explicar que es la j y la i que pones en los char? y como es eso de reversar la cadena?

MILES de gracias.
  #5 (permalink)  
Antiguo 22/11/2003, 18:06
 
Fecha de Ingreso: septiembre-2003
Mensajes: 172
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola!

La j y la i son son indices de la cadena. Una cadena de caracteres en C es un vector de caracteres por ejemplo imaginate una variable cadena se llame Cad y que contenga "Hola", entonces Cad[0] contendria 'H', Cad[1] = 'o' , Cad[2] = 'l' ,Cad[3] = '3' y Cad[4] contiene el caracter especial '\0' que es el que cierra la cadena, asi evitamos que si por ejemplo hemos declarado Cad como un char[10] nos pinte los 6 caracteres sobrantes (que son los que muestran los caracteres raros).

Por eso uso la i y la j, para hacer referencia a los caracteres concretos que tienes que modificar.

Lo de darle la vuelta a la cadena es pq en el primer bucle (while) te convierte el numero a binario pero te lo pone al reves, por ejemplo, si conviertes el 2, te queda 01 cuando el resultado debe ser 10. reverse es simplemente otra variable a la que le voy asignado el ultimo caracter de chain al primero de reverse... y asi sucesivamente hasta que "i" sea menor que 0 que es el primer indice.

Se que no me explico muy bien, así que perdona. Si tienes mas dudas intentare explicarme mejor.

Saludos!
__________________
Sr.Propio
  #6 (permalink)  
Antiguo 22/11/2003, 18:22
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
te lo agradezco mucho rafa!!
  #7 (permalink)  
Antiguo 22/11/2003, 18:32
 
Fecha de Ingreso: septiembre-2003
Mensajes: 172
Antigüedad: 20 años, 7 meses
Puntos: 0
Hoy por ti mañana por mi! ;p
__________________
Sr.Propio
  #8 (permalink)  
Antiguo 26/11/2003, 09:25
Flaviog
Invitado
 
Mensajes: n/a
Puntos:
mejora

creo q asi es mejor.chequea!

#include <iostream.h>
#include <process.h>
void dectobin(int);
void main(){
int dec;
cout << "\n\nIntroducir Decimal: ";
cin >> dec;
if (dec < 0){
cout << "\nERROR; Entrada no valida";
exit(0);
}
cout << "El numero en Binario es: ";
dectobin(dec);
}
void dectobin(int d){
int aux;
if (d > 0){
aux = d % 2;
d /= 2;
dectobin(d);
cout << aux;
}
}
  #9 (permalink)  
Antiguo 26/11/2003, 12:11
 
Fecha de Ingreso: septiembre-2003
Mensajes: 172
Antigüedad: 20 años, 7 meses
Puntos: 0
Sí, recursivamente ahorras código, ya lo intenté así, pero de lo que no fui capaz es de asignarle a una cadena el valor devuelto ya que no se que carácter estaria añadiendo. Como se podria hacer?

Saludos!
__________________
Sr.Propio
  #10 (permalink)  
Antiguo 26/11/2003, 18:30
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
gracias a ambos. no se si lo mencione antes, pero es un programa de mi primer semestre en la univ. y se que es una funcion, pero como no permiten aplicar mas de la funcion main, seria trampa :D gracias a ambos
  #11 (permalink)  
Antiguo 29/11/2003, 09:32
Flaviog
Invitado
 
Mensajes: n/a
Puntos:
Pregunta a ver!

Chequea los cambios.quizas sea lo q tu querias.

#include <iostream.h>
#include <process.h>
int i=0;
char *dectobin(int);
void main(){
int dec;
cout << "\n\nIntroducir Decimal: ";
cin >> dec;
if (dec < 0){
cout << "\nERROR; Entrada no valida";
exit(0);
}
cout << "El numero en Binario es: " << dectobin(dec);
}
char *dectobin(int d){
char *chain;
int aux;
if (d > 0){
aux = d % 2;
d /= 2;
chain=dectobin(d);
chain[i++]=aux+'0';
chain[i]='\0';
}
return chain;
}
  #12 (permalink)  
Antiguo 06/12/2003, 15:19
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
Buenas muchachos, bueno, ustedes me han ayudado. ahora tengo otro problema, creo que se relaciona con el char. les agradezco su ayuda. aqui vamos:

#include <iostream.h>
#include <conio.h>
#include <math.h>
void main() {
int opc, cont1,i=0,cont2;
double pi,form,aux;
long double mst;
char pcm[32];
char nb0[4] = {0,0,0,0};
char nb1[4] = {0,0,0,1};
char nb2[4] = {0,0,1,0};
char nb3[4] = {0,0,1,1};
char nb4[4] = {0,1,0,0};
char nb5[4] = {0,1,0,1};
char nb6[4] = {0,1,1,0};
char nb7[4] = {0,1,1,1};
char nb8[4] = {1,0,0,0};
char nb9[4] = {1,0,0,1};
char nb10[4] = {1,0,1,0};
char nb11[4] = {1,0,1,1};
char nb12[4] = {1,1,0,0};
char nb13[4] = {1,1,0,1};
char nb14[4] = {1,1,1,0};
char nb15[4] = {1,1,1,1};
pi = 3.14;
form = (32*sin(2*pi*aux) + 32);
clrscr();
cout << "Seleccione una Opcion: \n";
cout << " 1- Realizar Codificacion PCM\n";
cout << " 2- Realizar Decodificacion PCM\n";
cout << " 3- Salir\n";
cout << " Su Opcion: ";
cin >> opc;
if (opc <= 0){
cout << "Opcion Erronea ";
getch();
cont1++;
main();
}
if (opc > 3) {
cout << "Opcion Erronea ";
getch();
cont1++;
main();
}
if (opc == 1) { //en esta linea tengo un error al igualar (=)
clrscr();
for (cont2 = 1; cont2 > 8; cont2++) {
cout << "Introducir muestras a modificar: \n";
cout << "Muestra " << cont1 << ":\n";
cin >> mst;
if (mst < 0 ) {
cout << "Valor Incorrecto";
getch();
main();
}
mst = aux;
if (form>=0) {
if (form<=3.999) {
pcm[i++] = nb0[4];
}
else if (form>=4.000) {
if (form <= 7.999) {
pcm[i++] = nb14];
}
}
else if (form>=8.000) {
if (form <= 11.999) {
pcm[i++] = nb2[4];
}
}
else if (form>=12.000) {
if (form <= 15.999) {
pcm[i++] = nb3[4];
}
}
else if (form>=16.000) {
if (form <= 19.999) {
pcm[i++] = nb4[4];
}
}
else if (form>=20.000) {
if (form <= 23.999) {
pcm[i++] = nb5[4];
}
}
else if (form>=24.000) {
if (form <= 27.999) {
pcm[i++] = nb6[4];
}
}
else if (form>=28.000) {
if (form <= 31.999) {
pcm[i++] = nb7[4];
}
}
else if (form>=32.000) {
if (form <= 35.999) {
pcm[i++] = nb8[4];
}
}
else if (form>=36.000) {
if (form <= 39.999) {
pcm[i++] = nb9[4];
}
}
else if (form>=40.000) {
if (form <= 43.999) {
pcm[i++] = b10[4];
}
}
else if (form>=44.000) {
if (form <= 47.999) {
pcm[i++] = nb11[4];
}
}
else if (form>=48.000) {
if (form <= 51.999) {
pcm[i++] = nb12[4];
}
}
else if (form>=52.000) {
if (form <= 55.999) {
pcm[i++] = nb13[4];
}
}
else if (form>=56.000) {
if (form <= 59.999) {
pcm[i++] = nb14[4];
}
}
else if (form>=60.000) {
if (form <= 64.000) {
pcm[i++] = b15[4];
}
}
}
}
pcm[i++] = '\0';
cout << "\nCodificacion PCM: " << pcm[i];
getch();
}
cout << form;
}


se que esta un desorden, pero les ruego la ayuda. si hace falta una explicacion avisenme y les explicare... si pueden correrlo y verlo por ustedes mismos, seria mejor. un saludo y gracias
  #13 (permalink)  
Antiguo 07/12/2003, 23:24
 
Fecha de Ingreso: abril-2003
Mensajes: 33
Antigüedad: 21 años
Puntos: 0
este ultimo codigo se supone q codifica y decodifica algun archivo o q?, es q en el borland c q tengo no jalo....

saludos.
  #14 (permalink)  
Antiguo 08/12/2003, 20:49
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
mejor olvida lo que puse antes.. fui un tonto al no verlo.. ahora si, miren esto :


#include <iostream.h>
#include <conio.h>
#include <math.h>
int pcm(double);

int pcm(double samp) {
double pi = 3.14,mt;
short int d1,d2,d3,d4;
mt = 32*sin(2*pi*samp) + 32;
if ((mt>=0)&&(mt<=3.999)) {
d1=0;d2=0;d3=0;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=4)&&(mt<=7.999)) {
d1=0;d2=0;d3=0;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=8)&&(mt<=11.999)) {
d1=0;d2=0;d3=1;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=12)&&(mt<=15.999)) {
d1=0;d2=0;d3=1;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=16)&&(mt<=19.999)) {
d1=0;d2=1;d3=0;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=20)&&(mt<=23.999)) {
d1=0;d2=1;d3=0;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=24)&&(mt<=27.999)) {
d1=0;d2=1;d3=1;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=28)&&(mt<=31.999)) {
d1=0;d2=1;d3=1;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=32)&&(mt<=35.999)) {
d1=1;d2=0;d3=0;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=36)&&(mt<=39.999)) {
d1=1;d2=0;d3=0;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=40)&&(mt<=43.999)) {
d1=1;d2=0;d3=1;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=44)&&(mt<=47.999)) {
d1=1;d2=0;d3=1;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=48)&&(mt<=51.999)) {
d1=1;d2=1;d3=0;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=52)&&(mt<=55.999)) {
d1=1;d2=1;d3=0;d4=1;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=56)&&(mt<=59.999)) {
d1=1;d2=1;d3=1;d4=0;
cout << d1 <<d2 << d3 << d4;
}
if ((mt>=60)&&(mt=64)) {
d1=1;d2=1;d3=1;d4=1;
cout << d1 <<d2 << d3 << d4;
}
return 0;
}
void main() {
int opc;
double m1,m2,m3,m4,m5,m6,m7,m8;
cout << "Seleccione una Opcion: \n";
cout << " 1- Realizar Codificacion PCM\n";
cout << " 2- Realizar Decodificacion PCM\n";
cout << " 3- Salir\n";
cout << " Su Opcion: ";
cin >> opc;
if (opc <= 0){
cout << "Opcion Erronea ";
getch();
main();
}
else if (opc > 3) {
cout << "Opcion Erronea ";
getch();
main();
}
else if (opc = 1) {
cout << "Ingrese muestras a codificar: \n";
cout << "\nMuestra 1: ";
cin >> m1;
cout << "\nMuestra 2: ";
cin >> m2;
cout << "\nMuestra 3: ";
cin >> m3;
cout << "\nMuestra 4: ";
cin >> m4;
cout << "\nMuestra 5: ";
cin >> m5;
cout << "\nMuestra 6: ";
cin >> m6;
cout << "\nMuestra 7: ";
cin >> m7;
cout << "\nMuestra 8: ";
cin >> m8;
cout << "La codificacion es: ";
cout << pcm(m1);
cout << pcm(m2);
cout << pcm(m3);
cout << pcm(m4);
cout << pcm(m5);
cout << pcm(m6);
cout << pcm(m7);
cout << pcm(m8);
getch();
}
}


el resultado, de mas numeros de lo normal.... alguien sabe el porque?
  #15 (permalink)  
Antiguo 09/12/2003, 09:16
 
Fecha de Ingreso: abril-2003
Mensajes: 33
Antigüedad: 21 años
Puntos: 0
hola

como te dije: no jalo el codigo que pegaste; y tampoco ahora, asi que le "corregi" los detalles pa q jalara (almenos en borlandc)

1. por ahi existen algunos if...&&(variable=xnumero)
esta mal debe ser ==
2. hay algunos main();<---pa llamar al main
se los cambie a main;

ahora, no entiendo aun que quieres hacer...que es PCM?

saludos.
  #16 (permalink)  
Antiguo 09/12/2003, 13:35
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
no te preocupes, despues de hacerle una corrida manual vi mi error.. =) gracias por tu preocupacion y por la ayuda de los demas. see ya!
  #17 (permalink)  
Antiguo 17/12/2003, 07:53
Avatar de Jose2k  
Fecha de Ingreso: junio-2003
Mensajes: 98
Antigüedad: 20 años, 10 meses
Puntos: 0
hey rafa, una pregunta para ti:
como reverso una combinacion de salidas, pero sin usar un string?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:37.