Ejercicios Resueltos de Programación en C: Matrices y Ficheros

Informática6,28 KB

FUNCIONES.CPP (Boletín 6)

#include <stdio.h>
#include "funciones.h"

// Ejercicio 5
void SumaFila(MatrizReal m, int numc, int numf, VectorReal res, int *numElem) {
    int i, j;
    float suma = 0;

    for(i = 0; i < numf; i++) {
        for(j = 0; j < numc; j++) {
            suma = suma + m[i][j];
        }
        res[i] = suma;
        suma = 0;
    }
    *numElem = numf;
}

// Ejercicio 6
void SumaColumna(MatrizReal m, int numc, int numf, VectorReal res, int *numElem) {
    int i, j;
    float suma = 0;

    for(i = 0; i < numc; i++) {
        for(j = 0; j < numf; j++) {
            suma = suma + m[j][i];
        }
        res[i] = suma;
        suma = 0;
    }
    *numElem = numf;
}

// Ejercicio 7
void ExtraeDiagonal(MatrizReal m, int numf, int numc, VectorReal v, int *numElem) {
    int i, j;
    for(i = 0; i < numf; i++) {
        for(j = 0; j < numc; j++) {
            if(i == j) {
                v[i] = m[i][j];
            }
        }
    }
    *numElem = numf; // ó numc
    /* Otra solución posible
    for(i = 0; i < numf; i++) {
        v[i] = m[i][i];
    */
}

// Ejercicio 8
void extraeFila(MatrizReal m, int numc, int indice, VectorReal res, int *numElem) {
    int c;
    for(c = 0; c < numc; c++) {
        res[c] = m[indice][c];
    }
    *numElem = numc;
}

// Ejercicio 9
void extraeColumna(MatrizReal m, int numf, int indice, VectorReal res, int *numElem) {
    int f;
    for(f = 0; f < numf; f++) {
        res[f] = m[indice][f];
    }
    *numElem = numf;
}

// Ejercicio 10
void extraeSubMatriz(MatrizReal m, int dim, int a, int b, MatrizReal res, int *numf, int *numc) {
    int f, c;
    if(a < 0 || a >= dim)
        printf("NÚMERO a NO VÁLIDO");
    if(b < 0 || b >= dim)
        printf("NÚMERO b NO VÁLIDO");
    for (f = a; f < dim; f++) {
        for (c = b; c < dim; c++) {
            // Implementación pendiente
        }
    }
}

FUNCIONES.H

#define N 20
#define M 20
typedef float VectorReal[N];
typedef float MatrizReal[N][M];

void SumaFila(MatrizReal, int, int, VectorReal, int*);
void SumaColumna(MatrizReal m, int numc, int numf, VectorReal res, int *numElem);

TEST.CPP

#include "funciones.h"
#include <iostream>
#include <stdio.h>
using namespace std;

void main(void) {
    MatrizReal m = {{1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}};
    VectorReal res;
    int numElem;
    int i;
    
    // Ejercicio 5
    SumaFila(m, 3, 3, res, &numElem);
    cout << "El vector resultado tiene: " << numElem << endl;
    cout << "
";
    for(i = 0; i < numElem; i++) {
        printf("%.2f ", res[i]);
    }

    // Ejercicio 6
    SumaColumna(m, 3, 3, res, &numElem);
    cout << "
El vector resultado tiene: " << numElem << endl;
    cout << "
";
    for(i = 0; i < numElem; i++) {
        printf("%.2f ", res[i]);
    }
}

TIPOS.H (Boletín 7)

#include <stdio.h>
#define MAXCAR 256

typedef FILE* Fichero;
typedef char Cadena[MAXCAR];
typedef char TablaCaracteres[MAXCAR];
typedef int TablaEnteros[MAXCAR];
typedef struct {
    Cadena nombre;
    Cadena apellidos;
    int edad;
} Persona;

int lecturaGenoma(Cadena);
int cargaTablaConLecturaGenoma(Cadena, TablaCaracteres);
void lecturaGenomas(Cadena, TablaEnteros, int*);

PROGRAMAPRINCIPAL.CPP

#include "tipos.h"

void main(void) {
    int numN, i, numElem;
    TablaCaracteres tc;
    TablaEnteros te;

    // EJERCICIO 5
    printf("
-- Ejercicio 5: 
");
    numN = lecturaGenoma("genoma.txt");
    printf("
El número de nucleótidos es %d", numN);

    // EJERCICIO 6
    printf("
-- Ejercicio 6: 
");
    numN = cargaTablaConLecturaGenoma("genoma.txt", tc);
    printf("
El número de nucleótidos es %d", numN);
    for(i = 0; i < numN; i++) {
        printf("%c", tc[i]);
    }

    // EJERCICIO 7
    printf("
-- Ejercicio 7: 
");
    lecturaGenomas("genomas.txt", te, &numElem);
    printf("
El número de genomas es %d", numElem);
    for(i = 0; i < numElem; i++) {
        printf("Organismo %d con %d nuc", i, te[i]);
    }
}

FUNCIONES.CPP (Operaciones con Ficheros)

#include "tipos.h"

// E5
int lecturaGenoma(Cadena nomF) {
    char car;
    int cont = 0;
    Fichero f;
    f = fopen(nomF, "r"); // Modo lectura (r)
    if(f == NULL)
        printf("
Error en la apertura del fichero");
    else {
        fscanf(f, "%c", &car); // Lectura anticipada del fichero
        while(!feof(f)) { // Mientras no sea fin de fichero
            cont++;
            printf("%c", car);
            fscanf(f, "%c", &car);
        }
        fclose(f);
    }
    return cont;
}

// E6
int cargaTablaConLecturaGenoma(Cadena nomF, TablaCaracteres tc) {
    Fichero f;
    char car;
    int cont = 0;

    f = fopen(nomF, "r");
    if(f == NULL)
        printf("
Error en la apertura del fichero");
    else {
        fscanf(f, "%c", &car);
        while(!feof(f)) {
            tc[cont] = car;
            cont++;
            fscanf(f, "%c", &car);
        }
        fclose(f);
    }
    return cont;
}

// E7
void lecturaGenomas(Cadena nomF, TablaEnteros t, int *ne) {
    Fichero f;
    char nuc;
    int pos, cont = 0;
    *ne = 0;

    f = fopen(nomF, "r");
    if(f == NULL)
        printf("
Error en la apertura del fichero");
    else {
        fscanf(f, "%c", &nuc);
        while(!feof(f)) {
            cont++;
            fscanf(f, "%c", &nuc);
            if(nuc == '\n') {
                pos = *ne;
                t[pos] = cont;
                *ne = *ne + 1;
                cont = -1;
            }
        }
        fclose(f);
    }
}

// EJ8
/*
void leePac(Cadena nomf, TablaPacientes tp, int *numPac) {
    Fichero f;
    Cadena ap1, ap2, nom;
    Paciente pac;
    f = fopen(nomF, "r");
    if(f == NULL)
        printf("
Error en la apertura del fichero");
    else {
        *numPac = 0;
        fscanf(f, "%s%s%s", ap1, ap2, nom); // Leer el paciente
        while (!feof(f)) {
            strcpy(pac.nombre, nom);
            strcpy(pac.apellidos, strcat(ap1, ap2)); // Concatenar
            pos = *numPac;
            tp[pos] = pac;
            *numPac = *numPac + 1;
            fscanf(...);
        }
        fclose(f);
    }
}
*/

Descargar

PDF Word HTML