18
1 הההה הההההה – ההההה הההההההה

מבוא לתכנות – תוכנה

  • Upload
    gay

  • View
    51

  • Download
    0

Embed Size (px)

DESCRIPTION

מבוא לתכנות – תוכנה. פונקציות. משחק החיים של Conway. The Game of life סימולצית פעילות מערכת תאים שפותחה על ידי המתמטיקאי הבריטי ג'ון הורטון קונווי בשנת 1970. - PowerPoint PPT Presentation

Citation preview

Page 1: מבוא לתכנות – תוכנה

1

מבוא לתכנות – תוכנה

פונקציות

Page 2: מבוא לתכנות – תוכנה

2

Conwayמשחק החיים של

•The Game of lifeסימולצית פעילות מערכת

תאים שפותחה על ידי המתמטיקאי הבריטי ג'ון הורטון

.1970קונווי בשנת מאז ועד היום מתמטיקאים ואנשי •

מדעי המחשב לא מפסיקים להתפעל מהמחשק, בעיקר כיוון

שההוא מדגים כיצד מספר כללים פשוטים יכולים להניב תוצאות

מורכבות ומפתיעות.

Page 3: מבוא לתכנות – תוכנה

3

משחק החיים

המרחב של סימולציית משחק החיים הוא על •לוח משבצות )דו-מימדי( אינסופי.

כל משבצת נחשבת ליחידה, שנקרא לה תא.•

".מוות" או "חייםתא יכול להיות במצב של "•

היא מלאהכדי לסמן זאת, נקבע כי משבצת •תא "חי", ומשבצת ריקה היא תא "מת".

Page 4: מבוא לתכנות – תוכנה

4

משחק החיים

כללי המשחק:•המשחק מתחיל ממצב התחלתי כלשהו, בו חלק –

מהתאים בלוח חיים וחלקם מתים.מצב התאים במהלך המשחק משתנה בהתאם –

למספר כללים שקובעים את מצבם בכל רגע נתון במשחק. נהוג לכנות מצב נתון כ-"דור".

בכל דור נולדים ומתים תאים לפי הכללים הבאים:–לידה, מוות, הישרדות•

Page 5: מבוא לתכנות – תוכנה

5

משחק החיים

כללי המשחק:• – אם למשבצת ריקה יש שלושה שכנים חיים, אז לידה–

. בשלב הבא יהיה בה יצור חיתא חי ימות אם:–

יש לו שכן חי אחד או פחות )ימות מבדידות(.•

יש לו ארבעה שכנים חיים או יותר )ימות מצפיפות יתר(.•

שנים.Xזיקנה - התא חי במשך •

X

Page 6: מבוא לתכנות – תוכנה

6

משחק החיים

)Block )still lifeדוגמאות למצבים יציבים:•

Boat )still life(

Blinker )two-phase oscillator(

Toad )two-phase oscillator(

Glider )spaceship(

Lightweight spaceship )LWSS(

Pulsar )three-phase oscillator(

Page 7: מבוא לתכנות – תוכנה

7

משחק החיים

התוכנית אותה נכתוב תריץ סימולציה •בשלבים.

כל שלב ידמה דור אחד.•

Page 8: מבוא לתכנות – תוכנה

8

משחק החיים

מבנה הנתונים:• – SIZE X SIZEמערך דו-מימדי בגודל –

מתאר את מצב הלוח:- : המשבצת נמצאת על גבול הלוח.1• : המשבצת ריקה.0••1,2,3...OLD_AGE התא חי. המספר מיצג את :

גיל התא.

Page 9: מבוא לתכנות – תוכנה

9

#include <iostream.h>#include <stdlib.h>#define SIZE 22 #define OLD_AGE 4

void init_array(int arr[SIZE][SIZE], int rect_size);void print_array(int arr[SIZE][SIZE]);int islive(int i);int calc_next(int arr[SIZE][SIZE],int line,int col);void next_stage(int arr1[SIZE][SIZE],int arr2[SIZE][SIZE]);

int main(){ int arr1[SIZE][SIZE]; int arr2[SIZE][SIZE]; int last; init_array(arr1, 5); cout << "Enter # of iterations : "; cin >> last; int i; for (i = 1 ; i <= last ; i++) { cout << "Stage # " << i << endl; cout << "==========" << endl; if (i % 2 == 1) { print_array(arr1); next_stage(arr1,arr2); } else { print_array(arr2); next_stage(arr2,arr1); } system("PAUSE"); } system("PAUSE"); return 0;}

הצהרה על

פונקציות

התוכנית הראשית

main

Page 10: מבוא לתכנות – תוכנה

10

int main(){ int arr1[SIZE][SIZE]; int arr2[SIZE][SIZE]; int last; init_array(arr1, 5); cout << "Enter # of iterations : "; cin >> last; int i; for (i = 1 ; i <= last ; i++) { cout << "Stage # " << i << endl; cout << "==========" << endl; if (i % 2 == 1) { // for odd stages print_array(arr1); next_stage(arr1,arr2); } else { // for even stages print_array(arr2); next_stage(arr2,arr1); } system("PAUSE"); } system("PAUSE"); return 0;}

קריאה לפונקציה

שליחת משתנה מסוג מערך

לפונקציה, שולחת את כתובתו ולא

מעתיקה אותו (כמו byקריאה

reference(

Page 11: מבוא לתכנות – תוכנה

11

void init_array(int arr[SIZE][SIZE], int rect_size) { int i,j; int rect_start_idx = (SIZE - rect_size + 1) / 2; int rect_end_idx = SIZE - (SIZE - rect_size) / 2 - 1; /* coding: -1 : boundary 0 : empty spot 1 : occupied spot */ for (i = 0 ; i < SIZE ; i++) { for (j = 0 ; j < SIZE ; j++) { if (i == 0 || j == 0 || i == SIZE - 1 || j == SIZE - 1)

arr[i][j] = -1; // boundary else if (i < rect_start_idx || j < rect_start_idx || i >

rect_end_idx || j > rect_end_idx) arr[i][j] = 0; // empty spots

else arr[i][j] = 1; // occupied spots } }}

Page 12: מבוא לתכנות – תוכנה

12

void print_array(int arr[SIZE][SIZE]) { int i,j; for (i = 0 ; i < SIZE ; i++) { for (j = 0 ; j < SIZE ; j++) { if (arr[i][j] > 0) cout << arr[i][j]; // occupied else if (arr[i][j] < 0) cout << "."; //boundries else cout << " "; //empty } cout << endl; }}

Page 13: מבוא לתכנות – תוכנה

13

void next_stage(int cur[SIZE][SIZE],int next[SIZE][SIZE]) { int i,j; for (i = 0 ; i < SIZE ; i++) { for (j = 0 ; j < SIZE ; j++) { next[i][j] = calc_next(cur,i,j); } }}

Page 14: מבוא לתכנות – תוכנה

14

int calc_next(int arr[SIZE][SIZE],int row,int col) { if (arr[row][col] >= OLD_AGE) return 0; if (arr[row][col] < 0) return -1; int n = 0; // count number of living neighbors if (row > 0 && row < SIZE - 1 && col > 0 && col < SIZE - 1) { n = islive(arr[row-1][col-1]) + islive(arr[row-1][col]) + islive(arr[row-1][col + 1]) + islive(arr[row][col-1]) + islive(arr[row][col + 1]) + islive(arr[row+1][col-1]) + islive(arr[row+1][col]) + islive(arr[row+1][col + 1]); } if (arr[row][col] > 0) { if (n < 2) return 0; if (n >= 4) return 0; return arr[row][col] + 1; } if (n == 3) return 1; return 0;}

Page 15: מבוא לתכנות – תוכנה

15

int islive(int i) { if (i > 0) return 1; else return 0;}

Page 16: מבוא לתכנות – תוכנה

16

תרגיל - כפל מטריצות

(3*3כתוב תכנית הקולטת שתי מטריצות )•

התכנית תיצור את מטריצת הכפל שלהן.•

פלט התכנית יהיה הדפסה של מטריצת הכפל.•

Page 17: מבוא לתכנות – תוכנה

17

void read_matrix)double matrix[MAX_ROWS][MAX_COLS]( { for )int rCounter = 0; rCounter < MAX_ROWS; rCounter++(

for )int cCounter = 0; cCounter < MAX_COLS; cCounter++(cin >> matrix[rCounter][cCounter];

}

void write_matrix)const double matrix[MAX_ROWS][MAX_COLS]( {for )int rCounter = 0; rCounter < MAX_ROWS; rCounter++( {

for )int cCounter = 0; cCounter < MAX_COLS; cCounter++( cout << matrix[rCounter][cCounter] << " ";

cout << endl;}

}

void matrix_multip)const double matrix1[MAX_ROWS][MAX_COLS], const double matrix2[MAX_ROWS][MAX_COLS], double result[MAX_ROWS][MAX_COLS]( {

for )int rCounter = 0; rCounter < MAX_ROWS; rCounter++( {for )int cCounter = 0; cCounter < MAX_COLS; cCounter++( {

result[rCounter][cCounter] = 0; // reset the result matrixfor )int i= 0; i < MAX_ROWS; i++( {

result[rCounter][cCounter] += matrix1[rCounter][i]*matrix2[i][cCounter];

}}

}}

Page 18: מבוא לתכנות – תוכנה

18

const int MAX_ROWS =10;

const int MAX_COLS =10;

int main)(

{

// for input

double num_matrix1 [MAX_ROWS][MAX_COLS];

double num_matrix2 [MAX_ROWS][MAX_COLS];

// for output

double res_matrix [MAX_ROWS][MAX_COLS];

read_matrix)num_matrix1(;

read_matrix)num_matrix2(;

matrix_multip)num_matrix1, num_matrix2, res_matrix(;

write_matrix)res_matrix(;

return 0;

}