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

#41
Hola.

Agrega la siguiente línea a tu código:

    ...
    printf("Nombre ingresado: ");
    for (t=0;t<tam_string;t++)
    {
    printf("%c",arre[t]);
    }

    printf("\n");

    while(getchar() != '\n'); // <------ aqui
    ...


Saludos :)
#42
Hola.

Si usas C y tenés que aplicar el método de la burbuja si o si, podes ahorrar un ciclo en el ordenamiento y la variable auxilar de este modo:

int main()
{
 int v[MAX];
 int i, n;

 printf("Dame el numero de elementos del vector: ");
 scanf("%d",&n);
 for(i=0;i < n;i++) {
   printf("\nDame el elemento numero %d:",i+1);
   scanf("%d",&v[i]);
 }

 for (i=0; i < n; i++) {
   if (i < 1) continue;
   if (v[i] < v[i-1]) {
     v[i]   ^= v[i-1];
     v[i-1] ^= v[i];
     v[i]   ^= v[i-1];
     i = 0;
   }
 }
 ...
}

Pero, al menos yo, no veo manera de mezclar el ingreso de datos con el ordenamiento.

Saludos. :)
#43
Hola MeCraniDOS.

A ver si en líneas generales entendí lo que buscas...

Código (cpp) [Seleccionar]

#include<iostream>
#include<fstream>
#include <vector>
#include <string>
#include <windows.h>

using namespace std;

typedef vector <string> vFileNames;

bool GetFileNames(string Ruta, string Ext, vFileNames &v);
void ShowFileNames(vFileNames v);
string Listar_Archivos();
void Leer_Archivo(string aFileName);

int main()
{
  char Letra = 'S';
  string Nombre_Archivo; //Variable para el archivo a leer

  while (Letra == 'S') {
    Nombre_Archivo = Listar_Archivos();
    if (Nombre_Archivo.empty()) {
      cout<<" No se encontraron archivos!";
      cin.get(); // Pausa
      return -1; // Finaliza el programa con error
    }
    Leer_Archivo(Nombre_Archivo);
    cout <<"Desea intentar repetir la operacion? (S/N)";
    cin >> Letra;
  }
}

bool GetFileNames(string Ruta, string Ext, vFileNames &v)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(((string)Ruta+Ext).c_str(), &FindFileData);

if (hFind == INVALID_HANDLE_VALUE)
   return false;
do
   v.push_back(Ruta+FindFileData.cFileName);
while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
return true;
}

void ShowFileNames(vFileNames v)
{
for(unsigned i = 0; i < v.size(); i++)
   cout << i << ".- " << v[i] << endl;
}

string Listar_Archivos()
{
  vFileNames FileNames;
  string rta= "C:\\", ext="*.txt";
  int opt;

  if (GetFileNames(rta, ext, FileNames)) {
    ShowFileNames(FileNames);
    cout << "\n Selecciona un archivo (0-" << FileNames.size()-1 << ") ";
    cin >> opt;
    cout << endl << " Procesando " << FileNames[opt] << endl;
    return FileNames[opt];
  } else
    return "";
}

void Leer_Archivo(string aFileName)
{
  string line;
  ifstream arch(aFileName.c_str(), ifstream::in);
  if (arch.is_open())  {
    while (arch.good()) {
      getline (arch,line);
      cout << line << endl;
    }
    arch.close();
  }
}


Saludos :)
#44
Programación C/C++ / Re: Problema con Char
24 Junio 2013, 11:35 AM
Hola.

typeid(x).name() devuelve un apuntador a c-string ( type_info::name ), es decir que por ejemplo podrías hacer:

Código (c++) [Seleccionar]

...
class M { };

...
{
 string typ1 = typeid(M).name();
 // o tambien:
 char *typ2 = (char*)typeid(M).name();


Saludos. :)
#45
Hola crawler!.

Si estas compilando el ejemplo bajo C++, tendrías que agregar:
Código (c++) [Seleccionar]

 ...
 load((int*)mat, 3, 3);

Reemplazar por los header files correspondientes y los printf por cout (si no se me escapa algo mas...).

Saludos. :)
#46
Hola Kajjin112.

Podes utilizar la función: IsWow64Process

Saludos :)
#47
Citaresto es unidimensional.

Hola ThePinkPanther.

La forma de acceso dentro de la función es lineal, pero el argumento enviado es un arreglo bidimensional y a eso me refiero en el mensaje anterior: 
CitarOtra forma de pasar el arreglo bidimensional por referencia ...


Como ejemplo, este código incrementa en uno cada elemento de un arreglo declarado como bidimensional y de ese modo es enviado a la función como argumento:

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

void load(int *mat, int, int);
void show(int mat[][3], int);

int main(int argc, char* argv[])
{
  int mat[3][3] = {{0,1,2}, {3,4,5}, {6,7,8}};
  load(mat, 3, 3);
  show(mat, 3);
  getchar();
  return 0;
}

void load(int *mat, int cols, int rows)
{
int c, r;
for(r = 0; r < rows; r++)
   for(c = 0; c < cols; c++)
     mat[r * cols + c] += 1;
}

void show(int mat[][3], int rows)
{
  int c, r;
  for(r = 0; r < rows; r++){
    for(c = 0; c < 3; c++)
      printf("%d ",mat[r][c]);
    printf("\n");
  }
}


Es decir, el modo de acceso que se utilice dentro de la función no altera el caracter bidimensional de la declaración del arreglo.

Saludos. :)
#48
Hola  crawler!.

Citar¿Existe alguna diferencia entre usar este código y usar el que me has dicho?

Ambas formas son equivalentes:

// mat como arreglo de arreglos de 3 enteros
void cargar1(int mat[][3], int rows)
{
  int c , r;
  for(r = 0; r < rows; r++)
    for(c = 0;c < 3; c++)
      mat[r][c] = c + r;

}

// mat como puntero a un arreglo de tres enteros
void cargar2(int (*mat)[3], int rows)
{
  int c, r;
  for(r = 0; r < rows; r++)
    for(c = 0;c < 3 ;c++)
      mat[r][c] = c + r;
}


Otra forma de pasar el arreglo bidimensional por referencia (accediendo como C/C++ lo almacenan en memoria) es:


// mat como puntero al primer elemento del arreglo
void cargar3(int *mat, int cols, int rows)
{
int c, r;
  for(r = 0; r < rows; r++)
    for(c = 0; c < cols; c++)
      mat[r * cols + c] = r + c;
}


Saludos :)
#49
Hola MeCraniDOS.

Citar
Quiero modificarlo de manera que en vez de escribir el nombre del archivo para abrirlo, solo ponga el numero que lleva delante, es decir, que ponga 1, y se abra el primer archivo..  :silbar:

Creo que se hace con <vector> pero no se como usarlo, espero que puedan ayudarme  ;-)

Tal vez este código muy básico te pueda servir de guía:
Código (cpp) [Seleccionar]

#include<iostream>
#include <vector>
#include <string>
#include <windows.h>

using namespace std;

typedef vector <string> vFileNames;

bool GetFileNames(string , string , vFileNames*);
void ShowFileNames(vFileNames);

int main()
{
 vFileNames FileNames;
 string rta, ext;
 int opt;

 cout << "Unidad + ruta (Ej: C:\\\\CARPETA\\\\): ";
 cin >> rta;
 cout << endl << "Extension del archivo (Ej: *.TXT): ";
 cin >> ext;
 if (GetFileNames(rta, ext, &FileNames))
   do {
     ShowFileNames(FileNames);
     cout << "Seleccione un numero 0-" << FileNames.size()-1 <<" (-1 termina)";
     cin >> opt;
     if (opt > -1)
     cout << endl << "Su eleccion: " << FileNames[opt] << endl << endl;
   } while (opt != -1);
 else
   cout << "No se encontraron archivos";
 return 0;
}

bool GetFileNames(string Ruta, string Ext, vFileNames *v)
{
 WIN32_FIND_DATA FindFileData;
 HANDLE hFind = FindFirstFile(((string)Ruta+Ext).c_str(), &FindFileData);

 if (hFind == INVALID_HANDLE_VALUE)
   return false;
 do
   (*v).push_back(FindFileData.cFileName);
 while (FindNextFile(hFind, &FindFileData));
 FindClose(hFind);
 return true;
}

void ShowFileNames(vFileNames v) {
 for(unsigned i = 0; i < v.size(); i++)
   cout << i << ".- " << v[i] << endl;
}



Saludos :)
#50
Hola.

Por el código del mensaje #13, la aplicación correrá en windows, entonces otra opción es:

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std;

// ruta + nombre de archivo, por ejemplo:
#define FULLNAME "C:\\PersonalizacionMasterShell.bat"

int main()
{
  ifstream ifs;

  ifs.open(((string)FULLNAME).c_str());
  if (ifs.is_open())
   ShellExecute(NULL, "open", "CMD", ((string)"/C "+FULLNAME).c_str(), "", SW_NORMAL);
  else
   cout << "El archivo no existe";
}

Si deseas que ejecute el archivo por lotes y quede residente en el prompt, reemplazá "/C " por "/K ".

Saludos.