Dev - C++ - Hacer que los valores sean dados por el usuario

   
Vista:
Imágen de perfil de Antonio

Hacer que los valores sean dados por el usuario

Publicado por Antonio (19 intervenciones) el 26/11/2015 06:47:13
Hola, tengo este código para generar permutaciones pero funciona dando valores por defecto, por ejemplo: a,b,c,d ó 1,5,1,4.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#define N 4
using namespace std;
 
char ch[] = "abcd";
 
int func(int n) {
    int i,j;
    char temp;
    if(n==0) {
        for(j=N-1;j>=0;j--)
            cout<<ch[j];
        cout<<endl;
        return 0;
    }
    for(i=0;i<n;i++){
        temp = ch[i];
        for(j=i+1;j<n;j++)
            ch[j-1] = ch[j];
        ch[n-1] = temp;
        //shift
        func(n-1);
        for(j=n-1;j>i;j--)
            ch[j] = ch[j-1];
        ch[i] = temp;
        //and shift back agian
    }
    return 1;
}
 
int main(void)
{
    func(N);
    return 0;
}

Pero quisiera saber cómo puedo hacer que no sea un valor definido, osea, que los caracteres sean ingresados por el usuario, de rango n, cómo puedo hacer eso?, gracias de antemano!.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Hacer que los valores sean dados por el usuario

Publicado por agustin (310 intervenciones) el 26/11/2015 08:44:59
Ufff eso es requetebasico. Puedes usar scanf, gets, fgets e incluso fscanf y todo depende de si quieres limitar el número de caracteres a capturar y de si quieres capturar espacios.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio

Hacer que los valores sean dados por el usuario

Publicado por Antonio (19 intervenciones) el 26/11/2015 19:31:33
El problema es que el código no lo hice yo, me lo han pasado pero necesito modificarlo, intenté usando gets como lo mencionas pero me surgen problemas en el contador, la parte:
1
2
3
4
for(i=0;i<n;i++){
        temp = ch[i];
        for(j=i+1;j<n;j++)
            ch[j-1] = ch[j];

el "char ch [ ]" ya está definido en todo el código y no entiendo como modificarlo para que no se afecte esa parte, osea, como usar el gets sin que se vea afectado el resto..no se si me di a entender?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer que los valores sean dados por el usuario

Publicado por agustin (310 intervenciones) el 26/11/2015 23:44:34
La solución no es que te lo den mascado, estas con algo muy básico y si no te enteras de esto mal vas. Lo que quieres bien podría ser asi:
1
2
3
4
#define SIZE 100
char ch[SIZE];
printf ("Introduce la cadena: ");
fgets (ch,SIZE, stdin);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio

Hacer que los valores sean dados por el usuario

Publicado por Antonio (19 intervenciones) el 27/11/2015 02:51:50
Lo que pasa es que lo estás haciendo en c y no en c++

Pero me queda así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#define N 4
#define SIZE 100
using namespace std;
 
char ch[SIZE];
 
int func(int n) {
    int i,j;
    printf ("Introduce la cadena: ");
    fgets (ch,SIZE, stdin);
    char temp;
    if(n==0) {
        for(j=N-1;j>=0;j--)
            cout<<ch[SIZE];
        cout<<endl;
        return 0;
    }
    for(i=0;i<n;i++){
        temp = ch[i];
        for(j=i+1;j<n;j++)
            ch[j-1] = ch[j];
        ch[n-1] = temp;
 
        func(n-1);
        for(j=n-1;j>i;j--)
            ch[j] = ch[j-1];
        ch[i] = temp;
 
    }
    return 1;
}
 
int main(void)
{
    func(N);
    return 0;
}

Pero no me imprime nada, bueno, si me imprime en ocasiones pero no como debería de ser
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer que los valores sean dados por el usuario

Publicado por agustin (310 intervenciones) el 27/11/2015 14:30:00
Claro, lo raro es que no te de algún error o warnings ya que tanto printf como fgets están en librerías las cuales no incluyes. En lugar de printf usa cout y en lugar de fgets usa cin.getline ya que esas pertenecen a iostream y son las que se usan en c++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio

Hacer que los valores sean dados por el usuario

Publicado por Antonio (19 intervenciones) el 27/11/2015 19:28:10
A pesar de haber hecho los cambios el programa no entra a los ciclos, no me marca error pero el if y el for no se ejecutan, así está actualmente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#define N 4
#define SIZE 100
using namespace std;
 
char ch[SIZE];
 
int func(int a) {
    int i,j, n=4;
    cout << "Introduce la cadena: " << endl;
    cin.getline (ch,SIZE);
    char temp;
    if(n==0) {
        for(j=N-1;j>=0;j--)
            cout<<ch[j];
        cout<<endl;
        return 0;
    }
    for(i=0;i<n;i++){
        temp = ch[i];
        for(j=i+1;j<n;j++)
            ch[j-1] = ch[j];
        ch[n-1] = temp;
 
        func(n-1);
        for(j=n-1;j>i;j--)
            ch[j] = ch[j-1];
        ch[i] = temp;
 
    }
    return 1;
}
 
int main(void)
{
    func(N);
    return 0;
}

Hice varias modificaciones para ver si funcionaba...pero nada :s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer que los valores sean dados por el usuario

Publicado por Thanatos (72 intervenciones) el 28/11/2015 10:26:03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <string>
#include <vector>
 
int permutar(std::vector<char>&, unsigned);
 
int main(void) {
    std::string cadena("");
 
    std::cout << "Ingrese la cadena\ncadena = ";
    std::cin >> cadena;
    std::cout << "\nPermutaciones:" << std::endl;
 
    std::vector<char> caracteres(cadena.begin(), cadena.end());
    (void)permutar(caracteres, caracteres.size());
 
    return 0;
}
 
 
int permutar(std::vector<char>& ch, unsigned n) {
    char temp;
 
    if (n == 0) {
        for (unsigned j = ch.size() - 1; (int)j >= 0; j--) {
            std::cout << ch[j];
        }
        std::cout << std::endl;
        return 0;
    }
 
    for (unsigned i = 0; i < n; i++) {
        temp = ch[i];
        for(unsigned j = i + 1; j < n; j++) {
            ch[j - 1] = ch[j];
        }
        ch[n - 1] = temp;
        // shift
        (void)permutar(ch, n - 1);
        for (unsigned j = n - 1; j > i; j--) {
            ch[j] = ch[j - 1];
        }
        ch[i] = temp;
        // and shift back again
    }
 
    return 1;
}

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio

Hacer que los valores sean dados por el usuario

Publicado por Antonio (19 intervenciones) el 28/11/2015 20:21:31
No, así no tiene chiste, iba muy bien, creo que ya casi quedaba solucionado pero haz metido ese String y Vector que es desconocido, no se que haz hecho, pero gracias, seguiré esperando solución con el código que tenía arriba, muchas gracias por el tiempo! :3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer que los valores sean dados por el usuario

Publicado por Thanatos (72 intervenciones) el 29/11/2015 13:43:41
Por lo que escribiste en tu tercer post, creí entender que necesitabas el código en C++.

No creo que se pueda decir que std::string sea desconocido en C++, al menos desde hace algunos años, precisamente es una de las mejoras que tiene el lenguaje en comparación con el lenguaje C.

En cuanto a std::vector... Incluso el Sr. Bjarne Stroustrup (creador del lenguaje C++), en su libro: "Programming: Principles and Practice Using C++" (publicado el año 2014), dice: "Use std::vector where you have a choice — and you have a choice in most context." (capítulo 18 - Arrays)."

Estoy seguro que el código que publiqué se puede corregir y mejorar, pero en todo caso, std::string y std::vector, son actualmente de uso común en el lenguaje C++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer que los valores sean dados por el usuario

Publicado por agustin (310 intervenciones) el 29/11/2015 18:12:12
Supongo que le pidieron usar char* y por eso lo dice jejeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar