Sistema de estacionamiento en pascal






Expliquemos un poco de que se trata, cual es la finalidad de esta aplicación. Consiste en un sistema para un parqueadero donde se deben consultar los lugares vacíos y los lugares ocupados, así como estacionar un vehículo o liberar vehículo. Es algo sencillo sob solo ideas qeu se pueden llevar a proyectos ams grande. y cabe destacar q este fue mi primer parcial de pascal :)

Codigo fuente: 

  1 (*Eduardo luis garcia marrrugo*) 
  2 (*Felix david hernandez aldana*) 
  3  
  4 program parcial; 
  5 uses crt; 
  6  
  7      var estacion: array[1..100] of integer; 
  8          i,opcion,opcion_siclos:integer; 
  9          continuar,cont_siclos,parada: string[2]; 
 10           posx,posy,notificador:byte; 
 11           puesto:byte; 
 12  
 13           (*parada: esta variable me simula el readkey pero evita el fujo del enter*) 
 14 begin 
 15  
 16  
 17        (*incializamos el vecto a posciones vacias las cual leeremos como (0)*) 
 18          for i:=1 to 100 do 
 19          begin 
 20              estacion[i]:=0; 
 21          end; 
 22          repeat (*volber al menu ppal*) 
 23  
 24             repeat (*repetir hasta que se selccione una de las operaciones posibles*) 
 25                 clrscr; 
 26                 gotoxy(20,2);writeln('Sistema de estacionamiento'); 
 27                 gotoxy(3,5);write('Menu'); 
 28                 gotoxy(3,7);write('1) Estacionar'); 
 29                 gotoxy(3,9);write('2) Salida de vehiculo'); 
 30                 gotoxy(3,11);write('3) Consultar lugares disponibles'); 
 31                 gotoxy(3,13);write('4) Consultar lugares ocupados'); 
 32                 gotoxy(3,15);write('5) Salir'); 
 33  
 34                 gotoxy(3,18);write('Elija una opcion: '); 
 35             readln(opcion); 
 36             until((opcion>=1) and (opcion<=5)); 
 37  
 38  
 39  
 40  
 41         case opcion of 
 42  
 43             1: 
 44             begin 
 45  
 46                  repeat 
 47                   repeat  (*nos controla que se seleccion el numero indicado*) 
 48                     clrscr; 
 49                     gotoxy(20,2);write('Estacionar vehiculo'); 
 50                     gotoxy(3,5);write('1) Consultar lugares disponibles'); 
 51                     gotoxy(3,7);write('2) asignar lugar de estacionamiento'); 
 52  
 53                     gotoxy(3,11);write('Escoja una opcion: '); 
 54                     gotoxy(22,11);read(opcion_siclos); 
 55  
 56                   until((opcion_siclos>=1) and (opcion_siclos<=2)); 
 57  
 58                   case opcion_siclos of 
 59                      1: begin 
 60                               clrscr; 
 61                               gotoxy(20,2);write('Puestos Desocupados:'); 
 62                               posx:=3; posy:=5; 
 63  
 64                         for i:=1 to 100 do 
 65                          begin 
 66                                if estacion[i] =0 then 
 67                                begin 
 68                                  gotoxy(posx,posy); write(i); 
 69                                  posx:=posx+3; 
 70                                   if posx>=40 then 
 71                                   begin 
 72                                       posy:=posy +2; 
 73                                       posx:=3; 
 74                                   end; 
 75  
 76                                end; 
 77                          end;(*fin for que reccore el vector estacion*) 
 78  
 79                          posy:=posy +4; 
 80  
 81                          gotoxy(3,posy);write('En que puesto estacionara el vehiculo?: '); 
 82                          gotoxy(43,posy);readln(puesto); 
 83                          (*estacion[puesto]:=1;*)(*le asignamos 1 a los puestos ocupados*) 
 84  
 85                          if estacion[puesto]=0 then 
 86                           begin 
 87                             estacion[puesto]:=1; 
 88                              notificador:=1; 
 89  
 90                           end 
 91                           else 
 92                            begin 
 93                             write(15,20);write('Este puesto esta ocupado'); 
 94                            (* readkey; --------------*) 
 95                             readln(parada); 
 96                            end; 
 97  
 98  
 99  
100                         end;(*fin caso 1: opcion siclos*) 
101  
102  
103                      2: begin 
104  
105                           repeat 
106                           clrscr; 
107                           notificador:=0; 
108                           gotoxy(30,2);write('Estacionar vehiculo'); 
109  
110  
111  
112                          gotoxy(3,4);write('En que puesto estacionara el vehiculo?: '); 
113                          gotoxy(43,4);readln(puesto); 
114  
115                           if estacion[puesto]=0 then 
116                           begin 
117                             estacion[puesto]:=1; 
118                              notificador:=1; 
119  
120                           end 
121                           else 
122                            begin 
123                             write(15,20);write('Este puesto esta ocupado'); 
124                            (* readkey; --------- *) 
125                                readln(parada); 
126                            end; 
127                          posy:=10; 
128  
129  
130  
131                           until (notificador=1); 
132                         end;(*fin caso 2 de opcion siclos*) 
133  
134  
135                 end; (*opcion siclos*) 
136  
137                 posy:=posy+2; 
138                 gotoxy(3,posy);write('Presione cualquier tecla para volver'); 
139                 posy:=posy+1; 
140                 gotoxy(15,posy);write('Al menu de estacionamiento'); 
141                 posy:=posy+1; 
142                 gotoxy(15,posy);write('(n) para caso contrario: '); 
143  
144  
145                 gotoxy(42,posy);readln(cont_siclos); 
146  
147                 until(cont_siclos='n'); 
148  
149              (************ OJO ****) 
150  
151             (* readkey; *) 
152               readln(parada); 
153             end;(*fin caso 1*) 
154  
155        2: begin 
156  
157            clrscr; 
158            gotoxy(20,2);write('Salida de vehiculos'); 
159  
160            gotoxy(3,5);write('Puesto a desocupar: '); 
161            gotoxy(23,5);readln(puesto); 
162  
163            estacion[puesto]:=0; (*no hay que verificar esto no alterara el resultado*) 
164  
165  
166           end;(*fin caso 2 menu ppal*) 
167  
168  
169  
170        3:  begin 
171              clrscr; 
172                gotoxy(20,2);write('Puestos Desocupados:'); 
173                posx:=3; posy:=5; 
174  
175                         for i:=1 to 100 do 
176                          begin 
177                                if estacion[i] =0 then 
178                                begin 
179                                  gotoxy(posx,posy); write(i); 
180                                  posx:=posx+3; 
181                                   if posx>=40 then 
182                                   begin 
183                                       posy:=posy +2; 
184                                       posx:=3; 
185                                   end; 
186  
187                                end; 
188                          end;(*fin for que reccore el vector estacion*) 
189                    (*  readkey;     *) 
190                    readln(parada); 
191          end;(*fin caso 3 menu ppal*) 
192  
193  
194  
195         4:begin 
196                clrscr; 
197                gotoxy(20,2);write('Puestos Ocupados:'); 
198                posx:=3; posy:=5; 
199  
200                         for i:=1 to 100 do 
201                          begin 
202                                if estacion[i] =1 then 
203                                begin 
204                                  gotoxy(posx,posy); write(i); 
205                                  posx:=posx+3; 
206                                   if posx>=40 then 
207                                   begin 
208                                       posy:=posy +2; 
209                                       posx:=3; 
210                                   end; 
211  
212                                end; 
213                          end;(*fin for que reccore el vector estacion*) 
214                     (* readkey; *) 
215                     readln(parada); 
216  
217           end; (*fin caso 4 menu ppal*) 
218  
219         5: begin 
220              exit; (*salgo del procedimiento*) 
221  
222             end; (*fin caso 5*) 
223  
224  
225         end; (*fin del case ppal*) 
226  
227           gotoxy(20,25);write('Presione cualquier tecla para volver al Menu Principal'); 
228           gotoxy(23,27);write('presione (n) en caso contrario: '); 
229           readln(continuar); 
230          until(continuar='n');  (*condiciopn colber al menu ppal*) 
231  
232  
233  
234     readkey; 
235  
236 end.(*fin del bloque principal*)

Bueno eso es todo amigos :) jejeje

Free pascal






Free Pascal es un potente compilador para dicho lenguaje.
La sintaxis de lenguaje de Free Pascal es semánticamente compatible con Turbo Pascal 7.0. También soporta algunas extensiones usadas por Delphi.
Opciones adicionales incluyen: soporte para sobrecarga de proceso, optimizador de código, posibilidad para cargar variables en registros, un analizador del nivel del flujo de datos del ensamblador, eliminaciones de Stack, un ensamblador integrado, encadenamiento inteligente, soporte para debugger GNU, y soporte API.

& como sabran las descargas son de los sitios oficiales esta ves la tomaremos desde softonic:
Descargar:  http://free-pascal.softonic.com/descargar



Nota: Lo he usado y lo uso para mis calses de pascal y debo decir que es excelente me gusta mucho este compilador y para los que trabajen con turbopascal y vallan a provar este compilador. donde colcan:
Uses wincrt; en free pascal es de la siguiente forma: Uses crt;  

Sistema de Encuestas Visual Basic.NET




Bueno como muchos sabrán este fue nuestro primer parcial de programación avanzada y como muchos no sabrán son la 02:15am jejej ya va siendo hora de acostarme, así que seré breve.

Este consiste en una aplicación que realiza encuestas donde primero que todo se registran los candidatos y luego los barrios donde se realizara la encuesta. Cuenta con el modulo de encuestado donde los datos ya son cargados según los barrios y candidatos que se registraron, excepto los estratos que tome 10 tipos de estratos. Ahora las consultas permiten consultar el porcentaje total de un candidato seleccionándolo en un combo que se carga con los nombres de los candidatos, permite una consulta por parámetro para este caso por sexo, así muestra según el sexo seleccionado el porcentaje de personas que votaron por cada candidato, y por ultimo cuenta con una consulta por barrio que nos muestra el porcentaje de personas en un barrio especificado que botaran por los candidatos


Descargar el proyecto:


Vortal "manejo de archivos"

Una imagen:



Video de la aplicacion Corriendo:






Como lo prometido es deuda este es un minivortal desarrollado por supuesto en visual basic.NET y como estoy trabajando en otra aplicación, un sistema de encuestas para subirlo mas tarde les dejo una descripción básica:



La aplicación utiliza las siguientes estructuras "Lo cual verán, y se darán cuenta que esta echa en tal forma como si fuera una base de datos", por eso en el post anterior dije que la siguiente aplicación traería principios conceptuales de bases de datos. ahora las estructuras:

Public Structure materias
Public nomb_materi As String
Public cod_materia As Integer
End Structure

Public datos_materias() As materias

Public Structure estudiante
Public nombre As String
Public id As Long
Public dir As String
Public tel As Long
Public fecha_nac As Date
End Structure

Public datos_estudiante() As estudiante

Public Structure matricula
Public cod_estudiante As Long
Public cod_materia As Long
End Structure

Public datos_matricula() As matricula

Public Structure notas
Public cod_estudiante As Long
Public cod_materia As Long
Public n1 As Decimal
Public n2 As Decimal
Public n3 As Decimal
End Structure

Public datos_notas() As notas

Descargar el proyecto:
 http://www.4shared.com/file/3Aw5v9Ur/sistemalaumnos.html

Manejo de archivos en visual basic.net






Hola. Tengan buenas noches. Muchos se preguntaran ¿el porque de mentalidad cliptoniana? Pues cuando cree el blog se hizo para compartir ideas de como optar por soluciones eficientes para desarrollar nuestras aplicaciones. Pues hoy me tomare unos minuticos para mostrarles algo de archivo.

Esta idea nace en que patiño nos puso hacer un programa con un vector dinámico de registro el cual iba incrementando su tamaño a medida que se iban incluyendo registros o perdiendo tamaño a medida que se iban eliminando, eso esta bien todos los damos para hacer pero a patiño se le ocurrió que lo pasáramos a archivo. & pues había que modificar la mayoría de la estructura del código, y como soy muy flojo dije eso es demasiado para mi así que me pregunte a mi mismo: mi mismo inventate algo que trabaje con archivos pero que no tengas que modificar gran parte del programa, me puse a leer sobre flujos-archivos y entre tanto leer conseguí cosas que me hicieron pensar en otras cosas y después de contarle como surgió la idea aquí esta:

Para los que conocen sobre Bases de Datos sabrán lo que es un acceso desconectado y me dije si ya lo tenemos en un vector tratemos de emitar este tipo de conexión que caga los datos en el dataset y luego actualiza la Base de Datos cuando sea necesario... jejej supongo que ya se habran imaginado que use como dataset el vector que ya tenia así que solo tenia que crear una clase que escribiera y leyera los datos luego cargarlos en un vector y en el momento de agregar, editar o eliminar un registro lo hacia en el vector que me resultaba mucho mas fácil, & cuyo procedimiento ya estaba implementado asi que solo esa agregar una linea de código al final de los botones que implementaban estas operaciones para trabajar con mi objeto de escritura y lectura de archivos.

Pues esa es la idea, hasta el momento he ido mejorando el sistema y me ha resultado muy util ya que puedo acomodarlo a cualquier numero de estructuras como verán en el siguiente aporte que pretende ser un sistema de matricula de materias y digitalizacion de notas con un poco de pricipios teoricos de fundamentos de Base de datos.

Esto se fue largo pero como dije pretende ser una idea, una forma de dar solución a un problema. Ahora explicare un detalle que me parece importante

Para el proceso de escritura:


--Verifico si existe el archivo

----sino existe
**********quiere decir que sera el primer registro que almacenare en el archivo
***********esto lo ago de modo normal con modo append, y write
--pero si existe
*hago una copia de seguridad del archivo-por si se daña el archivo en el proceso
*luego elimino el archivo original
*creo uno nuevo en el cual lo que ago es escribir en el archivo todo el vector(proceso muy sencillo)


--Para la lectura
-verifico si existe el archivo
*leo el archivo hasta que sea fin de archivo
*lo que boy leyendo lo boy almacenando en el vector

& listo problema solucionado



Descargar el proyecto:



http://www.4shared.com/file/D8inct6S/Manejodearchivos.html

Funcion para validar datos

esta es una pequeña funcion que pretende validar los datos introducidos por el teclado.

esta es una prueba de la aplicacion:



Este es el codigo:

  1 #include <stdio.h> 
  2 #include <iostream.h> 
  3 #include <conio.h> 
  4 #include <stdlib.h> 
  5 #include <string.h> 
  6 #include <ctype.h> 
  7  
  8 double funcvalnum (int tam); 
  9 char   *funcvalet (int n); 
 10 char  *funcvalfnume (int ampl); 
 11  
 12 void main (void) 
 13 { 
 14   textbackground(1); 
 15   textcolor(4); 
 16   clrscr(); 
 17  //  int a=getche();///pruebas de momento 
 18   double prueban; 
 19   char pruebalf[30]; 
 20   char pruebalfn[20]; 
 21  
 22   gotoxy(7,9);cout<<"digite un numero: "; 
 23   gotoxy(7,11);cout<<"Digite nombre: "; 
 24   gotoxy(7,13);cout<<"Cadena alfanumerica: "; 
 25   gotoxy(24,9);prueban=funcvalnum(5); 
 26   gotoxy(22,11);strcpy(pruebalf,funcvalet(30)); 
 27   gotoxy(28,13);strcpy(pruebalfn,funcvalfnume(7)); 
 28  
 29  
 30  
 31   cout<<endl<<endl<<pruebalfn;//<<prueban<<endl<<pruebalf<<endl<<pruebalfn; 
 32   getch(); 
 33 }///fin main 
 34  
 35  
 36  
 37  
 38 double funcvalnum (int tam) 
 39 { 
 40    /* funcvalnum 
 41      La siguiente funcion no es apta para todo publico puede contener 
 42      partes enredadas  se recomienda la supervicion de un adulto :-) 
 43    */ 
 44   char vnume[15], baux; 
 45   int pnume,posx,posy; 
 46   double numero; 
 47  
 48   posx=wherex(); posy=wherey(); 
 49  
 50   for(int i=0;i<tam;)///se llena el vector hasta donde debe ser no recibe + 
 51   {                  //caracteres de lo estipulado y hace la comparacion 
 52              //inmediatamente si es uan letra o numero 
 53  
 54     textbackground(1);///es igual q el crscr se mdoifican los colores 
 55     textcolor(4); 
 56     do{ 
 57     gotoxy(posx +i,posy);cout<<" "; 
 58        //gotoxy(3,18);clreol(); 
 59        gotoxy(posx +i,posy);baux=getche(); 
 60        pnume=(int) baux; 
 61     //cout<<endl<<pnume<<" "<<i; 
 62     //getch(); 
 63     }while ((i==0 && pnume==13) || (i!=0 && pnume==45));////por si me digitan un enter sin escribri nada 
 64  
 65      if( (pnume<48 || pnume>57) && (pnume!=13) && (pnume!=46 && pnume!=45)) 
 66      { 
 67       textcolor(7); 
 68       gotoxy(3,18);cout<<"[X] "; cprintf("Se ha digitado un caracter no valido"); 
 69       getch(); 
 70       gotoxy(posx +i,posy);cout<<" "; 
 71      } 
 72      else 
 73  
 74       if (pnume==13) 
 75     break; 
 76        else 
 77        { 
 78     vnume[i]=baux; 
 79     i++; 
 80        } 
 81  
 82   }//fin for 
 83       numero=atof(vnume); 
 84    return numero; 
 85  
 86 }//fin funcion que valida numeros 
 87  
 88  
 89 char  *funcvalet (int n) 
 90 { 
 91   char valfab[30], baux; 
 92   int pnume,posx,posy,comprobar; 
 93   double numero; 
 94  
 95   posx=wherex(); posy=wherey(); 
 96  
 97   for(int i=0;i<n;)///se llena el vector hasta donde debe ser no recibe + 
 98   {                  //caracteres de lo estipulado y hace la comparacion 
 99              //inmediatamente si es uan letra o numero 
100  
101     textbackground(1);///es igual q el crscr se mdoifican los colores 
102     textcolor(4); 
103     do{ 
104     gotoxy(3,18);delline(); 
105     gotoxy(posx +i,posy);baux=getche(); 
106     pnume=(int) baux; 
107  
108     }while((i==0 && pnume==13)|| (i==0 && pnume==32));////por si me digitan un enter sin escribri nada 
109  
110  
111     comprobar=isalpha(baux); 
112     if (comprobar==0 && pnume!=32 && pnume!=13) 
113     { 
114       textcolor(7); 
115       gotoxy(3,18);cout<<"[X] "; cprintf("Se ha digitado una caracter no valido"); 
116       getch(); 
117       gotoxy(posx +i,posy);cout<<" "; 
118     } 
119       else 
120     if(pnume==13) 
121     { 
122      break; 
123     } 
124      else 
125      { 
126       valfab[i]=baux; 
127       i++; 
128      } 
129  
130   }//fin for 
131    return valfab; 
132  
133 }///fin funcion q valida las letras 
134  
135 char  *funcvalfnume (int ampl)///porq tiene q se run puntero? 
136 { 
137  
138   char valfanu[30], baux; 
139   int pnume,posx,posy,comprobar; 
140   double numero; 
141  
142   posx=wherex(); posy=wherey(); 
143  
144   /*for(int j=0; j<ampl; j++)  ///por el probelma d eun solo digito 
145   valfanu[j]=' '; */ 
146  
147   for(int i=0;i<ampl;)///se llena el vector hasta donde debe ser no recibe + 
148   {                  //caracteres de lo estipulado y hace la comparacion 
149              //inmediatamente si es uan letra o numero 
150  
151     textbackground(1);///es igual q el crscr se mdoifican los colores 
152     textcolor(4); 
153     do{ 
154     gotoxy(3,18);delline(); 
155     gotoxy(posx +i,posy);baux=getche(); 
156     pnume=(int) baux; 
157  
158     }while((i==0 && pnume==13)|| (i==0 && pnume==32));////por si me digitan un enter sin escribri nada 
159  
160  
161     comprobar=isalnum(baux); 
162  
163        if(comprobar!=8 && comprobar!=2 && pnume!=32 && pnume!=13 && pnume!=46 && pnume!=35 && pnume!=64 && pnume!=45 && pnume!=95)//comprubea los caracteres (. # @ - _ ) 
164        { 
165  
166     textcolor(7); 
167     gotoxy(3,18);cout<<"[X] "; cprintf("Se ha digitado una caracter no valido"); 
168     getch(); 
169     gotoxy(posx +i,posy);cout<<" "; 
170  
171        } 
172     else 
173     if(pnume==13) 
174      { 
175       break; 
176      } 
177  
178      else 
179       { 
180        valfanu[i]=baux; 
181        i++; 
182       } 
183  }///fin for 
184  
185   return valfanu; 
186  
187 }///fin funcion valores alfanumericos

Una presentacion con algo de estilo matrix

Este es un codigo que hice como un año y medio y buscando me encontre con el dentro de mis archivos olvidados la verdad es muy simple, pero para los que solo comienzan les puede servir de guia.




& aqui el codigo:

  1 #include<iostream.h> 
  2 #include<conio.h> 
  3 #include<stdio.h> 
  4 #include<dos.h> 
  5 #include<time.h> 
  6  void  mipresentacion (int x, char letra); 
  7  void  apariencia(); 
  8  
  9 void main () 
 10 {///inicio main 
 11  //cargo la pariencia q esta dividida en dos funciones 
 12  apariencia(); 
 13  
 14  
 15  
 16     getch(); 
 17 }//fin main 
 18  
 19  void  apariencia() 
 20  { 
 21   //apariencia basica de la pantalla 
 22 textcolor(2); 
 23 textbackground(6); 
 24 clrscr(); 
 25  
 26   for(int i=3;i<=73;i++) 
 27   { 
 28    gotoxy(i,4);cout<<"Ÿ"; 
 29    gotoxy(i,45);cout<<"Ÿ"; 
 30     if (i<=44) 
 31     { 
 32       gotoxy(3,i+1);cout<<"Ÿ"; 
 33       gotoxy(73,i+1);cout<<"Ÿ"; 
 34     } 
 35    delay(20); 
 36  
 37   } 
 38      gotoxy(9,9);cout<<"Autor:"; 
 39      int x=30,z=1; char letra; 
 40      time_t rawtime; 
 41      time(&rawtime); 
 42  
 43      gotoxy(45,9); cout<<ctime(&rawtime); 
 44        ///for2 
 45        for(z;z<=16;z++) 
 46     { 
 47        if (z==1) 
 48        { 
 49          letra='F'; 
 50          mipresentacion(x,letra); 
 51        } 
 52        if (z==2) 
 53        { 
 54          letra='e'; 
 55          mipresentacion(x,letra); 
 56        } 
 57        if (z==3) 
 58        { 
 59          letra='l'; 
 60          mipresentacion(x,letra); 
 61        } 
 62        if (z==4) 
 63        { 
 64          letra='i'; 
 65          mipresentacion(x,letra); 
 66        } 
 67        if (z==5) 
 68        { 
 69          letra='x'; 
 70          mipresentacion(x,letra); 
 71        } 
 72  
 73        if (z==6 || z==10) 
 74        { 
 75          letra=' '; 
 76          mipresentacion(x,letra); 
 77        } 
 78  
 79        if (z==7 || z==8 || z==9) 
 80        { 
 81          letra='-'; 
 82          mipresentacion(x,letra); 
 83        } 
 84  
 85        if (z==11) 
 86        { 
 87          letra='C'; 
 88          mipresentacion(x,letra); 
 89        } 
 90        if (z==12) 
 91        { 
 92          letra='l'; 
 93          mipresentacion(x,letra); 
 94        } 
 95        if (z==13) 
 96        { 
 97          letra='i'; 
 98          mipresentacion(x,letra); 
 99        } 
100        if (z==14) 
101        { 
102          letra='p'; 
103          mipresentacion(x,letra); 
104        } 
105        if (z==15) 
106        { 
107          letra='t'; 
108          mipresentacion(x,letra); 
109        } 
110         if (z==16) 
111        { 
112          letra='o'; 
113          mipresentacion(x,letra); 
114        } 
115        x=x+1; 
116     }//fin for2 
117     gotoxy(25,35);cout<<"Espero sea de tu agrado!!! "; 
118     gotoxy(23,37);cout<<"& si no suerte para la proxima... "; 
119 ////fin aparienciabasica de la pantalla 
120  } 
121  
122  
123 void  mipresentacion(int x, char letra) 
124 { 
125   ///mi presentacion personal 
126     int i; 
127  
128      for(i=10;i<=25;i++) 
129        { 
130     gotoxy(x,i);cout<<letra; 
131     delay(30); 
132     if (i==25) 
133      { 
134          for(i=10;i<25;i++) 
135          { 
136           gotoxy(x,i);cout<<" "; 
137           delay(70); 
138          } 
139      } 
140        }//fin for 
141   //  }//fin si de diferente 
142  
143  
144  } 
145  
146