Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
Hay dos maneras fundamentalmente distintas en que podemos pasar los parámetros de una función:
#include <stdio.h>
int sumaV(int v) {
printf("Antes de sumar: %d\n", v);
v+=10;
printf("Después de sumar: %d\n", v);
return v;
}
void sumaR(int *v) {
printf("Dirección: %p \n", v);
printf("Antes de sumar: %d\n", *v);
(*v)+=10;
printf("Después de sumar: %d\n", *v);
}
int main()
{
int suma=0;
int valor=2;
suma=sumaV(valor);
printf("Suma: %d\n", suma);
printf("Valor: %d\n", valor);
printf("**************************************\n");
sumaR(&valor);
printf("Valor: %d\n", valor);
return 0;
}
Noten que las dos funciones hacen, aparentemente, lo mismo
#include <stdio.h>
int sumaV(int v) {
printf("Antes de sumar: %d\n", v);
v+=10;
printf("Después de sumar: %d\n", v);
return v;
}
void sumaR(int *v) {
printf("Dirección: %p \n", v);
printf("Antes de sumar: %d\n", *v);
(*v)+=10;
printf("Después de sumar: %d\n", *v);
}
int main()
{
int suma=0;
int valor=2;
suma=sumaV(valor);
printf("Suma: %d\n", suma);
printf("Valor: %d\n", valor);
printf("**************************************\n");
sumaR(&valor);
printf("Valor: %d\n", valor);
return 0;
}
Noten que las dos funciones hacen, aparentemente, lo mismo
Esta función recibe su parámetro por valor
Eso significa que recibe una copia del valor guardado en la dirección de memoria etiquetada como valor, lo usa para hacer una suma y regresa el resultado de esta última
El contenido de la variable valor no se modifica en ningún momento
#include <stdio.h>
int sumaV(int v) {
printf("Antes de sumar: %d\n", v);
v+=10;
printf("Después de sumar: %d\n", v);
return v;
}
void sumaR(int *v) {
printf("Dirección: %p \n", v);
printf("Antes de sumar: %d\n", *v);
(*v)+=10;
printf("Después de sumar: %d\n", *v);
}
int main()
{
int suma=0;
int valor=2;
suma=sumaV(valor);
printf("Suma: %d\n", suma);
printf("Valor: %d\n", valor);
printf("**************************************\n");
sumaR(&valor);
printf("Valor: %d\n", valor);
return 0;
}
Noten que las dos funciones hacen, aparentemente, lo mismo
Esta función recibe su parámetro por referencia
Eso significa que recibe la dirección de memoria etiquetada por valor, lee su contenido, lo usa para hacer una suma y guarda el resultado en la misma dirección
El contenido de la variable valor sí se modifica
#include <stdio.h>
int sumaV(int v) {
printf("Antes de sumar: %d\n", v);
v+=10;
printf("Después de sumar: %d\n", v);
return v;
}
void sumaR(int *v) {
printf("Dirección: %p \n", v);
printf("Antes de sumar: %d\n", *v);
(*v)+=10;
printf("Después de sumar: %d\n", *v);
}
int main()
{
int suma=0;
int valor=2;
suma=sumaV(valor);
printf("Suma: %d\n", suma);
printf("Valor: %d\n", valor);
printf("**************************************\n");
sumaR(&valor);
printf("Valor: %d\n", valor);
return 0;
}
¿Por qué creen que cuando leen un valor desde la consola utilizan algo como 'scanf("%d", &n);'?
#include <stdio.h>
int sumaV(int v) {
printf("Antes de sumar: %d\n", v);
v+=10;
printf("Después de sumar: %d\n", v);
return v;
}
void sumaR(int *v) {
printf("Dirección: %p \n", v);
printf("Antes de sumar: %d\n", *v);
(*v)+=10;
printf("Después de sumar: %d\n", *v);
}
int main()
{
int suma=0;
int valor=2;
suma=sumaV(valor);
printf("Suma: %d\n", suma);
printf("Valor: %d\n", valor);
printf("**************************************\n");
sumaR(&valor);
printf("Valor: %d\n", valor);
return 0;
}
En el lenguaje de programación C los arreglos siempre se pasan por referencia, mientras que los tipos de datos primitivos se pasan, por defecto, por valor
#include <stdio.h>
#include "matriz.h"
int main()
{
int n=0;
int suma=0;
int matriz[MAXIMO][MAXIMO]= {};
int retorno=0;
printf("Ingrese un número entre 3 y %d: ", MAXIMO);
scanf("%d", &n);
retorno=revisaRango(n,3,MAXIMO);
if (retorno!=0)
{
return retorno;
}
suma = obtenSuma(n);
printf("La suma de cada fila, columna y diagonal debe ser %d para que la matriz sea un cuadrado mágico\n", suma);
retorno = ingresaMatriz(matriz, n);
if (retorno!=0)
{
return retorno;
}
imprimeMatriz(matriz, n);
retorno = comparaFilas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaColumnas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaDiagonales(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
printf("La matriz es un cuadrado mágico");
return retorno;
}
#include <stdio.h>
#include <math.h>
#define MAXIMO 10
int revisaRango(int n, int min, int max) {
int retorno = 0;
if (n < 3) {
printf("El número ingresado es menor a 3");
retorno = 1;
}
if (n > MAXIMO) {
printf("El número ingresado es mayor que %d", MAXIMO);
retorno = 2;
}
return retorno;
}
int obtenSuma(int n) {
double cuadrado = pow(n, 2);
return cuadrado * (cuadrado + 1) / (2 * n);
}
int revisaValorCorrecto(int numero, int n) {
int retorno = 0;
double cuadrado = pow(n, 2);
if ((numero < 1) || (numero > cuadrado)) {
printf("Los números de un cuadrado mágico deben ser entre el 1 y el %.0lf, por lo que la matriz no es un cuadrado mágico", cuadrado);
retorno = 3;
}
return retorno;
}
int ingresaMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i=0;
int j=0;
int numero=0;
int retorno=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("Ingrese el número correspondiente a la fila %d y columna %d: ", i, j);
scanf("%d", &numero);
retorno=revisaValorCorrecto(numero, n);
if (retorno==0)
{
matriz[i][j] = numero;
}
else
{
return retorno;
}
}
}
return retorno;
}
int imprimeMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i = 0;
int j = 0;
printf("La matriz es:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", matriz[i][j]);
}
printf("\n");
}
return 0;
}
int comparaFilas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (i = 0; i < n; i++) {
comparacion = 0;
for (j = 0; j < n; j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la fila %d es %d, por lo que la matriz no es un cuadrado mágico\n", i, comparacion);
retorno = 4;
return retorno;
}
}
return retorno;
}
int comparaColumnas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (j = 0; j < n; j++) {
comparacion = 0;
for (i = 0; i < n; i++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la columna %d es %d, por lo que la matriz no es un cuadrado mágico\n", j, comparacion);
retorno = 5;
return retorno;
}
}
return retorno;
}
int comparaDiagonales(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
comparacion = 0;
for (i = 0, j = 0; i < n; i++, j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la primera diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 6;
return retorno;
}
comparacion = 0;
for (i = 0, j = (n - 1); i < n; i++, j--) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la segunda diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 7;
return retorno;
}
return retorno;
}
main.c
matriz.h
#include <stdio.h>
#include "matriz.h"
int main()
{
int n=0;
int suma=0;
int matriz[MAXIMO][MAXIMO]= {};
int retorno=0;
printf("Ingrese un número entre 3 y %d: ", MAXIMO);
scanf("%d", &n);
retorno=revisaRango(n,3,MAXIMO);
if (retorno!=0)
{
return retorno;
}
suma = obtenSuma(n);
printf("La suma de cada fila, columna y diagonal debe ser %d para que la matriz sea un cuadrado mágico\n", suma);
retorno = ingresaMatriz(matriz, n);
if (retorno!=0)
{
return retorno;
}
imprimeMatriz(matriz, n);
retorno = comparaFilas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaColumnas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaDiagonales(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
printf("La matriz es un cuadrado mágico");
return retorno;
}
#include <stdio.h>
#include <math.h>
#define MAXIMO 10
int revisaRango(int n, int min, int max) {
int retorno = 0;
if (n < 3) {
printf("El número ingresado es menor a 3");
retorno = 1;
}
if (n > MAXIMO) {
printf("El número ingresado es mayor que %d", MAXIMO);
retorno = 2;
}
return retorno;
}
int obtenSuma(int n) {
double cuadrado = pow(n, 2);
return cuadrado * (cuadrado + 1) / (2 * n);
}
int revisaValorCorrecto(int numero, int n) {
int retorno = 0;
double cuadrado = pow(n, 2);
if ((numero < 1) || (numero > cuadrado)) {
printf("Los números de un cuadrado mágico deben ser entre el 1 y el %.0lf, por lo que la matriz no es un cuadrado mágico", cuadrado);
retorno = 3;
}
return retorno;
}
int ingresaMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i=0;
int j=0;
int numero=0;
int retorno=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("Ingrese el número correspondiente a la fila %d y columna %d: ", i, j);
scanf("%d", &numero);
retorno=revisaValorCorrecto(numero, n);
if (retorno==0)
{
matriz[i][j] = numero;
}
else
{
return retorno;
}
}
}
return retorno;
}
int imprimeMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i = 0;
int j = 0;
printf("La matriz es:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", matriz[i][j]);
}
printf("\n");
}
return 0;
}
int comparaFilas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (i = 0; i < n; i++) {
comparacion = 0;
for (j = 0; j < n; j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la fila %d es %d, por lo que la matriz no es un cuadrado mágico\n", i, comparacion);
retorno = 4;
return retorno;
}
}
return retorno;
}
int comparaColumnas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (j = 0; j < n; j++) {
comparacion = 0;
for (i = 0; i < n; i++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la columna %d es %d, por lo que la matriz no es un cuadrado mágico\n", j, comparacion);
retorno = 5;
return retorno;
}
}
return retorno;
}
int comparaDiagonales(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
comparacion = 0;
for (i = 0, j = 0; i < n; i++, j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la primera diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 6;
return retorno;
}
comparacion = 0;
for (i = 0, j = (n - 1); i < n; i++, j--) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la segunda diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 7;
return retorno;
}
return retorno;
}
main.c
matriz.h
#include <stdio.h>
#include "matriz.h"
int main()
{
int n=0;
int suma=0;
int matriz[MAXIMO][MAXIMO]= {};
int retorno=0;
printf("Ingrese un número entre 3 y %d: ", MAXIMO);
scanf("%d", &n);
retorno=revisaRango(n,3,MAXIMO);
if (retorno!=0)
{
return retorno;
}
suma = obtenSuma(n);
printf("La suma de cada fila, columna y diagonal debe ser %d para que la matriz sea un cuadrado mágico\n", suma);
retorno = ingresaMatriz(matriz, n);
if (retorno!=0)
{
return retorno;
}
imprimeMatriz(matriz, n);
retorno = comparaFilas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaColumnas(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
retorno = comparaDiagonales(matriz, n, suma);
if (retorno!=0)
{
return retorno;
}
printf("La matriz es un cuadrado mágico");
return retorno;
}
#include <stdio.h>
#include <math.h>
#define MAXIMO 10
int revisaRango(int n, int min, int max) {
int retorno = 0;
if (n < 3) {
printf("El número ingresado es menor a 3");
retorno = 1;
}
if (n > MAXIMO) {
printf("El número ingresado es mayor que %d", MAXIMO);
retorno = 2;
}
return retorno;
}
int obtenSuma(int n) {
double cuadrado = pow(n, 2);
return cuadrado * (cuadrado + 1) / (2 * n);
}
int revisaValorCorrecto(int numero, int n) {
int retorno = 0;
double cuadrado = pow(n, 2);
if ((numero < 1) || (numero > cuadrado)) {
printf("Los números de un cuadrado mágico deben ser entre el 1 y el %.0lf, por lo que la matriz no es un cuadrado mágico", cuadrado);
retorno = 3;
}
return retorno;
}
int ingresaMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i=0;
int j=0;
int numero=0;
int retorno=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("Ingrese el número correspondiente a la fila %d y columna %d: ", i, j);
scanf("%d", &numero);
retorno=revisaValorCorrecto(numero, n);
if (retorno==0)
{
matriz[i][j] = numero;
}
else
{
return retorno;
}
}
}
return retorno;
}
int imprimeMatriz(int matriz[MAXIMO][MAXIMO], int n) {
int i = 0;
int j = 0;
printf("La matriz es:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", matriz[i][j]);
}
printf("\n");
}
return 0;
}
int comparaFilas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (i = 0; i < n; i++) {
comparacion = 0;
for (j = 0; j < n; j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la fila %d es %d, por lo que la matriz no es un cuadrado mágico\n", i, comparacion);
retorno = 4;
return retorno;
}
}
return retorno;
}
int comparaColumnas(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
for (j = 0; j < n; j++) {
comparacion = 0;
for (i = 0; i < n; i++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la columna %d es %d, por lo que la matriz no es un cuadrado mágico\n", j, comparacion);
retorno = 5;
return retorno;
}
}
return retorno;
}
int comparaDiagonales(int matriz[MAXIMO][MAXIMO], int n, int suma) {
int i = 0;
int j = 0;
int comparacion = 0;
int retorno = 0;
comparacion = 0;
for (i = 0, j = 0; i < n; i++, j++) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la primera diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 6;
return retorno;
}
comparacion = 0;
for (i = 0, j = (n - 1); i < n; i++, j--) {
comparacion += matriz[i][j];
}
if (comparacion != suma) {
printf("La suma de la segunda diagonal es %d, por lo que la matriz no es un cuadrado mágico\n", comparacion);
retorno = 7;
return retorno;
}
return retorno;
}
main.c
matriz.h
By Gilberto 🦁
Paso de parámetros
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales