Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - minette1988

#1
Hola, quiero obtener la media de una serie de números almacenados en un vector. He definido un vector de 100 elementos, pero no lo quiero llenar todo. Uso el bucle while  para introducir la cantidad de números que yo quiera. En el momento que me pregunta otro? le doy que no y me sale esto: La media es -36046567217453303226519490776462834093195326687546261483049571502083785345215250433915316893387385717851675440677491564514894938068961058035063788649341798672398777324866008790631210573116460943674979154620314287199762365252556423138115833356791091699933773824.000000

#include <stdio.h>
#include <stdlib.h>

#define TAM 100

int main(){
        double v[TAM];
        int i=0;
        char op='s';
        double media = 0.0;

        while((op == 's' || op == 'S') && i < TAM){
            printf("Introduce un número: ");
            scanf("%lf", &v[i]);
            i++;
            printf("Otro? (s/n)");
            scanf("%1s", &op);
        }
       
   
        for(i=0; i<TAM; i++){
           media += v[i];
        }
        media = media/TAM;
        printf("La media es %lf\n", media); 
}
#2
Hola, el siguiente programa escribe cadenas en un fichero binario, luego las lee del fichero y finalmente las muestra por pantalla:

#include <stdio.h> //escribe una cadena en un fichero y después lo lee y escribe en pantalla
#include <string.h>

struct registro{
   char nombre[50];
};


int   main ()
   {
      FILE *fich;
      char nom_fich[50];
      char op;
       
      struct registro datos;

      printf("Introduzca nombre del fichero: ");
      scanf("%49s",nom_fich);
      /* Escritura del float en el fichero */
      if ((fich = fopen (nom_fich, "wb")) == NULL)
         {
         printf ("Error de creación del fichero\n");
         
         }
       else{
          do{
           printf("Introduce una cadena: ");
           scanf("%49s",datos.nombre);
           fwrite (&datos, sizeof (datos), 1, fich);
           printf("¿Otro? (s/n)");
           scanf("%1s",&op);
          }while((op == 's') || (op == 'S'));
       }
       fclose (fich);

       /* Lectura del float del fichero */
      if ((fich = fopen (nom_fich, "rb")) == NULL)
         {
         printf ("Error de existencia del fichero\n");
         
         }
      else{
          fread (&datos, sizeof(datos), 1, fich);
          while(!feof)
             fread (&datos, sizeof(datos), 1, fich);
      }
      fclose (fich);
     
      printf ("%s\n", datos.nombre);
   }


Cuando lo compilo sólo me imprime la primera cadena, ¿por qué? Por favor, contestadme pronto esta tarde tengo examen de recuperación. Gracias.
#3
Programación C/C++ / ejercicio de examen
8 Junio 2010, 20:55 PM
Hoy he tenido el examen y el enunciado es este, a ver si hay alguien que pueda resolverlo.
Según nos ha dicho el profesor no es necesario definir el struct.
Me ha salido de pena el examen.

Escribe un programa en C, que estará formado por un módulo principal y por un módulo que será llamado desde el anterior. El programa principal deberá leer de teclado el nombre de 12 ficheros con los datos de las ventas de cada mes del año y cada una de estas ventas está formada por un registro (struct venta) que incorporamos mediante el fichero ventas.h. El programa principal debe crear un fichero donde guardará el valor mayor de cada uno de los 12 ficheros. El proceso consistirá en:

     1.    Crear el fichero para los valores mayores de las ventas (max_ventas.dat).
     2.    Leer los 12 nombres de ficheros.
     3.    Por cada fichero con ventas, lo abrirá y le pasará el puntero a fichero al otro módulo que se encargará de buscar el registro con valor de venta mayor (el campo a usar es total_venta), devolviendo este registro al programa principal.
     4.    Grabar en el fichero el registro que nos ha devuelto el módulo que busca el mayor.
     5.    Cerrar el fichero max_ventas.dat y terminar el programa.
#4
Programación C/C++ / buscar deuda mayor
7 Junio 2010, 15:44 PM
Hola, tengo el siguiente ejercicio que pide los datos de los clientes y quiero hacer un subprograma que me busque la deuda mayor y la muestre por pantalla. Lo he intentado, pero no me sale, me da errores.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEE_CHAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();

#define LEE_CAD(c,n) { int i=0; \
                     c[i]=getchar();\
     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
     while ((c[i]!='\n') && (i < (n-1))){ \
        i++;\
c[i]=getchar(); }\
     c[i]='\0'; }

#define TAM_NOMBRE 100
#define TAM_DIR 100
#define NUM_CLIENTES 10
struct cliente{
char nombre[TAM_NOMBRE];
        char direccion[TAM_DIR];
        double deuda;
};
int main(){
void crear_fich();
        void deuda_mayor();
        char sel;
FILE *pf; //Puntero a fichero

        /* Abre el fichero para trabajar con él en Lectura / Escritura */
        if((pf = fopen("datos.dat", "wb+")) == NULL) {/*"rb+"*/
           /* Si no existe, ejecuta el módulo que lo cree */
   crear_fich();
   /* Una vez creado lo habre en lectura/escritura */
           if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(1);
   }
        }

do{
printf("MENÚ\n----\n");

printf("1). Dar de alta un cliente.\n");
                printf("2). Mostrar la deuda mayor.\n");
                printf("3). salir y eliminar.\n");
                printf("0). Salir\n\nOpción(0-2): ");

do{
LEE_CHAR(sel);
}while( (sel<'0') || (sel>'3') );

switch(sel){
case '1':{
crear_fich(pf);
    /* Una vez creado lo abre en lectura/escritura */
    if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(2);
    }
break;}
                                case '2':{ deuda_mayor(pf);
                                        break;}
                                case '3':{ fclose(pf); pf=NULL; remove("datos.dat"); sel= '0';
break;}
                } //switch
}while(sel!='0');

exit(0);
}//main()
////////////////////////////////////////
void crear_fich(FILE* pf) {
         struct cliente cli[NUM_CLIENTES];
         int i=0;
         char otro;

if((pf = fopen("datos.dat", "ab")) == NULL) {
perror("Al crear el fichero de datos");
                exit(2);
         }
         
         /* Lectura de los ciclistas */
         do {

cli[i].deuda = 0.0;
                printf("Nombre: "); LEE_CAD(cli[i].nombre, TAM_NOMBRE);
                printf("Dirección: "); LEE_CAD(cli[i].direccion, TAM_DIR);
                printf("Deuda: "); scanf("%lf", &cli[i].deuda);
                /*Escribe el cliente en el fichero */
                fwrite(&cli, sizeof(struct cliente), 1, pf);
printf("¿Otro? (s/n) ");
                LEE_CHAR(otro);
        }while((otro=='s') || (otro=='S'));
if(fclose(pf) == EOF){
printf("Error al cerrar el fichero, compruebe si hay información.\n");
                exit(3);
        }
} /* crear_fich()*/
//////////////////////////////////
void deuda_mayor(FILE *pf){
        struct cliente cli[NUM_CLIENTES]; 
        int i=0;
        int deuda_mayor;
        deuda_mayor=0;
        for(i=0; i<NUM_CLIENTES; i++){
            rewind(pf);
            fread(&cli,sizeof(struct cliente),1,pf);
            while(!feof(pf)){
                for(i=1; i<NUM_CLIENTES; i++){
                   if(cli[i].deuda > cli[deuda_mayor].deuda);
                      deuda_mayor=i;
                }
            }
            printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);
        }
}


Cuando le doy la opción 2 que es mostrar la deuda mayor no hace nada.




#5
Hola, tengo un fichero binario con varios registros, lo que quiero es sustituir el salto de linea que separa a cada registro por una coma, para así a la hora de imprimirlos me saga cada registro separado por una coma.

Primero se trata de abrir el fichero binario en lectura ir leyendo caracter a caracter y en cuanto encuentra el salto de linea sustituirlo por la coma y cuando llegue al final cerrar el fichero.

Yo he empezado haciendo esto, pero me da error de lectura.

#include <stdio.h>

int main(){
         char nom_fich[50];
         char caracter;
         FILE *pf;

         printf("Introduzca nombre del fichero: ");
         scanf("%49s", nom_fich);

         if((pf = fopen("datos.dat", "rb")) == NULL) {
printf("Error al abrir el fichero.\n");
         }
         else{
             caracter = getc(pf);
             while(caracter != EOF){
                printf("%c", caracter);
                caracter = getc(pf);
             }
             if(feof(pf)==0){
               printf("Error de lectura.\n");
             }
             fclose(pf);
         }
         return(0);
}
#6
Scripting / acceso directo a página web
2 Junio 2010, 13:23 PM
Hola, tengo que crear un script en visual basic que cree un enlace a la página web www.google.com. En el programa aparecerá un menú donde elegiremos donde crear el enlace. El enlace se podrá crear en el escritorio (Desktop) o en mis documentos (My Documents). Si no se introduce ninguna de las dos opciones anteriores o es incorrecto nos dará un mensaje de error.

Es una de las preguntas que me han salido en el examen y he sacado un 4. Me gustaría que me ayudarais a resolver este ejercicio, ya que no puedo practicar en casa porque no tengo Windows.
Si me podéis decir alguna pagina donde haya ejercicios resueltos de Visual Basic Script os lo agradecería. Gracias.
#7
El siguiente programa ordena los nombres alfabéticamente usando qsort, lo que quiero es mediante un switch darle la opción de ordenar por el nombre u ordenar por la deuda. Lo he intentado varias veces y no me sale. Este es el código:

/* Programa de ejemplo de gestió de memoria dinámica. El programa tomará
los registros de un fichero y reservará la memoria necesaria para poder
guardarlos en memoria y ordenarlos con el qsort(), una vez ordenados los
volverá a guardar en el fichero */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* macro para leer cadenas con caracteres blanco filtrando los return y
   blancos iniciales  */
#define lee_cad(cad,n,fin) cad[0]=getchar(); \
                           while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \
                              cad[0]=getchar();\
                           n=0; \
                           while(((int)cad[n]!= 10) && (n < fin)){ \
               n++; cad[n]=getchar();} \
           cad[n]='\0';

struct registro{
   char nombre[50];
   float deuda;
};

int main(){
  FILE * df;
  struct registro cliente;
  int i,fin;
  char op;
  int num_registros;
  struct registro *punt_memoria;
  int compara();

  if((df=fopen("apuestas.dat","wb")) == NULL){
     printf("\nError al crear el fichero apuestas.dat\n");
     exit(1);
  }


  do{
     printf("Nombre del apostante: ");
     lee_cad(cliente.nombre,i,50);
     //scanf("%49s",cliente.nombre);
     printf("Deuda? ");
     scanf("%f",&cliente.deuda);
     fwrite(&cliente,sizeof(cliente),1,df);
     printf("Otro(0 --> No / 1 --> Sí) ");
     scanf("%d",&fin);
  }
  while(fin!=0);

  fclose(df);

  if((df=fopen("apuestas.dat","rb")) == NULL){
     printf("\nError al abrir el fichero apuestas.dat\n");
     exit(1);
  }
  /* Para ver cuantos registros hay en el fichero, pongo el puntero
  al final, obtengo su posición y divido por el tamaño del registro */
  fseek(df,0,SEEK_END);

  num_registros = ftell(df)/sizeof(cliente);

  /* Reservo la memoria necesaria para estos registros */
  punt_memoria = (struct registro *)calloc(num_registros, sizeof(cliente));

  /* Leo los registro del fichero y los guardo en memoria */

  rewind(df); /* Llego el descriptor de fichero al principio */
  /* Leo todos los registros y los guardo en la zona reservada de memoria */
  fread(punt_memoria,sizeof(cliente),num_registros,df);

  fclose(df);
  /* Ordeno el vector con qsort() */

  qsort(punt_memoria,num_registros,sizeof(cliente),compara);

  /* Guarda los registros ordenados en el fichero */
  if((df=fopen("apuestas.dat","wb")) == NULL){
     printf("\nError al crear el fichero apuestas.dat\n");
     exit(1);
  }
  fwrite(punt_memoria,sizeof(cliente),num_registros,df);
  fclose(df);

  /* Mostrar el contenido del fichero ordenado */
  if((df=fopen("apuestas.dat","rb")) == NULL){
     printf("\nError al abrir el fichero apuestas.dat\n");
     exit(1);
  }
  fread(punt_memoria,sizeof(cliente),num_registros,df);
  for(i=0; i < num_registros; i++)
    printf("%s  %.1f\n",(punt_memoria+i)->nombre, (punt_memoria+i)->deuda);
  fclose(df);
  free(punt_memoria);
} /* main() */

/* La función compara usa strcmp para ordenar alfabéticamente
   el fichero */

int compara(struct registro *r1, struct registro *r2){
    return(strcmp(r1->nombre, r2->nombre));
}
#8
Hola, tengo que hacer un script que pida por teclado un carácter y determine si es una vocal, consonante, número o signo de puntuación. ¿Podéis echarme una mano?, ando muy perdida con esto de Visual Basic y el jueves tengo examen. Gracias.
#9
Hola, el siguiente script en Visual Basic ordena tres números tomados de teclado y quería saber si está bien:

Código (vb) [Seleccionar]
Option Explicit
Dim a, b, c
var = InputBox("Introduce tre números:")
MsgBox(a, b, c)
If (( a > b) && (a > c)) Then
    If (b > c)
     MsgBox(c, b, a)
    Else
         MsgBox(b, c, a)
End If
If (( b > a) && (b > c)) Then
      If (a > c)
         MsgBox(c, a, b)
      Else
           MsgBox(a, c, b)
End If
If (( c > a) && ( c > b)) Then
     If ( a > b)
        MsgBox(b, a, c)
     Else
          MsgBox(a, b, c)
End If
#10
Hola, tengo que hacer un script en visual basic que me cuente cuantas veces aparece una subcadena dentro de una cadena. No me aclaro Ej: estrella La letra e aparece dos veces
Debo introducir la cadena de teclado usando InputBox.
#11
Hola, tengo el siguiente programa que me permite añadir al principio, al final, recorrer la lista y mostrarla por pantalla, borrar un nodo. Lo que no me deja es insertar un nodo después de otro.

Pongo un ejemplo: Miguel Angel 25, Gloria 32, Pablo 50
Borro Gloria 32 y quiero insertar un nuevo nodo entre el primero y el tercero, ya que he borrado el segundo.
Espero que puedan ayudrame, gracias.
Este es el programa:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEE_CAD(c,n) { int i=0; \
                     c[i]=getchar();\
     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
     while ((c[i]!='\n') && (i < (n-1))){ \
        i++;\
c[i]=getchar(); }\
     c[i]='\0'; }

#define T_NOM 101
#define T_EDAD 3


struct persona {
char nom[100];
        char edad[3];
struct persona *siguiente;
};

int main(){
         struct persona *lista=NULL;
         struct persona *nodo;

         int op;
         void alta_inicio();
         void alta_final();
         void alta_despues_de();
         void recorrer_lista();
         void borrar_nodo();
         struct persona * buscar_nodo();
         
         do{
            do{
               printf("Elija una opción:\n");
               printf("1--> Añadir al principio.\n");
               printf("2--> Añadir al final.\n");
               printf("3--> Recorrer la lista.\n");
               printf("4--> Buscar nodo.\n");
               printf("5--> Eliminar nodo.\n");
               printf("6--> Añadir despues de...\n");
               printf("7--> Salir.\n");
               scanf("%d",&op);
            }while((op < 1) || (op > 7));
         if(op != 4)   
            switch(op){
                case 1: { alta_inicio(&lista);break;}
                case 2: { alta_final(&lista);break;}
                case 3: { recorrer_lista(&lista);break;}
                case 4: { nodo=buscar_nodo(&lista);
                          printf("\n%s\n",nodo->nom);break;}
                case 5: { borrar_nodo(&lista);break;}
                case 6: { alta_despues_de(&lista);break;}
            }
         }while(op != 7);
         exit(0);
}
////////////////////////////////////////////////////////////////////////////
void alta_inicio(struct persona **lista){
         struct persona *nuevo_nodo;
         nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
         if(nuevo_nodo != NULL){
            nuevo_nodo->siguiente = *lista;
            *lista = nuevo_nodo;
            printf("Nombre: ");
            LEE_CAD(nuevo_nodo->nom,T_NOM);
            printf("Edad: ");
            LEE_CAD(nuevo_nodo->edad,T_EDAD);
         }
}             
////////////////////////////////////////////////////////////////////////////////
void recorrer_lista(struct persona **lista){
          struct persona *nodo_aux;
          nodo_aux = *lista;
          while(nodo_aux != NULL){
               printf("%s\n",nodo_aux->nom);
               printf("%s\n",nodo_aux->edad);
               nodo_aux = nodo_aux->siguiente;
          }
}
//////////////////////////////////////////////////////////////////////////////
void alta_final(struct persona **lista){
          struct persona *nuevo_nodo;
          struct persona *nodo_aux;

          nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
          if(nuevo_nodo != NULL){
             nodo_aux = *lista;
             while(nodo_aux->siguiente != NULL)
                nodo_aux = nodo_aux->siguiente;
                nodo_aux->siguiente=nuevo_nodo;
                nuevo_nodo->siguiente=NULL;
                printf("Nombre del nuevo elemento: ");
                LEE_CAD(nuevo_nodo->nom,T_NOM);
                printf("Edad del nuevo elemento: ");
                LEE_CAD(nuevo_nodo->edad,T_EDAD);
          }
          else
               printf("Error al tomar memoria del nuevo nodo.\n");
}
/////////////////////////////////////////////////////////////////////////////////
struct persona *buscar_nodo(struct persona **lista){
          struct persona *nodo_aux, *resultado;
          char nom[100];
          char edad[3];
          int encontrado = 0;

          printf("Nombre a buscar: ");
          scanf("%99s",nom);
         
          nodo_aux = *lista;
          while((nodo_aux->siguiente != NULL) && (!encontrado)){
                if(strcmp(nom,nodo_aux->nom) == 0)
                  encontrado = 1;
                else
                    nodo_aux = nodo_aux->siguiente;
          }
          if((nodo_aux->siguiente == NULL) && (!encontrado))
              if(strcmp(nom,nodo_aux->nom) == 0)
                 encontrado = 1;
          if(encontrado)
            resultado = NULL;
          return(resultado);

          printf("Edad a buscar: ");
          scanf("%2s",edad);
         
          nodo_aux = *lista;
          while((nodo_aux->siguiente != NULL) && (!encontrado)){
                if(strcmp(edad,nodo_aux->edad) == 0)
                  encontrado = 1;
                else
                    nodo_aux = nodo_aux->siguiente;
          }
          if((nodo_aux->siguiente == NULL) && (!encontrado))
              if(strcmp(edad,nodo_aux->edad) == 0)
                 encontrado = 1;
          if(encontrado)
            resultado = NULL;
          return(resultado);
}
////////////////////////////////////////////////////////////////////////////////
void borrar_nodo(struct persona **lista){
          struct persona *nodo_aux, *nodo_anterior;
          char nom[100];
          char edad[3];
          int encontrado = 0;

          printf("Nombre a borrar: ");
          scanf("%99s",nom);
          nodo_aux = *lista;

          if(strcmp(nom,nodo_aux->nom) == 0){
            *lista=nodo_aux->siguiente;
            free(nodo_aux);}
          else{
               nodo_anterior = nodo_aux;
               nodo_aux = nodo_aux->siguiente;
               while((nodo_aux->siguiente != NULL) && (!encontrado)){
                   if(strcmp(nom,nodo_aux->nom) == 0)         
                     encontrado = 1;
                   else{
                      nodo_anterior = nodo_aux;
                      nodo_aux = nodo_aux->siguiente;
                   }
               } 
               if((nodo_aux->siguiente == NULL) && (!encontrado))
                  if(strcmp(nom,nodo_aux->nom) == 0)
                     encontrado = 1;
               if(encontrado){
                  nodo_anterior->siguiente = nodo_aux->siguiente;
                  free(nodo_aux);
               }
          }
          printf("Edad a borrar: ");
          scanf("%2s",edad);
          nodo_aux = *lista;

          if(strcmp(edad,nodo_aux->edad) == 0){
            *lista=nodo_aux->siguiente;
            free(nodo_aux);}
          else{
               nodo_anterior = nodo_aux;
               nodo_aux = nodo_aux->siguiente;
               while((nodo_aux->siguiente != NULL) && (!encontrado)){
                   if(strcmp(edad,nodo_aux->edad) == 0)         
                     encontrado = 1;
                   else{
                      nodo_anterior = nodo_aux;
                      nodo_aux = nodo_aux->siguiente;
                   }
               } 
               if((nodo_aux->siguiente == NULL) && (!encontrado))
                  if(strcmp(edad,nodo_aux->edad) == 0)
                     encontrado = 1;
               if(encontrado){
                  nodo_anterior->siguiente = nodo_aux->siguiente;
                  free(nodo_aux);
               }
          }
}
///////////////////////////////////////////////////////////////////////////////
void alta_despues_de(struct persona **lista){
           struct persona *nuevo_nodo;
           struct persona *nodo_aux;
           char nom[100];
           char edad[3];
           int encontrado = 0;
           
           printf("Nombre a buscar para insertar después de el: ");
           scanf("%99s",nom);
           
           nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));

           if(nuevo_nodo != NULL){
             nodo_aux = *lista;
             while((nodo_aux->siguiente != NULL) && (!encontrado)){
                  if(strcmp(nom,nodo_aux->nom) == 0)
                     encontrado = 1;
                  else{
                       nodo_aux = nodo_aux->siguiente;
                  }
             }
             if((nodo_aux->siguiente == NULL) && (!encontrado))
                if(strcmp(nom,nodo_aux->nom) == 0)
                  encontrado = 1;

             if(encontrado){
                nuevo_nodo->siguiente=nodo_aux->siguiente;
                nodo_aux->siguiente=nuevo_nodo;
                printf("Nombre del nuevo elemento: ");
                scanf("%99s",nuevo_nodo->nom);
             }
             else{
                  printf("Elemento no encontrado.\n");
                  free(nuevo_nodo);
             }
           }
           printf("Edad a buscar para insertar después de el: ");
           scanf("%2s",edad);

           nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));

           if(nuevo_nodo != NULL){
             nodo_aux = *lista;
             while((nodo_aux->siguiente != NULL) && (!encontrado)){
                  if(strcmp(edad,nodo_aux->edad) == 0)
                     encontrado = 1;
                  else{
                       nodo_aux = nodo_aux->siguiente;
                  }
             }
             if((nodo_aux->siguiente == NULL) && (!encontrado))
                if(strcmp(edad,nodo_aux->edad) == 0)
                  encontrado = 1;

             if(encontrado){
                nuevo_nodo->siguiente=nodo_aux->siguiente;
                nodo_aux->siguiente=nuevo_nodo;
                printf("Edad del nuevo elemento: ");
                scanf("%2s",nuevo_nodo->edad);
             }
             else{
                  printf("Elemento no encontrado.\n");
                  free(nuevo_nodo);
             }
           }
}

#12
Scripting / contar caracteres
13 Mayo 2010, 12:42 PM
Hola, esta tarde tengo examen y tengo este script que cuenta los caracteres de una cadena pasada como parámetro, pero me da este error: wc: pepe: No existe el fichero ó directorio
pepe tiene caracteres
Código (bash) [Seleccionar]
#!/bin/bash

if [ -n $1 ]
then
    num_carac= `wc -c $1`
    echo $1 "tiene" $num_carac "caracteres"
else
    echo "Error no se ha introducido ningún parámetro"
fi
#13
Scripting / multipliación de un número
8 Mayo 2010, 14:13 PM
Hola, tengo que mostrar la tabla de multiplicar de un número pasado como argumento, pero no me funciona:

Código (bash) [Seleccionar]
#!/bin/bash

n=1

while [ $n -le 10 ]
do
   multi= `expr $1 \* $n`
   echo $1 * $n = $multi
   n = `expr $n + 1`
done
#14
Hola, el siguiente script recibe como primer parámetro un archivo de texto y ordena las líneas de dicho archivo ascendentemente al pasarle una "A" como segundo parámetro o descendentemente al pasarle una "Z". Cuando lo ejecuto me sale esto: [: 16: missing ]

Código (bash) [Seleccionar]
#!/bin/bash

if [ $# -ge 2 ]
then
     if [ -f $1 ] && [ $2 = "A"]
     then
        `cat $1 | sort -d#`
     else
         if [ -f $1 ] && [ $2 = "Z" ]
         then
            `cat $1 | sort -r`
         fi
     fi
else
    echo "Error: Falta pasar argumentos"
fi