Advertisement
Guest User

4

a guest
Nov 22nd, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.64 KB | None | 0 0
  1. with Uppgiftb; use Uppgiftb;
  2. with Ada.Text_IO; use Ada.Text_IO;
  3.  
  4.  
  5. procedure Uppgifta is
  6. Date, Next, Prev : Date_Type;
  7. begin
  8. loop
  9. begin
  10. Get(Date);
  11. Put(Date);
  12. Next := Next_Date(Date);
  13. Put(Next);
  14. Prev := Previous_Date(Date);
  15. Put(Prev);
  16. exit;
  17. exception
  18. when Year_Error =>
  19. Put_Line("Year must be 0 or higher");
  20. Skip_Line;
  21. when Month_Error =>
  22. Put_Line("Month must be between 1 and 12");
  23. Skip_Line;
  24. when Day_Error =>
  25. Put_Line("Day must be between 1 and the amount of days in month");
  26. when others =>
  27. Put_Line("Error does not compute"); Skip_Line;
  28. end;
  29. end loop;
  30. end Uppgifta;
  31.  
  32.  
  33.  
  34. package body Uppgiftb is
  35.  
  36.  
  37. procedure Get(Date : out Date_Type) is
  38. C : Character;
  39.  
  40. begin
  41. Get(Date.Year);
  42. if Date.Year < 0 then
  43. raise Year_Error;
  44. end if;
  45. Get(C);
  46. Get(Date.Month);
  47. if Date.Month <= 0 or Date.Month > 12 then
  48. raise Month_Error;
  49. end if;
  50. Get(C);
  51. Get(Date.Day);
  52. if Date.Month = 2 and Date.Day > 28 then
  53. raise Day_Error;
  54. elsif Date.Day <= 0 or Date.Day > 31 then
  55. raise Day_Error;
  56. elsif Date.Month = 4 or Date.Month = 6 or Date.Month = 9 or Date.Month = 11 then
  57. if Date.Day > 30 then
  58. raise Day_Error;
  59. end if;
  60.  
  61. end if;
  62.  
  63.  
  64.  
  65. end Get;
  66.  
  67.  
  68. procedure Put(Date : in Date_Type) is
  69.  
  70. begin
  71. Put(Date.Year);
  72. Put("-");
  73. if Date.Month < 10 then
  74. Put("0");
  75. end if;
  76. Put(Date.Month, Width => 0);
  77. Put("-");
  78. if Date.Day < 10 then
  79. Put("0");
  80. end if;
  81. Put(Date.Day, Width => 0);
  82.  
  83.  
  84. end Put;
  85.  
  86.  
  87. procedure Next_Date(OG : in Date_Type; Date : out Date_Type) is
  88. begin
  89. Date := OG;
  90. if Date.Month = 2 then
  91. if Date.Day = 28 then
  92. Date.Day := 1;
  93. Date.Month := 3;
  94. else
  95. Date.Day := Date.Day + 1;
  96. end if;
  97.  
  98. elsif Date.Month = 4 or Date.Month = 6 or Date.Month = 9 or Date.Month = 11 then
  99. if Date.Day = 30 then
  100. Date.Day := 1;
  101. Date.Month := Date.Month + 1;
  102. else
  103. Date.Day := Date.Day +1;
  104. end if;
  105. else
  106. if Date.Day = 31 then
  107. Date.Day := 1;
  108. Date.Month := Date.Month + 1;
  109. else
  110. Date.Day := Date.Day + 1;
  111. end if;
  112. if Date.Month = 13 then
  113. Date.Month := 1;
  114. Date.Year := Date.Year +1;
  115. end if;
  116. end if;
  117.  
  118.  
  119. end Next_Date;
  120. procedure Previous_Date(OG : in Date_Type; Date : out Date_Type) is
  121.  
  122. begin
  123. Date := OG;
  124. if Date.Month = 3 then
  125. if Date.Day = 1 then
  126. Date.Day := 28;
  127. Date.Month := 2;
  128. else
  129. Date.Day := Date.Day - 1;
  130. end if;
  131.  
  132. elsif Date.Month = 5 or Date.Month = 7 or Date.Month = 10 or Date.Month = 12 then
  133. if Date.Day = 1 then
  134. Date.Day := 30;
  135. Date.Month := Date.Month - 1;
  136. else
  137. Date.Day := Date.Day - 1;
  138. end if;
  139. else
  140. if Date.Day = 1 then
  141. Date.Day := 31;
  142. Date.Month := Date.Month - 1;
  143. else
  144. Date.Day := Date.Day - 1;
  145. end if;
  146. if Date.Month = 0 then
  147. Date.Month := 12;
  148. Date.Year := Date.Year - 1;
  149. end if;
  150. end if;
  151.  
  152. end Previous_Date;
  153. function Next_Date(Date : in Date_Type) return Date_Type is
  154. Nxtdate : Date_Type;
  155. begin
  156. Next_Date(Date,Nxtdate);
  157. return Nxtdate;
  158. end Next_Date;
  159. function Previous_Date(Date : in Date_Type) return Date_Type is
  160. Predate : Date_Type;
  161. begin
  162. Previous_Date(Date,Predate);
  163. return Predate;
  164. end Previous_Date;
  165.  
  166. function "<"(Left, Right : in Date_Type) return Boolean is
  167.  
  168. begin
  169. if Left.Year = Right.Year then
  170. if Left.Month = Right.Month then
  171. if Left.Day < Right.Day then
  172. return True;
  173. else
  174. return False;
  175. end if;
  176. elsif Left.Month < Right.Month then
  177. return True;
  178. else
  179. return False;
  180.  
  181. end if;
  182. elsif Left.Year < Right.Year then
  183. return True;
  184. else
  185. return False;
  186. end if;
  187. end "<";
  188. function ">"(Left, Right : in Date_Type) return Boolean is
  189. begin
  190. return Right < Left;
  191. end ">";
  192. function "="(Left, Right : in Date_Type) return Boolean is
  193. begin
  194. return not( Left < Right) and not (Left > Right);
  195. end "=";
  196.  
  197. end Uppgiftb;
  198.  
  199. with Ada.Text_IO; use Ada.Text_IO;
  200. with Altpaket; use Altpaket;
  201. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
  202.  
  203.  
  204. procedure Uppgiftf is
  205.  
  206.  
  207.  
  208. Date1, Date2 : Date_Type;
  209. Count : Integer := 0;
  210. Efter: Boolean;
  211. begin
  212. Put("Mata in dagens datum: ");
  213. Get(Date1);
  214. Put("Mata in ett annat datum: ");
  215. Get(Date2);
  216. loop
  217. if Date2 > Date1 then
  218. Date1 := Next_Date(Date1);
  219. Count := Count + 1;
  220. if Date1 = Date2 then
  221. Efter := True;
  222. exit;
  223. end if;
  224. elsif Date2 < Date1 then
  225. Date1 := Previous_Date(Date1);
  226. Count := Count + 1;
  227. if Date1 = Date2 then
  228. Efter := False;
  229. exit;
  230. end if;
  231. end if;
  232. end loop;
  233. Put("Det andra datumet är ");
  234. Put(Count, Width => 0);
  235. if efter then
  236. Put(" dagar efter det första");
  237. else
  238. Put(" dagar innan det första");
  239. end if;
  240.  
  241.  
  242. end Uppgiftf;
  243.  
  244. package body Altpaket is
  245.  
  246.  
  247. procedure Get(Date : out Date_Type) is
  248. C : Character;
  249.  
  250. begin
  251. Get(Date(1));
  252. if Date(1) < 0 then
  253. raise Year_Error;
  254. end if;
  255. Get(C);
  256. Get(Date(2));
  257. if Date(2) <= 0 or Date(2) > 12 then
  258. raise Month_Error;
  259. end if;
  260. Get(C);
  261. Get(Date(3));
  262. if Date(2) = 2 and Date(3) > 28 then
  263. raise Day_Error;
  264. elsif Date(3) <= 0 or Date(3) > 31 then
  265. raise Day_Error;
  266. elsif Date(2) = 4 or Date(2) = 6 or Date(2) = 9 or Date(2) = 11 then
  267. if Date(3) > 30 then
  268. raise Day_Error;
  269. end if;
  270.  
  271. end if;
  272.  
  273.  
  274.  
  275. end Get;
  276.  
  277.  
  278. procedure Put(Date : in Date_Type) is
  279.  
  280. begin
  281. Put(Date(1));
  282. Put("-");
  283. if Date(2) < 10 then
  284. Put("0");
  285. end if;
  286. Put(Date(2), Width => 0);
  287. Put("-");
  288. if Date(3) < 10 then
  289. Put("0");
  290. end if;
  291. Put(Date(3), Width => 0);
  292.  
  293.  
  294. end Put;
  295.  
  296.  
  297. procedure Next_Date(OG : in Date_Type; Date : out Date_Type) is
  298. begin
  299. Date := OG;
  300. if Date(2) = 2 then
  301. if Date(3) = 28 then
  302. Date(3) := 1;
  303. Date(2) := 3;
  304. else
  305. Date(3) := Date(3) + 1;
  306. end if;
  307.  
  308. elsif Date(2) = 4 or Date(2) = 6 or Date(2) = 9 or Date(2) = 11 then
  309. if Date(3) = 30 then
  310. Date(3) := 1;
  311. Date(2) := Date(2) + 1;
  312. else
  313. Date(3) := Date(3) +1;
  314. end if;
  315. else
  316. if Date(3) = 31 then
  317. Date(3) := 1;
  318. Date(2) := Date(2) + 1;
  319. else
  320. Date(3) := Date(3) + 1;
  321. end if;
  322. if Date(2) = 13 then
  323. Date(2) := 1;
  324. Date(1) := Date(1) +1;
  325. end if;
  326. end if;
  327.  
  328.  
  329. end Next_Date;
  330. procedure Previous_Date(OG : in Date_Type; Date : out Date_Type) is
  331.  
  332. begin
  333. Date := OG;
  334. if Date(2) = 3 then
  335. if Date(3) = 1 then
  336. Date(3) := 28;
  337. Date(2) := 2;
  338. else
  339. Date(3) := Date(3) - 1;
  340. end if;
  341.  
  342. elsif Date(2) = 5 or Date(2) = 7 or Date(2) = 10 or Date(2) = 12 then
  343. if Date(3) = 1 then
  344. Date(3) := 30;
  345. Date(2) := Date(2) - 1;
  346. else
  347. Date(3) := Date(3) - 1;
  348. end if;
  349. else
  350. if Date(3) = 1 then
  351. Date(3) := 31;
  352. Date(2) := Date(2) - 1;
  353. else
  354. Date(3) := Date(3) - 1;
  355. end if;
  356. if Date(2) = 0 then
  357. Date(2) := 12;
  358. Date(1) := Date(1) - 1;
  359. end if;
  360. end if;
  361.  
  362. end Previous_Date;
  363. function Next_Date(Date : in Date_Type) return Date_Type is
  364. Nxtdate : Date_Type;
  365. begin
  366. Next_Date(Date,Nxtdate);
  367. return Nxtdate;
  368. end Next_Date;
  369. function Previous_Date(Date : in Date_Type) return Date_Type is
  370. Predate : Date_Type;
  371. begin
  372. Previous_Date(Date,Predate);
  373. return Predate;
  374. end Previous_Date;
  375.  
  376. function "<"(Left, Right : in Date_Type) return Boolean is
  377.  
  378. begin
  379. if Left(1) = Right(1) then
  380. if Left(2) = Right(2) then
  381. if Left(3) < Right(3) then
  382. return True;
  383. else
  384. return False;
  385. end if;
  386. elsif Left(2) < Right(2) then
  387. return True;
  388. else
  389. return False;
  390.  
  391. end if;
  392. elsif Left(1) < Right(1) then
  393. return True;
  394. else
  395. return False;
  396. end if;
  397. end "<";
  398. function ">"(Left, Right : in Date_Type) return Boolean is
  399. begin
  400. return Right < Left;
  401. end ">";
  402. function "="(Left, Right : in Date_Type) return Boolean is
  403. begin
  404. return not( Left < Right) and not (Left > Right);
  405. end "=";
  406.  
  407. end Altpaket;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement