Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.80 KB | None | 0 0
  1. program VendingABC;
  2. uses crt, sysutils;
  3.  
  4. CONST
  5. LONGCODIGO = 4; {longitud del código de usuario}
  6. LONGFECHA = 10; {longitud de la fecha}
  7. MAXUSUARIOS = 100; {número máximo de usuarios}
  8. MAXPRODUCTOS = 50; {número máximo de productos}
  9. MAXVENTAS = 120; {número máximo de ventas}
  10.  
  11. TYPE
  12. tCodigoTarjeta = string[LONGCODIGO];
  13. tFecha = string[LONGFECHA];
  14.  
  15. {tipo usuario}
  16. tUsuario = RECORD
  17. nombre: string;
  18. codigoTarjeta: tCodigoTarjeta;
  19. saldo: real;
  20. END;
  21.  
  22. {tipo lista de usuarios}
  23. tIndiceUsuarios = 1..MAXUSUARIOS;
  24. tListaUsuarios = ARRAY [tIndiceUsuarios] OF tUsuario;
  25.  
  26. {Array parcialmente lleno para usuarios}
  27. tUsuarios = RECORD
  28. usuarios: tListaUsuarios;
  29. tope: integer;
  30. END;
  31.  
  32. {tipo producto}
  33. tProducto = RECORD
  34. nombre, marca: string;
  35. precio : real;
  36. stock : integer;
  37. END;
  38.  
  39. {tipo lista de productos}
  40. tIndiceProductos = 1..MAXPRODUCTOS;
  41. tListaProductos = ARRAY [tIndiceProductos] OF tProducto;
  42.  
  43. {Array parcialmente lleno para productos}
  44. tProductos = RECORD
  45. productos : tListaProductos;
  46. tope : integer;
  47. END;
  48.  
  49. {Tipo venta}
  50. tVenta = RECORD
  51. nombreProducto : string;
  52. codigoTarjeta : tCodigoTarjeta;
  53. fecha : tFecha;
  54. END;
  55.  
  56. {Tipo lista de ventas}
  57. tIndiceVentas = 1..MAXVENTAS;
  58. tListaVentas = ARRAY [tIndiceVentas] OF TVenta;
  59.  
  60. { Array parcialmente lleno para ventas }
  61. tVentas = RECORD
  62. ventas : tListaVentas;
  63. tope : integer;
  64. END;
  65.  
  66. var i : byte;
  67. opcion: CHAR;
  68.  
  69. TablaUsuarios : tUsuarios;
  70. CodigoUsuario : tCodigoTarjeta;
  71. DatosUsuario : tUsuario;
  72. EncUsuario, encproducto : BOOLEAN;
  73.  
  74. TablaProductos : tProductos;
  75. DatosProducto : tProducto;
  76. NomProdAComprar : string;
  77.  
  78. TablaVentas : tVentas;
  79.  
  80. Recarga : real;
  81.  
  82.  
  83. PROCEDURE Acumular_Venta (VAR DatosUsuSubpro:tUsuario; VAR DatosProdSubpro:tProducto; VAR TablaSubpro:tVentas);
  84. VAR
  85. i : INTEGER;
  86. BEGIN
  87. TablaSubpro.tope := TablaSubpro.tope + 1;
  88. i:= TablaSubpro.tope;
  89. TablaSubpro.ventas[i].nombreProducto := DatosProdSubpro.nombre;
  90. TablaSubpro.ventas[i].codigoTarjeta := DatosUsuSubpro.codigoTarjeta;
  91. TablaSubpro.ventas[i].fecha := DateToStr(Date);
  92. END;
  93.  
  94. PROCEDURE Actualizar_Stock (VAR DatosProdSubpro:tProducto; VAR TablaSubpro:tProductos);
  95. VAR
  96. EncontradoProducto : BOOLEAN;
  97. i : INTEGER;
  98.  
  99. BEGIN
  100. EncontradoProducto := FALSE;
  101. i := 1;
  102. WHILE (NOT EncontradoProducto) AND (i <= TablaSubpro.tope) DO
  103. BEGIN
  104. IF TablaSubpro.productos[i].nombre = DatosProdSubpro.nombre THEN
  105. BEGIN
  106. EncontradoProducto := TRUE;
  107. TablaSubpro.productos[i].stock := DatosProdSubpro.stock;
  108. END;
  109. i := i + 1;
  110. END;
  111. END;
  112.  
  113. PROCEDURE Localizar_Producto (VAR NomProdSubpro:string; VAR TablaSubpro:tProductos; VAR DatosProdSubpro:tProducto;VAR EncPrdSubpro: BOOLEAN);
  114. VAR
  115. EncontradoProducto : BOOLEAN;
  116. i : INTEGER;
  117.  
  118. BEGIN
  119. EncontradoProducto := FALSE;
  120. i := 1;
  121. WHILE (NOT EncontradoProducto) AND (i <= TablaSubpro.tope) DO
  122. BEGIN
  123. IF TablaSubpro.productos[i].nombre = NomProdSubpro THEN
  124. BEGIN
  125. EncontradoProducto := TRUE;
  126. DatosProdSubpro.nombre := TablaSubpro.productos[i].nombre;
  127. DatosProdSubpro.marca := TablaSubpro.productos[i].marca;
  128. DatosProdSubpro.precio := TablaSubpro.productos[i].precio;
  129. DatosProdSubpro.stock := TablaSubpro.productos[i].stock;
  130. END;
  131. i := i + 1;
  132. END;
  133. EncPrdSubpro := EncontradoProducto;
  134. END;
  135.  
  136.  
  137. PROCEDURE Actualizar_Saldo_Usuario (VAR DatosUsuSubpro:tUsuario; VAR TablaSubpro:tUsuarios);
  138. VAR
  139. i : INTEGER;
  140. EncontradoUsuario : BOOLEAN;
  141.  
  142. BEGIN
  143. EncontradoUsuario := FALSE;
  144. i := 1;
  145. WHILE (NOT EncontradoUsuario) AND (i <= TablaSubpro.tope) DO
  146. BEGIN
  147. IF TablaSubpro.usuarios[i].codigoTarjeta = DatosUsuSubpro.codigoTarjeta THEN
  148. BEGIN
  149. EncontradoUsuario := TRUE;
  150. TablaSubpro.usuarios[i].saldo := DatosUsuSubpro.saldo;
  151. END;
  152. i := i + 1;
  153. END;
  154. END;
  155.  
  156.  
  157. PROCEDURE Localizar_Usuario (VAR CgoUsuSubpro:tCodigoTarjeta; VAR TablaSubpro:tUsuarios; VAR DatosUsuSubpro:tUsuario;VAR EncUsuSubpro: BOOLEAN);
  158. VAR
  159. EncontradoUsuario : BOOLEAN;
  160. i : INTEGER;
  161.  
  162. BEGIN
  163. EncontradoUsuario := FALSE;
  164. i := 1;
  165. WHILE (NOT EncontradoUsuario) AND (i <= TablaSubpro.tope) DO
  166. BEGIN
  167. IF TablaSubpro.usuarios[i].codigoTarjeta = CgoUsuSubpro THEN
  168. BEGIN
  169. EncontradoUsuario := TRUE;
  170. DatosUsuSubpro.nombre := TablaSubpro.usuarios[i].nombre;
  171. DatosUsuSubpro.codigoTarjeta := TablaSubpro.usuarios[i].codigoTarjeta;
  172. DatosUsuSubpro.saldo := TablaSubpro.usuarios[i].saldo;
  173. END;
  174. i := i + 1;
  175. END;
  176. EncUsuSubpro := EncontradoUsuario;
  177. END;
  178.  
  179. PROCEDURE Cargar_Usuarios (VAR TablaSubpro:tUsuarios);
  180. BEGIN
  181. TablaSubpro.usuarios[1].nombre := 'Juan';
  182. TablaSubpro.usuarios [1].codigoTarjeta := '1123';
  183. TablaSubpro.usuarios [1].saldo := 3.50;
  184. TablaSubpro.usuarios [2].nombre := 'Pepe';
  185. TablaSubpro.usuarios [2].codigoTarjeta := '0132';
  186. TablaSubpro.usuarios [2].saldo := 6.50;
  187. TablaSubpro.usuarios [3].nombre := 'Luis';
  188. TablaSubpro.usuarios [3].codigoTarjeta := '7843';
  189. TablaSubpro.usuarios [3].saldo := 1;
  190. TablaSubpro.usuarios [4].nombre := 'Eva';
  191. TablaSubpro.usuarios [4].codigoTarjeta := '2163';
  192. TablaSubpro.usuarios [4].saldo := 8.50;
  193. TablaSubpro.usuarios [5].nombre := 'Sonia';
  194. TablaSubpro.usuarios [5].codigoTarjeta := '9758';
  195. TablaSubpro.usuarios [5].saldo := 6.50;
  196. TablaSubpro.tope := 5;
  197. END;
  198.  
  199. PROCEDURE Mostrar_Usuarios (VAR TablaSubpro:tUsuarios);
  200. VAR
  201. i : INTEGER;
  202. BEGIN
  203. writeln ('LISTADO DE USUARIOS');
  204. FOR i := 1 TO TablaSubpro.tope DO
  205. BEGIN
  206. write ('NOMBRE: ', TablaSubpro.usuarios[i].nombre);
  207. write (' / ');
  208. write ('CODIGO TARJETA: ', TablaSubpro.usuarios[i].codigoTarjeta);
  209. write (' / ');
  210. writeln ('SALDO: ', TablaSubpro.usuarios[i].saldo:5:2);
  211. END;
  212. writeln ('FIN LISTADO DE USUARIOS');
  213. END;
  214.  
  215. PROCEDURE Mostrar_Ventas (VAR TablaSubpro:tVentas);
  216. VAR
  217. i : INTEGER;
  218. BEGIN
  219. writeln ('LISTADO DE VENTAS');
  220. FOR i := 1 TO TablaSubpro.tope DO
  221. BEGIN
  222. write ('NOMBRE PRODUCTO: ', TablaSubpro.ventas[i].nombreProducto, ' ');
  223. write ('CODIGO TARJETA: ', TablaSubpro.ventas[i].codigoTarjeta, ' ');
  224. writeln ('FECHA: ', TablaSubpro.ventas[i].fecha);
  225. END;
  226. writeln ('FIN LISTADO DE VENTAS');
  227. END;
  228.  
  229. PROCEDURE Mostrar_Productos (VAR TablaSubpro:tProductos);
  230. VAR
  231. i : INTEGER;
  232. BEGIN
  233. writeln ('LISTADO DE PRODUCTOS');
  234. FOR i := 1 TO TablaSubpro.tope DO
  235. BEGIN
  236. write ('NOMBRE: ', TablaSubpro.productos[i].nombre, ' ');
  237. write ('MARCA: ', TablaSubpro.productos[i].marca, ' ');
  238. write ('PRECIO: ', TablaSubpro.productos[i].precio:5:2, ' ');
  239. writeln ('STOCK: ', TablaSubpro.productos[i].stock);
  240. END;
  241. writeln ('FIN LISTADO DE PRODUCTOS');
  242. END;
  243.  
  244. PROCEDURE Mostrar_Productos_Disponibles (VAR TablaSubpro:tProductos);
  245. VAR
  246. i : INTEGER;
  247. BEGIN
  248. writeln ('LISTADO DE PRODUCTOS DISPONIBLES');
  249. FOR i := 1 TO TablaSubpro.tope DO
  250. BEGIN
  251. IF TablaSubpro.productos[i].stock > 0 THEN
  252. write ('NOMBRE: ', TablaSubpro.productos[i].nombre, ' ');
  253. write ('MARCA: ', TablaSubpro.productos[i].marca, ' ');
  254. writeln ('PRECIO: ', TablaSubpro.productos[i].precio:5:2, ' ');
  255. END;
  256. writeln ('FIN LISTADO DE PRODUCTOS DISPONIBLES');
  257. END;
  258.  
  259. PROCEDURE Cargar_Productos (VAR TablaSubpro:tProductos);
  260. BEGIN
  261. TablaSubpro.productos[1].nombre := 'Fanta Naranja';
  262. TablaSubpro.productos[1].marca := 'Coca Cola';
  263. TablaSubpro.productos[1].precio := 1.50;
  264. TablaSubpro.productos[1].stock := 30;
  265. TablaSubpro.productos[2].nombre := 'Fanta Limon';
  266. TablaSubpro.productos[2].marca := 'Coca Cola';
  267. TablaSubpro.productos[2].precio := 1.50;
  268. TablaSubpro.productos[2].stock := 25;
  269. TablaSubpro.productos[3].nombre := 'Patatas Fritas';
  270. TablaSubpro.productos[3].marca := 'Matutano';
  271. TablaSubpro.productos[3].precio := 1;
  272. TablaSubpro.productos[3].stock := 15;
  273. TablaSubpro.productos[4].nombre := 'Kikos';
  274. TablaSubpro.productos[4].marca := 'Churruca';
  275. TablaSubpro.productos[4].precio := 0.70;
  276. TablaSubpro.productos[4].stock := 2;
  277. TablaSubpro.productos[5].nombre := 'Galletas chocolate';
  278. TablaSubpro.productos[5].marca := 'Principe';
  279. TablaSubpro.productos[5].precio := 1.25;
  280. TablaSubpro.productos[5].stock := 5;
  281. TablaSubpro.productos[6].nombre := 'Batido';
  282. TablaSubpro.productos[6].marca := 'Cacaolat';
  283. TablaSubpro.productos[6].precio := 1.25;
  284. TablaSubpro.productos[6].stock := 7;
  285. TablaSubpro.tope := 6;
  286. END;
  287.  
  288. BEGIN
  289. Writeln(Format ('Today is: %s',[DateToStr(Date)]));
  290. opcion := ' ';
  291. writeln ('**********************************************************************');
  292. WHILE (opcion <> 'h') DO
  293. BEGIN
  294. writeln (' ');
  295. writeln ('******************** MENU *********************');
  296. writeln ('a.- Cargar lista de usuarios');
  297. writeln ('b.- Mostrar lista de usuarios');
  298. writeln ('d.- Cargar lista de productos');
  299. writeln ('e.- Mostrar lista de productos');
  300. writeln ('c.- COMPRAR');
  301. writeln ('f.- Mostrar ventas');
  302. writeln ('g.- RECARGAR TARJETA');
  303. writeln ('h.- Finalizar');
  304. writeln ('******************** MENU *********************');
  305. writeln ('Introduce una opcion del menu:');
  306. readln (opcion);
  307. CASE opcion OF
  308. 'a':
  309. BEGIN
  310. WRITELN ('HAS ELEGIDO LA OPCION a');
  311. Cargar_Usuarios (TablaUsuarios);
  312. writeln ('Carga de usuarios realizada');
  313. END;
  314. 'b':
  315. BEGIN
  316. WRITELN ('HAS ELEGIDO LA OPCION b');
  317. Mostrar_Usuarios (TablaUsuarios);
  318. END;
  319. 'c':
  320. BEGIN
  321. WRITELN ('HAS ELEGIDO LA OPCION c');
  322. { Primero pedimos el codigo de la tarjeta simulando que el cliente la pasa por la maquina }
  323. { Y localizamos el cliente para ver si tiene saldo }
  324. writeln ('Introduce el código de tu tarjeta: ');
  325. readln (CodigoUsuario);
  326. Localizar_Usuario (CodigoUsuario, TablaUsuarios, DatosUsuario, EncUsuario);
  327. writeln ('-------------------------------------------------------');
  328. IF EncUsuario THEN
  329. BEGIN
  330. writeln ('Bienvenido/a ', DatosUsuario.nombre);
  331. writeln ('Su saldo acumulado es de ', DatosUsuario.saldo:5:2);
  332. writeln ('-------------------------------------------------------');
  333. { Ahora mostramos todos los productos que la maquina puede ofrecer al usuario }
  334. writeln (' ');
  335. Mostrar_Productos_Disponibles (TablaProductos);
  336. { Ahora se pide al usuario el nombre del producto que quiere comprar }
  337. EncProducto := FALSE;
  338. REPEAT
  339. writeln ('Teclee el nombre del producto a comprar:');
  340. readln (NomProdAComprar);
  341. Localizar_Producto (NomProdAComprar, TablaProductos,DatosProducto,EncProducto);
  342. IF NOT EncProducto THEN
  343. BEGIN
  344. writeln ('No hay ningún producto con ese nombre');
  345. END
  346. UNTIL
  347. EncProducto;
  348. { Ya se ha encontrado el producto }
  349. writeln ('Compraras ', DatosProducto.nombre, ' ', DatosProducto.marca, ' ');
  350. { Se comprueba si el usuario tiene saldo }
  351. IF DatosUsuario.saldo >= DatosProducto.precio THEN
  352. BEGIN
  353. writeln ('Se te descontará del saldo de tu tarjeta ', DatosProducto.precio:5:2);
  354. { Se actualiza el saldo de la tarjeta del usuario }
  355. DatosUsuario.saldo := DatosUsuario.saldo - DatosProducto.precio;
  356. { Ahora se llama al PROC que actualiza el array con el nuevo saldo }
  357. Actualizar_Saldo_Usuario (DatosUsuario, TablaUsuarios);
  358. { Se resta 1 al stock del producto }
  359. DatosProducto.stock := DatosProducto.stock - 1;
  360. { Ahora se llama al PROC que actualiza el array con el nuevo stock }
  361. Actualizar_Stock (DatosProducto, TablaProductos);
  362. { Ahora se llama al PROC que actualiza el array de Ventas con la nueva venta realizada }
  363. Acumular_Venta (DatosUsuario, DatosProducto, TablaVentas);
  364. END
  365. ELSE
  366. BEGIN
  367. writeln (' No tiene saldo para dicha compra ');
  368. END;
  369. END
  370. ELSE
  371. BEGIN
  372. writeln ('Lo siento, pero no he podido leer el código de su tarjeta');
  373. writeln ('Por favor, asegurese de que la tarjeta esta en buen estado');
  374. END;
  375.  
  376.  
  377. END;
  378. 'd':
  379. BEGIN
  380. WRITELN ('HAS ELEGIDO LA OPCION d');
  381. Cargar_Productos (TablaProductos);
  382. writeln ('Carga de productos realizada');
  383. END;
  384. 'e':
  385. BEGIN
  386. WRITELN ('HAS ELEGIDO LA OPCION e');
  387. Mostrar_Productos (TablaProductos);
  388. END;
  389. 'f':
  390. BEGIN
  391. WRITELN ('HAS ELEGIDO LA OPCION f');
  392. Mostrar_Ventas (TablaVentas);
  393. END;
  394. 'g':
  395. BEGIN
  396. WRITELN ('HAS ELEGIDO LA OPCION f');
  397. { Primero pedimos el codigo de la tarjeta simulando que el cliente la pasa por la maquina }
  398. { Y localizamos el cliente para recargar su saldo }
  399. writeln ('Introduce el código de tu tarjeta: ');
  400. readln (CodigoUsuario);
  401. Localizar_Usuario (CodigoUsuario, TablaUsuarios, DatosUsuario, EncUsuario);
  402. writeln ('-------------------------------------------------------');
  403. IF EncUsuario THEN
  404. BEGIN
  405. writeln ('Bienvenido/a ', DatosUsuario.nombre);
  406. writeln ('Su saldo acumulado es de ', DatosUsuario.saldo:5:2);
  407. writeln ('-------------------------------------------------------');
  408. writeln ('Introduce el dinero a recargar: ');
  409. readln (Recarga);
  410. { Se actualiza el saldo de la tarjeta del usuario }
  411. DatosUsuario.saldo := DatosUsuario.saldo + Recarga;
  412. { Ahora se llama al PROC que actualiza el array con el nuevo saldo }
  413. Actualizar_Saldo_Usuario (DatosUsuario, TablaUsuarios);
  414. writeln ('Su nuevo saldo es: ', DatosUsuario.saldo:5:2)
  415. END
  416. ELSE
  417. BEGIN
  418. writeln ('Lo siento, pero no he podido leer el código de su tarjeta');
  419. writeln ('Por favor, asegurese de que la tarjeta esta en buen estado');
  420. END;
  421. END;
  422. 'h':
  423. BEGIN
  424. WRITELN ('HAS ELEGIDO LA OPCION h');
  425. WRITELN ('FIN DEL PROGRAMA');
  426. END;
  427. ELSE
  428. WRITELN ('HAS ELEGIDO UNA OPCION ERRONEA');
  429. END
  430. END;
  431. WRITELN ('FIN DEL PROGRAMA');
  432. END.
  433.  
  434. END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement