Sei sulla pagina 1di 28

Task 1: Teach yourself about COBOL Week 1

Start date: 16 December 2013 Due date: 20 December 2013

Environment:
1. OS: Windows 2. Tools: Visual COBOL for Visual Studio 2010

Learning content:
1. What is COBOL? 2. COBOL basics a. COBOL syntax b. Name construction c. The structure of COBOL programs 3. The Four Divisions 4. Categories of COBOL data a. Variables b. Literals c. Figurative Constants 5. Declaring Data-Items in COBOL 6. Group and Elementary data-items 7. Basic User Input and Output a. DISPLAY verb b. ACCEPT verb 8. Assignment using the MOVE verb 9. Arithmetic in COBOL 10. COBOL Selection Constructs 11. Iteration In COBOL 12. Declaring records and files 13. COBOL file handling verbs 14. Processing unordered Sequential Files 15. Processing ordered Sequential Files 16. Edited Pictures 17. The USAGE clause 18. Print files and variable-length records 19. Sorting and Merging Required documents: 1. A word document contains all subjects in learning content. 2. Demo programs

1. What is COBOL? COBOL is a programming language especially aimed at solving business problems. COBOL is an acronym for Common Business Oriented Language. 2. COBOL basics a. COBOL syntax COBOL syntax is defined using particular notation sometimes called the COBOL MetaLanguage. b. Name construction - contain 1..30 characters. - contain at least 1 alphabetic character. - must not begin/end with a hyphen -. - use any A..Z, 0..9 and -. - must not contain spaces. - not case sensitive: TotalAmount ~ totalamount ~ Totalamount ~ TOTALAMOUNT c. The structure of COBOL programs COBOL programs are hierarchical in structure. It consists of Divisions, Sections, Paragraphs, Sentences and Statements.

A Division may contain one or more Sections, a Section one or more Paragraphs, a Paragraph one or more Sentences and a Sentence one or more Statements.

3. The Four Divisions IDENTIFICATION DIVISION. Contains program information ENVIRONMENT DIVISION. Contains environment information DATA DIVISION. Contains data descriptions PROCEDURE DIVISION. Contains the program algorithms The IDENTIFICATION DIVISION has the following structure: IDENTIFICATION DIVISION PROGRAM-ID. NameOfProgram. [AUTHOR. YourName.]

The DATA DIVISION has the following structure and syntax:

4.

Categories of COBOL data a. Variables: - is a named location in memory into which a program can put data and from which it can retrieve data. - must be described in the DATA DIVISION. - has only three data types: numeric (PIC 9), alphanumeric (PIC X), alphabetic (PIC A) b. Literals - is a constant data-item - are two types: String/Alphanumeric (ex: -123.45), numeric (ex: -123.45) c. Figurative Constants - a set of special constants. - are: SPACE/SPACES, ZERO/ZEROS, HIGH-VALUE, LOW-VALUE, ALL

5.

Declaring Data-Items in COBOL

In COBOL, a variable declaration consists of a line in the DATA DIVISION that contains the following items:

A level number. A data-name or identifier. A Picture clause.

To create the required 'picture' the programmer uses a set of symbols. The most common symbols used in standard picture clauses are:
9 X A The digit nine is used to indicate the occurrence of a digit at the corresponding position in the picture. The character X is used to indicate the occurrence of any character from the character set at the corresponding position in the picture. The character A is used to indicate the occurrence of any alphabetic character (A to Z plus blank) at the corresponding position in the picture. The character V is used to indicate the position of the decimal point in a numeric value. It is often referred to as the "assumed decimal point". It is called that because, although the actual decimal point is not stored, values are treated as if they had a decimal point in that position.

The character S indicates the presence of a sign and can only appear at the beginning of a picture.

Example: PIC 9(6) ~ PIC 999999 PIC X(10) ~ PIC XXXXXXXXXX PIC S9(4)V9(4) ~ PIC S9999V9999 6. Group and Elementary data-items

- Element item is the name we use to describle a data-item that has not been further subdivided. An elementary item consists of: a level number, a data name, a picture clause Ex: 01 01 EmpNm Age PIC X(30) VALUE SPACES. PIC 9(2)

- Group item is a collection of elementary items as a single group. Ex: group DateOfBirth has data-items: DayOfBirth, MonthOfBirth, YearOfBirth. 01 DateOfBirth. 02 02 02 DayOfBirth PIC 9(2).

MonthOfBirth PIC 9(2). YearOfBirth PIC 9(4).

=> DateOfBirth is 8 characters in size 2+2+4. 7. Basic User Input and Output a. DISPLAY verb The DISPLAY verb is used to send output to the computer screen.

Ex: DISPLAY Hello UserName. DISPLAY MSSV SPACE Name SPACE Age b. ACCEPT verb The ACCEPT verb is used to get data from keyboard or certain system variables.

ACCEPT DATE [YYYYMMDD] ACCEPT DAY [YYYYDDD] 8. Assignment using the MOVE verb

MOVE Source$#il TO Destination$#i ... The MOVE copies data from source identifier or literal to one or more destination identifiers. Ex: MOVE 12 TO THE-NUMBER. MOVE TEMP TO TOTAL. MOVE HELLO TO 6-BYTES 5-BYTES 4-BYTES 3-BYTES 2-BYTES 1-BYTES MOVE rules: - The source and destination identifiers can be group or elementary data-items. - If the number of characters in the source data-item is less than the number in the destination item, the rest of destination item is filled with zeros or spaces. - If the source data-item is larger than the destination item, the characters that cannot fit into the destination item will be lost. (truncation). - When the destination item is (PIC X or A), data copied into the destination area from LEFT to RIGHT with SPACE filling or TRUNCATION on the right. - When the destination item is numeric, data is aligned along the decimal point with ZERO filling or TRUNCATION as necessary. - When the decimal point is not explicitly specified in either the source or destination items, the item is treated as if it had an assumed decimal point immediately after its rightmost character. Ex: 01 GROSSSAL
MOVE MOVE MOVE MOVE

PIC 9(4)V99

VALUE 1234.56.
=> => => => 0012.40 0123.45 3456.78 0000.00

12.4 TO GROSSSAL. 123.456 TO GROSSSAL. 123456.789 TO GROSSSAL. ZEROS TO GROSSSAL.

MOVE 12345678 TO GROSSSAL.

=> 5678.00

9.

Arithmetic in COBOL

- ROUNDED:
ROUNDED

examples Rounded Result 123.4 123.4 123

Receiving Field PIC 9(3)V9 PIC 9(3)V9 PIC 9(3)

Actual Result 123.45 123.456 123.45

Truncated Result 123.4 123.4 123

- ON SIZE ERROR: when a computation is performed it is possible for the result to be too large or too small to be contained in the receiving field. => wull be truncation of the result. Note: Division by 0 always causes a SIZE ERROR.

Receiving Field PIC 9(3)V9 PIC 9(3)V9 PIC 9(3) PIC 9(3) PIC 9(3)V9 not Rounded PIC 9(3)V9 Rounded PIC 9(3)V9 Rounded
- ADD:

Actual Result 123.45 1234.5 123 1234 123.45 123.45 1234.56

Truncated Result 123.4 234.5 123 234 123.4 123.4 234.5

Size Error?
YES YES NO YES YES NO YES

Ex: ADD

CASH, BONUS TO

TO BONUS

TOTAL. GIVING TOTAL.

~ ADD CASH - SUBTRACT:

Ex:

SUBSTRACT Tax FROM GrossPay, TOTAL.

=> GrossPay = GrossPay-Tax, TOTAL=TOTAL-Tax SUBTRACT Tax, Bonus, Cost FROM TOTAL. => TOTAL=TOTAL-Tax-Bonus-Cost SUBTRACT A FROM B GIVING C => C=B-A - MULTIPLY:

Ex:

MULTIPLY 10 BY A, B.

=> A=A*10, B=B*10 MULTIPLY VatRate BY Sales GIVING Vat => Vat=VatRate*Sales - DIVIDE: Format1

Ex:

DIVIDE Qty BY Unit GIVING Avg ROUNDED.

=> Avg=ROUNDED(Qty/Unit) Format2: add REMAINDER

Ex:

DIVIDE 215 BY 10 GIVING ketqua REMAINDER rem

=> ketqua=ROUNDED(215/10)=21, rem = 5 - COMPUTE: assigns the result of an arithmetic expression to a data-item.

Precedence 1. 2.

Symbol ** * /

Meaning Power multiply divide add subtract

3.

+ -

Ex: 10. - IF: + syntax:

COMPUTE Dolas ROUNDED = 90-7*3+50/2 COBOL Selection Constructs

IF Condition is true, the StatementBlock following THEN is executed. IF Condition if false, the StatementBlock following ELSE is executed. The scope of the IF statement may be delimited by a full-stop (the old way) or by the END-IF (the new way), the END-IF delimiter should always be used. + Condition Types:

Condition Types

Simple Conditions o Relation Conditions o Class Conditions

o Sign Conditions Complex Conditions Condition Name

+ Relation Conditions:

Ex: IF nam IS EQUAL TO 1234 THEN (this evaluated condition is false) + Class Conditions:

A Class Condition may be used to determine whether the value of data-item is a member of one these classes. Ex: IF inputChar IS ALPHABETIC-LOWER MOVE FUNCTION UPPER(inputChar) TO InputChar END-IF + Sign Condition:

The Sign Condition determines whether or not the value of an arithmetic expression is less than, greater than or equal to zero. + Complex Conditions:

Complex Conditions are formed by combining two or more single conditions using the conjunction operators OR or AND.

Precedence Condition Value 1. 2. 3.


Ex: IF Row>0 AND Row<26 THEN DISPLAY On screen END-IF + Implied Subjects: Ex: IF Row > 0 AND < 26 THEN IF Grade = A OR B OR C OR D IF VarA > VarB AND VarC AND VarD DISPLAY VarA is the Greatest + Nested Ifs: Ex: IF ( VarA < 10 ) AND ( VarB NOT > VarC ) THEN IF VarD = 14 THEN DISPLAY First ELSE DISPLAY Second END-IF ELSE
NOT AND OR

Arithmetic Equivalent ** * or / + or -

=> the implied subjects is Row => the implied subjects is Grade= => the implied subjects is VarA>

DISPLAY Third END-IF + Condition Names (Level 88) Condition Names are defined in the DATA DIVISION using the special level 88. A Condition Name is a name given to a specified subset of the values which its associated data-item can hold.

Ex: 02 AgeInYears 88 Child

PIC 9(2). VALUE 0 THRU 12.

88 Teenage VALUE 13 THRU 19. 88 Adult VALUE 20 THRU 99.

+ SET verb with Condition Names: SET { ConditionName} TO TRUE Using SET verb with Sequential Files. + EVALUATE verb: (CASE/ SWITCH)

Ex:

QtyOfBooks 1-5 6-16 >16


EVALUATE Qty WHEN 1 THRU 5 WHEN 6 THRU 16 WHEN 17 THRU 99 END-EVALUATE

ValueOfPurchases (VOP) $0-500 $0-500 $0-500

ClubMember Y Y Y

% Discount 2% 3% 5%

ALSO TRUE ALSO VOP < 501 ALSO VOP < 501 ALSO VOP < 501

ALSO ALSO ALSO ALSO

Member "Y" MOVE 2 "Y" MOVE 3 "Y" MOVE 5

TO Discount TO Discount TO Discount

11. Iteration In COBOL

Iteration constructs and their COBOL equivalents C do{}while while for COBOL Perform Until ..With Test After Perform Until ..With Test Before Perform ..Varying

a. PERFORM proc

b. PERFORM .. TIMES

Ex: PERFORM 3 TIMES DISPLAY ">>>>This is an in line Perform" END-PERFORM

c. PERFORM .. UNTIL this format of the PERFORM is used where the WHILE or DO/REPEAT constructs are used in other languages.

If used WITH TEST BEFORE => while loop If used WITH TEST AFTER => do/repeat loop

d. PERFORM .. VARYING It is similar to the For loop in C, Pascal language.

Ex: With one counter: PERFORM VARYING I FROM 1 BY 1 UNTIL I = 3 DISPLAY I END-PERFORM With two counters: PERFORM VARYING I FROM 1 BY 3 UNTIL I=7 AFTER J FROM 6 BY -1 UNTIL J<5 DISPLAY I SPACE J END-PERFORM 12. Declaring records and files - A Record in COBOL is a method of combining serveral variables into one larger variable.
Ex: 01 StudentRec. 02 StudentId 02 StudentName. 03 Surname 03 Initials 02 DateOfBirth. 03 YOBirth 03 MOBirth 03 DOBirth 02 CourseCode 02 Gender

PIC 9(7). PIC X(8). PIC XX. PIC PIC PIC PIC PIC 9(4). 99. 99. X(4). X.

- Declare a record buffer: DATA DIVISION. FILE SECTION. FD StudentFile. (FD: file description + an internal name assigns to the file) - A File is a collection of related units of information within a data category. - SELECT and ASSIGN:

The SELECT and ASSIGN clause allows us to assign a meaningful name to an actual file on a storage device. Ex: ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT StudentFile ASSIGN TO Students.dat or C:\Cobol\Students.dat 13. COBOL file handling verbs - Sequential files are uncomplicated. You need to know 4 verbs: the OPEN, CLOSE, READ and WRITE. - You must ensure that your program closes all the files it has opened. a. The OPEN verb

=> intend to use file When a file is opened for INPUT, the Next Record Pointer is positioned at the beginning of the file. When the file is opened for EXTEND, the Next Record Pointer is positioned after the last record in the file. This allows records to be appended to the file. When a file is opened for OUTPUT, it is created if it does not exist, and is overwritten, if it already exists. b. The CLOSE verb CLOSE InternalFileName... c. The READ verb

To process all the records in the file. The READ copies a record instance from the file and places it in the record buffer. Ex:
PERFORM UNTIL EndOfStudentFile DISPLAY MSSV SPACE HoTen SPACE MaMH READ StudentFile AT END SET EndOfStudentFile TO TRUE END-READ END-PERFORM

d. The WRITE verb: WRITE RecordName [FROM Identifier] The WRITE verb is used to copy data from the record buffer (RAM) to the file on backing storage. Ex:
PERFORM GetStudentRecord PERFORM UNTIL StudentRec = SPACES WRITE StudentRec PERFORM GetStudentRecord END-PERFORM CLOSE StudentFile

14. Processing unordered Sequential Files - It is easy to add records to unordered Sequential file because we can simply add them to the end of the file by opening the file for EXTEND. => append to the end of file. But it is not really possible to delete or update records in an unordered Sequential file. - The only way to delete records is to create a new file which does not contain them. - The only way to update records is to create a new file which contains the updated records. => Two operations rely on record matching. - Record matching: when delete or update transaction records to a master file, we compare the key field in the transaction record with that in the master file record. If there is a match,we know we have to update or delete the master file record. 15. Processing Ordered Sequential Files - An ordered sequential file is a file ordered upon some key field. It possible to process batch updates or deletes to an ordered files. - To add records to an ordered file: record must be inserted into the correct position. It cant add to the end of the file. We have to create a new file that contains the inserted records.
PERFORM UNTIL EndTF AND EndMF IF TFKey < MFKey

MOVE TFRec TO NFRec WRITE NFRec READ TF etc. ELSE IF TFKey > MFKey MOVE MFRec TO NFRec WRITE NFRec READ MF etc. END-IF END-IF END-PERFORM

16. Edited Pictures - Edited Pictures are PICTURE clauses that format data intended for output to screen or printer. - Ex:

Original value With commas inserted Plus zero suppression Plus floating currency symbol With anti-fraud printing
- Types of editing picture: 2 basic types

00023456.78 00,023,456.78 23,456.78 $23,456.78 $***23,456.78

+ Insertion Editing: simple, special, fixed, floating insertion. + Suppression and Replacement Editing: Zero suppression and replacement with spaces/asterisks. - Editing symbols:

Edit Symbol ,B0/ . + - CR DB $ +-$ Z*

Editing Type Simple Insertion Special Insertion Fixed Insertion Floating Insertion Suppression and Replacement

+ Simple Insertion: insert , B 0 / at the character positon where the symbol occurs Ex: Sending PIC 9(6) VALUE 001219

Receiving

PIC 9(3),9(3) => 001,219 (Comma symbol ,) PIC Z(3),Z(3) => ss1,219 (space symbol B) PIC ***,*** => **1,219 (Comma symbol ,) PIC 99B99B99 => 00s12s19 (space symbol B) PIC 99/99/99 => 00/12/19 (splash symbol /) PIC 990099 => 120019 (zero symbol 0)

+ Special insertion: A decimal point is inserted in the character position where symbol occurs. Ex: Sending PIC 999V99 VALUE 12345 => PIC 999.99 VALUE 123.45 => PIC 999.9 VALUE 123.4 => PIC 99.99 VALUE 23.45 + Fixed insertion: inserts the symbol at the beginning or end of the edited item. Ex: Sending PIC S999 VALUE -123 => PIC -999 VALUE -123 => PIC 999- VALUE 123=> PIC +9(3) VALUE -123 => PIC 999+ VALUE 123=> PIC 9(3)CR VALUE 123CR => PIC 9(3)DB VALUE 123DB => PIC $9(4) VALUE $-123 PIC S9(3) VALUE +123 => PIC 9(3)CR VALUE 123ss => PIC -9(3) VALUE s123 => PIC 9(4)DB VALUE 123ss => PIC $9999 VALUE $0123 => PIC $ZZZZ VALUE $s123 + Floating Insertion: suppresses leading zeros and floats the insertion symbol up against the first non-zero digit. Ex: PIC 9(4) VALUE 0123 PIC 9(5) VALUE 12345 => PIC $$,$$9.99 VALUE ss$123.00 => PIC $$,$$9 VALUE $2,345

PIC S9(4) VALUE -0005 => PIC ++++9 VALUE sss-5 PIC S9(4) VALUE -0050 => PIC ----9 VALUE sss-50 PIC S9(4) VALUE +0050 => PIC ++++9 VALUE sss+50 + Suppression and Replacement Editing: remove leading zeroes from the value to be edited. Note: character Z replace 0 => a space, * replace 0 => * Ex: PIC 9(5) VALUE 12345 => PIC ZZ,999 VALUE 12,345 PIC 9(5) VALUE 01234 => PIC ZZ,999 VALUE s1,234; PIC **,**9 VALUE *1,234 PIC 9(5) VALUE 00123 => PIC ZZ,999 VALUE sss123; PIC **,**9 VALUE ***123 PIC 9(5) VALUE 00012 => PIC ZZ,999 VALUE sss012; PIC **,**9 VALUE ****12 PIC 9(5)V99 VALUE 00012.34 => PIC $**,**9.99 VALUE $****12.34

17. The USAGE clause - The USAGE clause is used to specify how a data item is to be stored in the computers memory. When there is no explicit USAGE clause, the default USAGE IS DISPLAY is applied. - Syntax:

USAGE notes

The USAGE clause may be used with any data description entry except those with level numbers of 66 or 88. When the USAGE clause is declared for a group item, the usage specified is applied to every item in the group. The group item itself is still treated as an alphanumeric data-item. USAGE IS COMPUTATIONAL or COMP or BINARY are synonyms of one another. The USAGE IS INDEX clause is used to provide an optimized table subscript.

USAGE rules 1. Any item declared with USAGE IS INDEX can only appear in: - A SEARCH or SET statement

- A relation condition - The USING phrase of the PROCEDURE DIVISION - The USING phrase of the CALL statement 2. The picture string of a COMP or PACKED-DECIMAL item can contain only the symbols 9, S, V and/or P. 3. The picture clause used for COMP or PACKED-DECIMAL items must be numeric.
Ex: 01 Num1 PIC 9(5)V99 USAGE IS COMP. 01 Num2 PIC 99 USAGE IS PACKED-DECIMAL. 01 IdxItem USAGE IS INDEX. 01 GroupItems USAGE IS COMP. 02 Item1 PIC 999. 02 Item2 PIC 9(4)V99. 02 New1 PIC S9(5) COMP SYNC. 01 Group2. 02 NumItem1 PIC 9(3)V99 USAGE IS COMP. 02 NumItem2 PIC 99V99 USAGE IS COMP.

Number of Digits Storage Required. PIC 9(1 to 4) 1 Word (2 Bytes) PIC 9(5 to 9) 1 LongWord (4 Bytes) PIC 9(10 to 18) 1QuadWord (8 Bytes)
Packed-decimal:

18. Print files and variable-length records a) Print files: COBOL allows programmers to write to the printer, either directly or through an intermediate print file. + Setting up a print file: print file can assign directly to a printer or to a file.

+ Declaring print lines: A report is made up of groups of printed lines of different types. There may be heading lines (top), detail lines (main information), footing lines (bottom). When we setup a print file, we create an FD for the file and a print record for each type of print line. + Ex: print a Student Details Report which shows the StudentName, StudentId, Gender and CourseCode of each student in the students file. * two Page Heading lines: 01 Heading1. 02 FILLER 02 FILLER 01 Heading2. 02 FILLER 02 FILLER PIC X(21) VALUE StudentId StudentName. PIC X(14) VALUE Gender Course. PIC X(7) VALUE SPACES. PIC X(25) VALUE STUDENT DETAILS REPORT.

* a Detail Line to print the student details: 01 StudentDetailLine. 02 PrnStudId PIC B9(7)BB.

02 PrnStudNm PIC X(10). 02 PrnGender PIC BBBBX. 02 PrnCourse * a Page Footing line: 01 FageFooting. PIC BBBBX(4).

02 FILLER 02 FILLER 02 PageNum * a Report Footing line: 01 ReportFooting

PIC X(19) VALUES SPACES. PIC X(7) VALUE Page : . PIC Z9.

PIC X(38) VALUE End of Student Detail Reports.

+ Setting up a print file: the print line records are declared in the WORKING-STORAGE SECTION and in the FILE SECTION arecord the size of the largest print-line record is declared in the files FD entry.

+ The WRITE syntax:

WRITE notes The ADVANCING clause is used to position the lines on the page when writing to a print file or a printer. The PAGE option writes a form feed to the print file or printer. When writing to print files the WRITE..FROM option is generally used because the print records are described in the Working Storage Section .

b) Variable length records: - FD entries for variable length record: The RECORD IS VARYING IN SIZE clause allows us to specify that a flie contains variable length records.

Ex: FD TransFile RECORD IS VARYING IN SIZE FROM 8 TO 31 CHARACTERS. FD Stringfile RECORD IS VARYING IN SIZE FROM 1 TO 80 CHARACTERS DEPENDING ON StringSize.

19. Sorting and Merging - Sorting: + the SORT verb is used to sort Sequential files. + Why sort the file? If only this file were ordered, then it would be easy to write the code to process it. + syntax:

Ex: SORT WorkFile ON ASCENDING KEY CourseCode USING StudentFile GIVING SortedStudentFile. Sort rules: + used anywhere in PROCEDURE DIVISION except in an INPUT or OUTPUT PROCEDURE or another SORT or MERGE or in the DECLARATIVES SECTION.

- SORTing with an INPUT PROCEDURE: + used to eliminate unwanted records, or to alter the format of the records, before they are submitted to the sort process. + syntax:

Ex: SORT workFile ON ASCENDING CountryNameWF INPUT PROCEDURE IS SelectForeignGuest GIVING SortedGuestsFile. => an INPUT PROCEDURE is used to select only the records of foreign guests, for sorting.

+ Creating an INPUT PROCEDURE: RELEASE SDRecordName [FROM Identifier] + Advantage of INPUT PROCEDURE : allows us to filters, alter, records before sort process. => reduce amount of data that has to be sorted. - Sorting with an OUTPUT PROCEDURE: + OUTPUT PROCEDURE: only executes when the sort process has already sorted the file. => useful when dont need to preserve the sorted file. => create the report directly without have to create a file containing the sorted records. An OUTPUT PROCEDURE is also useful when we want to alter the structure of the records written to the sorted file. + SORT syntax with OUTPUT PROCEDURE:

Ex: SORT WorkFile ON ASCENDING KEY SalespersonNumWF USING SalesFile OUTPUT PROCEDURE IS SummariseSales.

+ Creating an OUTPUT PROCEDURE: RETURN SDFileName RECORD [INTO Identifier] AT END StatementBlock END-RETURN
Ex: OPEN OUTPUT OutFile RETURN SDWorkFile RECORD PERFORM UNTIL TerminatingCondition Setup OutRec WRITE OutRec RETURN SDWorkFile RECORD END-PERFORM CLOSE OutFile

- MERGEing files: + combine two or more files into a single large file. If the files are unordered, we simply append the records in one file to the end of the other. But the files are unordered, => complicated. + syntax:

Ex: MERGE MergeWorkFile ON ASCENDING KEY TransDateWF, TransCodeWF, StudentIdWF USING InsertTransFile, DeleteTransFile, UpdateTransFile GIVING CombinedTransFile.

Potrebbero piacerti anche