-int argtod(const char* arg, Real* var, const char* nom) {
- /* Puntero al último caracter bien interpretado por strtod. */
- char* err = NULL;
- /* Realiza la conversión de un string a un Real */
- *var = strtod(arg, &err);
- /* Si el caracter donde apunta endptr es 0 es porque se interpretó toda la
- * cadena bien */
- if ((char)*err == '\0') {
- return TRUE;
- /* Si no, es que hubo error. */
- } else {
- fprintf(stderr, "Error: El parámetro '%s' debe ser un número ", nom);
- fprintf(stderr, "real. Usted ingresó '%s' pero '%s' no ", arg, err);
- fprintf(stderr, "pudo ser interpretado.\n");
- return FALSE;
- }
-}
-
-int cargar_datos(int argc, const char** argv, Real* paso, Real* tf, Real* f0) {
- switch (argc) {
- /* Si no tiene parámetros usa los valores por omisión. */
- case 1:
- break;
- /* Si tiene de 1 a 3 parámetros, los lee y valida, saliendo con un
- * mensaje de error en caso de haberlo. */
- case 4:
- /* Hay 3 parámetros, lee el 3er parámetro. */
- if (!argtod(argv[3], f0, "f0")) {
- return FALSE;
- }
- /* Continúa con el resto de los parámetros. */
- case 3:
- /* Hay al menos 2 parámetros, lee el 2do parámetro. */
- if (!argtod(argv[2], tf, "tf")) {
- return FALSE;
- }
- /* Continúa con el resto de los parámetros. */
- case 2:
- /* Hay al menos 1 parámetro, lee el 1er parámetro. */
- if (!argtod(argv[1], paso, "paso")) {
- return FALSE;
- }
- break; /* Finaliza el switch (no lee más parámetros). */
- /* Hay demasiados parámetros, sale con mensaje de error. */
- default:
- fprintf(stderr, "Error: Demasiados parámetros.\n");
- return FALSE;
- }
- /* TODO Verificar que el paso no sea cero y que tf > ti. */
- /* XXX - sacar */
- printf("paso = %f, tf = %f, f0 = %f\n", *paso, *tf, *f0);
- return TRUE;
-}
-
-size_t calcular(Resultados* res, Real paso, Real ti, Real tf, Real f0) {
- /* Índice para iterar. */
- size_t i;
- /* Calculo la cantidad de pasos necesarios según el tiempo inicial, el
- * tiempo final y el "tamaño" del paso. */
- size_t pasos = (size_t)((tf - ti) / paso);
- /* Respeto la cantidad máxima de pasos admitida. */
- if (pasos > MAX_PASOS) {
- pasos = MAX_PASOS;
- }
- /* Agrego el valor inicial de la función (para empezar a iterar). */
- (*res)[0] = f0;
- /* Itero paso a paso calculando el valor de la función. */
- for (i = 1; i < pasos; i++) {
- /* f(t+paso) = FUNCION(paso, f(t)) */
- (*res)[i] = FUNCION(paso, (*res)[i-1]);
- /* FIXME sacar!!!! */
- printf("i = %i, t = %.2f, f(t) = %.2f\n", i, (Real)i * paso, (*res)[i]);
- }
- return pasos;
-}
-
-Real max(const Resultados* res, size_t pasos) {
- size_t i;
- Real max = (*res)[0];
- for (i = 1; i < pasos; i++) {
- if ((*res)[i] > max) {
- max = (*res)[i];
- }
- }
- return max;
-}
-
-Real min(const Resultados* res, size_t pasos) {
- size_t i;
- Real min = (*res)[0];
- for (i = 1; i < pasos; i++) {
- if ((*res)[i] < min) {
- min = (*res)[i];
- }
- }
- return min;
-}
-