funciòn en C

Iniciado por fernaEDLP, 4 Julio 2018, 00:09 AM

0 Miembros y 1 Visitante están viendo este tema.

fernaEDLP

Buenas, ando necesitando ayuda para entender una función en c que imprimir un triangulo rectángulo de asteriscos de la siguiente manera:
      *
    **
  ***
****
el codigo ya esta resuelto pero no lo entiendo,es el siguiente:

void ImprimirCaracter(char caracter);
void ImprimirCaracteres(char caracteres,int veces);
void ImprimirFila(char caracter, int vecesespacio,int vecescaracter);

int main()
{
int f,esp;
char c;
printf("Ingrese el numero de filas:");
scanf("%d",&f);
fflush(stdin);
printf("Ingrese el caracter: ");
scanf("%c",&c);
fflush(stdin);
esp=f-1;
ImprimirFila(c,esp,f);
}
void ImprimirCaracter(char caracter)
{
printf("%c",caracter);
}

void ImprimirCaracteres(char caracteres,int veces)
{
int i;
for(i=0;i<veces;i++)
{
    ImprimirCaracter(caracteres);
}
}

void ImprimirFila(char caracteress, int vecesespacio,int vecescaracter)
{
    int h=1,j;

    for(j=0;j<vecescaracter;j++)
    {
        ImprimirCaracteres(' ',vecesespacio);
        ImprimirCaracteres(caracteress,h);
        h++;
        vecesespacio--;
        printf("\n");
    }
}
Para empezar la variable veces, no la ingresa en ningún momento..., eso significa que la esta pasando como parámetro?,  tampoco entiendo porque usa la variable esp... esp=f-1, si ingreso por teclado 4 esp=4-1=3 eso significa 3 espacios en blanco?,lo mismo ocurre con veces caracter y vecesespacio... las usa pero no las ingresa en ningún momento

Serapis

#1
Las variables, como sabes (o debieras saber) contienen valores...

Por lo general son declaradas en alguna parte (hay lenguajes que no exigen una declaración explícita (se deduce implícitamente de su uso)).

Sin embargo parece que tú esperas o crees que solo pueden estar declaradas en el cuerpo del código... pero también pueden estar declaradas como constantes, como retorno de funciones  (en ese caso, la función actuaría como una variable), como parámetros en funciones, etc... ése último caso descrito, es el tuyo.

Si se tienes un código como este:

entero edad
edad = DameMiEdad(fechaNacimiento, AñoActual)
mostrar edad


Y tu pasas estos datos:
edad= DameMiEdad(2000, 2018)
Te dirá que tu edad es 18 años...

Tu e parte alguna haces una asignación:
fechanacimiento= 2000
AñoActual = 2018

Esos son los nombres de los parámetros de la función... tu puedes pasar una contante (valor inmediato, como en el jeemplo), u otra variable o expresión numérica, siempre que sea del mismo tipo o sea convertida a dicho tipo (para que no genere error)...

es decir perfectamente podrías haber hecho:

así...
propiedad get DosMileniosDC
   Devolver 2000
fin propiedad
edad = DameMiEdad(DosMileniosDC, 2018)


ó...
entero malditoaño = 20 * 100
edad = DameMiEdad(malditoaño, 2018)


ó...
entero e = 8
entero c = 22
edad = DameMiEdad(((50 +10) * e) - (c * 40) ,  2018)


en el primer caso, al parámetro se la pasa el valor que devuelve una propiedad, en el segundo caso, el valor de otra variable, en el 3º caso, el valor de una expresión... y en ningún caso se ha hecho:
fechanacimiento= .....

Por que la idea de una función (del diseño léxico de una función), es precisamente decorrar la asignación de variables de una forma que nos parezca un único bloque, coherente, donde se exige el pasó de cada parámetro.... por supuesto el compilador,  tendrá que señalar una posición de memoria y pasar un valor a dicha posición o a un registro de la CPU, es decir a nivel atómico, es lo mismo que asignar el valor a una variable mediante el símbolo '=' ... pero más eficaz en el diseño, más rápido e intuitivo...

Lo demás, que preguntas no tiene sentido... si tu mismo dices que funciona el código, y si lo has programado tú, se supone que cada línea está ahí, porque la entiendes y has puesto lo que entendías que cabe poner...
Cuando un programador da nombres a variables, debe darles nombres de tal modo  que entienda su cometido, que su solo nombre sea autoexplicativo... la única razón para no hacerlo así es que sea algo tan sencillo, que no requiera más complicaciones, pero aún así, sobretodo para los novatos y estudiantes es buena práctica que el nombre dado a una variable autoexplique lo que hace.

Entonces:
esp=f-1
' esto lo hace a medias... esp, podría ser 'espacios' como podría ser 'esparragos', ó 'espera' ó 'espabiado' ó 'español' ó 'espartaco', ó... si es 'espacio', por qu´leches nio poner 'espacios = ...' te cobran por cada carácter que escribes?????.
En los 80 había que conformarse con una letra y a lo sumo con una letra seguida de un número porque la memopria era muy , muy limitada, ahora resulta de risa la estupidez en ahorrar caracteres a las variables.

Igualmente 'f'... por qué rayos no poner 'filas', pero más aún dado el que esa filas son las filas que tendrá el ejercicio, mejor sería señalarlo como: FilasDeAsteriscos...
Y finalmente llegamos al autoentendimiento del código:
EspaciosPorLinea = (AsteriscosPorLinea - 1)

Es un problema matemático, antes que de programación que... ...si "unos quedan delimitados por otros", la cantidad de delimitadores siempre es 1 menos, salvo que lo delimite también por fuera en cuyo caso es 1 más...  Así "As" delimitadas por "Bs"...
ABA
ABABA
ABABABA
ABABABABABABABABABABA
...siempre habrá una 'B' menos que 'A'
entonces aún mejor que:
EspaciosPorLinea = (AsteriscosPorLinea - 1)"
que es específico al problema sería
NumDelimitadores = (NumDelimitados -1)
es genérico se aplica a cualquier caso o cosa, pero si te resulta más abstracto, y te deja perplejo o con dudas, sigue siendo válido el
EspaciosPorLinea = (AsteriscosPorLinea - 1)
pero:
esp = f-1
Resulta lastimosos de entender...

...falta ver si te lo aplicas en adelante...

fernaEDLP

Hola gracias por la respuesta, el codigo compila bien lo que pasa que no lo hice yo, lo hizo una amiga que hizo esta materia y me paso sus ejercicios resueltos, pero particularmente a mi me cuesta un montón programar...
saludos

e

¡Todo es aprender! ¡Y ponerse!   :D
fox459
e

fernaEDLP


e

e

fernaEDLP


e

 ;-)
Te recomiendo aprender C y Python si te interesa la programación.
fox459
e

fernaEDLP

hola fox, en verdad yo estudio ingenieria industrial en la Argentina (UNLP), y esta materia es de tercer año el tema es que no la puedo aprobar y me està trabando las correlativas  :-[

e

e