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

#21
Hola edr89.

CitarSe deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?
No es estríctamente necesario si vas a asignarle valores a sus miembros antes de utilizarlos.

CitarLa sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?
Si la declaras dentro de la función main sólo será accesible dentro de la misma. Revisar sobre el ámbito de las variables te va a aclarar ese tema: Ambito de las variables

Un ejemplo con inicialización:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
 char nombre[15];
 float latitud;
 float longitud;
} coordinate;

int main()
{
 // inicializacion
 coordinate ubicacion_01 = {"",0,0};
 coordinate ubicacion_02 = {"Helsinki", 60.1699, 24.9384};
 coordinate *pt1, *pt2;

 pt1 = &ubicacion_01;
 pt2 = &ubicacion_02;

 printf("Escribe el nombre del lugar: ");
 fgets(pt1->nombre, 16, stdin);
 printf("Lugar: %s\n",pt1->nombre);
  //...
 printf("Lugar: %s\nLatitud: %f\nLongitud: %f",
   pt2->nombre, pt2->latitud, pt2->longitud);

 getchar();
 return 0;
}


Saludos :)


#22
Programación C/C++ / Re: getc() y printf
12 Septiembre 2013, 23:44 PM
Hola.

Sin dudas se debe a la lectura que previamente haces con fread ya que de ese modo desplazas el apuntador del archivo y luego lógicamente, lees el próximo con fgetc.

Si cambias por:

 ...
 printf("Caracter central: %c", letra);
 ...

tendría que funcionar.

Pero si tu intención es sólo mostrar el caracter central, podrias hacer:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fd;

  if((fd = fopen("C:\\PRUEBA.txt","rt"))!= NULL) {
   fseek(fd, 0L, SEEK_END);
   fseek(fd, ftell(fd) >> 1, SEEK_SET);
   printf("Caracter central: %c", fgetc(fd));
    fclose(fd);
  }
  else
    printf("No se pudo abrir archivo");
  return 0;
}


Saludos :)
#23
Hola erest0r.

Proba de este modo:

Código (cpp) [Seleccionar]
#include <iostream>
#include <iomanip>

#define MAX 500

using namespace std;

int main()
{
 cout << "   h" << "   c1" << "   c2" << "    V" << endl;
 cout << "---------------------" << endl;

  for (int h = 1; h*h <= MAX; h++) {
   for(int a = 1; a < h; a++)
     for(int b = 1; b < h; b++)  // (*)
       if (h*h == a*a + b*b)
         cout << "(" << setw(3) << h << "," << setw(3) << a
              << "," << setw(3) << b << " ) = " << h*h << endl;
 }
 return 0;
}


Pero hay algo del enunciado (comentado en el código) que no me quedó claro y es que si se toman como válidas aquellas ternas que tengan iguales valores en catetos diferentes, como por ejemplo:

h = 5, c1 = 3, c2 = 4
h = 5, c1 = 4, c2 = 3


De no ser así, tendrías que cambiar la línea (*) por:
Código (cpp) [Seleccionar]
 ...  
   for(int b = 1; b < a; b++)
   ...


Saludos :)

#24
Hola m@o_614 .

El valor de EOF depende del sistema de archivos, pero comúnmente es interpretado con el valor -1, por lo que creo que podrías probar de este modo:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fd;

  if((fd = fopen("F:\\archivo1.txt", "rt")) != NULL) {
    if (fseek(fd, 0L, SEEK_SET) != 0)
      printf("No se pudo posicionar el cursor al inicio");
    else
      printf("El primer caracter legible del archivo es: %c\n", fgetc(fd));

    if (fseek(fd, EOF-2 , SEEK_END) != 0) // ( EOF-2 o: -3L )
      printf("No se pudo posicionar el cursor al final");
    else
      printf("El ultimo caracter legible del archivo es : %c\n",fgetc(fd));
  }
  else
    printf("No se pudo abrir archivo");

  getchar();
  return 0;
}


Saludos :)
#25
Hola

El primer parámetro de argv lo encontras en el índice 1 no en 0, por otro lado no estas indizando argv.

Por ejemplo cuando dice:
Código (cpp) [Seleccionar]
for(int i=0;i<argc;i++)
  {
  cout<<"\n"<<argv<<"\n";
  }  


Debería ser por ejemplo:
Código (cpp) [Seleccionar]

 for(int i=0;i<argc;i++)
   cout << argv[i] << endl;


En definitiva, de este modo creo que tendría que funcionarte:
Código (cpp) [Seleccionar]

#include <iostream>
#include <sstream>

int main(int argc, char* argv[])
{

 float t, sum = 0;

 // Mostrar parámetros
 std::cout << "Parametros recibidos: ";
 for (int i = 1; i < argc; i++)
   std::cout << argv[i] << " ";
 std:: cout << std::endl;

 // Calcular promedio
 for (int i = 1; i < argc; i++) {
   std::istringstream(argv[i]) >> t;
   sum += t;
 }
 if ((argc-1) > 0)
   std::cout << "Promedio: " << sum / (argc-1) << std::endl;
 return 0;
}


Saludos :)

Edito: Perdón, no había visto la respuesta de Alien-Z mintras escribía.


#26
Hola diegofah.

Copié tu código y parece dar el resultado correcto.

Pero, según entiendo, si el tipo que estás utilizando para almacenar el resultado del factorial es de 64 bits el máximo valor almacenable es :

2^64  = 18446744073709551616
20!   =  2432902008176640000 (correcto)
21!   = 51090942171709440000 (desborde)



Si fuese de 128 bits:

2^128 = 340282366920938463463374600000000000000
34!   = 295232799039604006218354100000000000000   (correcto)
35!   = 10333147966386100700879664000000000000000 (desborde)


De todos modos, si la especificación del código es que sólo calcule los factoriales de los números impares comprendidos entre 1 y 27, creo que el código se puede simplificar bastante. Por ejemplo:


#include<stdio.h>
#include<math.h>

double fact(char);

main()
{
int n;

do {
  printf("Inserte un numero entero impar entre 1 y 27:");
  fscanf(stdin, "%d", &n);
  while(getchar()!='\n');
} while (n<1 || n>28 || n % 2 == 0);

printf("El factorial de %d es %0.0f\n",n, fact(n));

return 0;
}

double fact(char num)
{
double fact = 1;
while (num > 0)
  fact *= num--;
return fact;
}


Saludos :)
#27
Hola erest0r.

Citar...lo mas que he encontrado es de la cabecera <iomanip>, setfill(); setw(); pero setfill() recibe como parametro un char, y queria saber si existia algo parecido como setprecision(); fixed;  pero para el lado izquierdo de los enteros.

Es que numéricamente no tiene ningún sentido usar ceros a la izquierda. Es decir, si es a efectos de presentación, tratá el valor como una secuencia de caracteres.

Saludos. :)


#28
Hola goto C.

Proba de este modo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  FILE *fp;
  char *texto, nombre[255];
  int i, nc = 0;

  printf("Nombre de archivo: ");
  fgets(nombre, 20, stdin);
  nombre[strlen(nombre)-1] = '\0';

  if ((fp = fopen(nombre,"rt")) == NULL) {
    perror("Error: ");
    return 1;
  }

  if ((texto = (char *) malloc(sizeof(char))) == NULL) {
    printf("Memoria insuficiente.");
    return 1;
  }

  while (!feof(fp)) {
    texto[nc++] = fgetc(fp);
    if ((texto = (char*)realloc(texto, (nc+1)*sizeof(char))) == NULL) {
      printf("Memoria insuficiente.");
      return 1;
    }
  }

  for(i = 0; i < nc; i++)
    printf("Texto[%d] es %c\n", i, texto[i]);

  fclose(fp);

  return 0;
}


Saludos :)
#29
Hola Stakewinner00 .

Y tenes toda la razón. ( no sé qué idea se me cruzó que estaba hacíendolo en C ).

En C++ también podría hacer:
Código (cpp) [Seleccionar]

#include <fstream>

int main()
{
  std::fstream output("archivo.txt", std::fstream::out);
  //...
  output.close();
}

Saludos :)
#30
Hola.

El archivo lo podes crear con la función open, un ejemplo:


...
#include <fcntl.h>

...
{
 int handle;
 
 if ((handle=open("C:\\CARPETA\\PRUEBA.TXT", O_CREAT | O_TEXT)) != -1)
  close(handle);
 else
  perror("Error:");
 ...
}


Si usas Linux tendras que cambiar los delimitadores de ruta.

Saludos :)