مراحل من أجل
تحقيق برنامج في إطار خوارزم
العودة
إلى الملخص
تعلم اللغة الخوارزمية
المستخدمة.
استخدم المساعدة المقدمة.
اكتب خوارزمية جديدة أو صحح خوارزمية موجودة.
قم بتشغيل وحدة الترتيب.
كرر ما دامت هناك أخطاء
. صحح الأخطاء
. أعد تشغيل وحدة الترتيب
في هذه المرحلة ، تكون الخوارزمية مكتوبة بشكل جيد وتم وضع مسافة بادئة لها من
أجلك. (يمكنك تغيير أوضاع العرض للخوارزمية الخاصة بك (انظر قائمة "الخيارات")
ابدأ تنفيذ الخوارزمية الخاصة بك
ثم تظهر النوافذ
- البيانات التي تمت قراءتها بواسطة الخوارزمية (زر البيانات)
- الإدخالات الصادرة عن الخوارزمية الخاصة بك (زر النتائج)
إما أن تعطي الخوارزمية النتائج المتوقعة أم لا. في الحالة الأخيرة ، قم بتشغيل
المحاكاة لمحاولة تحديد الأخطاء المنطقية.
ابدأ
محاكاة الخوارزمية الخاصة بك.
وهذا يعني تشغيل الخوارزمية مع ضمان إمكانية التتبع.
تظهر النوافذ
- قراءة البيانات بواسطة الخوارزمية (زر البيانات)
- المخرجات المنبعثة من الخوارزمية الخاصة بك (زر النتائج)
- جميع التغييرات التي تم إجراؤها على المتغيرات المستخدمة (زر محاكاة)
لذلك لديك التتبع الكامل للخوارزمية التي يمكنك طباعتها وتحليلها بحثًا عن
الأخطاء.
إذا كنت تريد رؤية الخطوات المختلفة للخوارزمية عن قرب ، فاطلب مخططًا.
اطلب المحاكاة مرة أخرى مع التتبع
يمكنك بعد ذلك متابعة تطور الخوارزمية الخاصة بك خطوة بخطوة ، والخروج من
الحلقة الحالية أو حتى الوحدة النمطية الحالية.
لتجنب وجود أثر كامل يمكن أن يكون طويلاً ، من الممكن تحديد طول الحلقات
المستخدمة في الخوارزمية الخاصة بك. يمكنك تغيير أوضاع المحاكاة (انظر قائمة "الخيارات").
بمجرد أن تصبح الخوارزمية "قيد التشغيل" ، يمكن ترجمتها
تلقائيًا إلى PASCAL أو C. ما عليك سوى النقر على الزر "To Pascal" أو الزر "To
C". ثم يتم عرض نافذتين منظمتين في "تجانب". يحتوي أحدهما على الخوارزمية
الخاصة بك والآخر على نتيجة الترجمة.
يمكنك الرجوع إلى المساعدة المتعلقة بالانتقال إلى PASCAL أو C.
في هذه المساعدة سوف تجد
- ما يعادل Z إلى PASCAL و Z إلى C.
- جميع تطبيقات آلات Z.
تنتهي مهمة خوارزم هنا.
استخدم مترجم PASCAL أو C لإنهاء برنامجك بشكل نهائي. على وجه الخصوص ، يجب عليك إضافة جميع الوحدات النمطية لإدخال البيانات وإرجاع النتائج. لا تقدم لغة Z تسهيلات لمثل هذه المهام..
{ إيجاد
قائمة في أخرى؟ }
ليكن
ق1 ، ق2 : قوائم ؛
بحث ، إيجاد : دالة ( منطيقي ) ؛
بداية
إنشاء_قائمة ( ق1 ، [ 2 ، 5 ، 9 ، 8 ، 3 ، 6 ] ) ؛
إنشاء_قائمة ( ق2 ، [ 12 ، 5 ، 19 ، 8 ، 3 ، 6 ، 2 ، 9 ] ) ؛
اكتب ( إيجاد ( ق1 ، ق2 ) )
نهاية
{ بحث عن كلمة في قائمة }
دالة بحث ( ق ، كلما ) : منطيقي
ليكن
ق : قائمة ؛
كلما : صحيح ؛
بداية
إذا ق = عدم
بحث := خطأ
وإلا
إذا قيمة_خلية ( ق ) = كلما
بحث := صواب
وإلا
بحث := بحث ( تالي ( ق ) ، كلما )
نهاية_إذا
نهاية_إذا
نهاية
{ هل القائمة ق1 موجودة في القائمة ق2؟ }
دالة إيجاد ( ق1 ، ق2 ) : منطيقي
ليكن
ق1 ، ق2 : قوائم ؛
بداية
إذا ق1 = عدم
اهجاد := صواب
وإلا
إذا لا بحث ( ق2 ، قيمة_خلية ( ق1 ) )
إيجاد := خطأ
وإلا
إيجاد := إيجاد ( تالي ( ق1 ) ، ق2 )
نهاية_إذا
نهاية_إذا
نهاية
{**---------------------------------------------**/
/** T r a n s l a t i o n Z to PASCAL (Standard) **/
/** By Pr. D.E ZEGOUR
**/
/** E S I - Algier
**/
/** Copywrite 2014
**/
/**----------------------------------------------**}
PROGRAM My_program;
{ Implementation : LIST Of INTEGERS}
{ Linked lists }
TYPE
Typeelem_LI = INTEGER;
Pointer_LI = ^Maillon_LI; { type du champ 'Adresse' }
Maillon_LI = RECORD
Val : Typeelem_LI;
Suiv : Pointer_LI
END;
PROCEDURE Allocate_cell_LI ( VAR P : Pointer_LI ) ;
BEGIN NEW(P) END;
PROCEDURE Free_LI ( P : Pointer_LI ) ;
BEGIN DISPOSE(P) END;
PROCEDURE Ass_val_LI(P : Pointer_LI; Val : Typeelem_LI );
BEGIN P^.Val := Val END;
FUNCTION Cell_value_LI (P : Pointer_LI) : Typeelem_LI;
BEGIN Cell_value_LI := P^.Val END;
FUNCTION Next_LI( P : Pointer_LI) : Pointer_LI;
BEGIN Next_LI := P^.Suiv END;
PROCEDURE Ass_adr_LI( P, Q : Pointer_LI ) ;
BEGIN P^.Suiv := Q END;
TYPE
Typeelem_V6I = INTEGER ;
Typetab_V6I = ARRAY[1..6] of Typeelem_V6I ;
TYPE
Typeelem_V8I = INTEGER ;
Typetab_V8I = ARRAY[1..8] of Typeelem_V8I ;
{ Declaration part of variables }
VAR
L1 : Pointer_LI;
L2 : Pointer_LI;
T_L1 : Typetab_V6I ;
T_L2 : Typetab_V8I ;
{ High level operations }
{ creating a linked list }
PROCEDURE Create_list_LI ( VAR L : Pointer_LI ; Tab : Typetab_V6I ; N:
INTEGER) ;
VAR
I : INTEGER;
P, Q : Pointer_LI ;
BEGIN
L:=NIL;
FOR I := 1 TO N DO
BEGIN
Allocate_cell_LI( Q ) ;
Ass_val_LI (Q, Tab[I]);
Ass_adr_LI (Q, NIL);
IF L = NIL
THEN L := Q
ELSE Ass_adr_LI (P, Q);
P := Q
END;
END;
{ Procedure and/or function prototypes }
FUNCTION Search (VAR L : Pointer_LI ; VAR Val : INTEGER) : BOOLEAN; FORWARD;
FUNCTION All (VAR L1 : Pointer_LI ; VAR L2 : Pointer_LI) : BOOLEAN; FORWARD;
{ Search for a value in a linked list }
FUNCTION Search (VAR L : Pointer_LI ; VAR Val : INTEGER) : BOOLEAN;
{ Declaration part of variables }
VAR
Search2 : BOOLEAN ;
_Px1 : Pointer_LI;
BEGIN
IF L = NIL THEN BEGIN
Search2 := FALSE END
ELSE
BEGIN
IF Cell_value_LI(L ) = Val THEN BEGIN
Search2 := TRUE END
ELSE
BEGIN
_Px1 := Next_LI(L ) ;
Search2 := Search (_Px1, Val )
END
END
;Search := Search2 ;
END;
{ Is L1 included in L2? }
FUNCTION All (VAR L1 : Pointer_LI ; VAR L2 : Pointer_LI) : BOOLEAN;
{ Declaration part of variables }
VAR
All2 : BOOLEAN ;
_Px1 : INTEGER ;
_Px2 : Pointer_LI;
BEGIN
IF L1 = NIL THEN BEGIN
All2 := TRUE END
ELSE
BEGIN
_Px1 := Cell_value_LI(L1 ) ;
IF NOT Search ( L2 ,_Px1) THEN BEGIN
All2 := FALSE END
ELSE
BEGIN
_Px2 := Next_LI(L1 ) ;
All2 := All (_Px2, L2 )
END
END
;All := All2 ;
END;
{ Body of main program }
BEGIN
T_L1 [ 1 ] := 2 ;
T_L1 [ 2 ] := 5 ;
T_L1 [ 3 ] := 9 ;
T_L1 [ 4 ] := 8 ;
T_L1 [ 5 ] := 3 ;
T_L1 [ 6 ] := 6 ;
Create_list_LI ( L1 , T_L1 , 6 ) ;
T_L2 [ 1 ] := 12 ;
T_L2 [ 2 ] := 5 ;
T_L2 [ 3 ] := 19 ;
T_L2 [ 4 ] := 8 ;
T_L2 [ 5 ] := 3 ;
T_L2 [ 6 ] := 6 ;
T_L2 [ 7 ] := 2 ;
T_L2 [ 8 ] := 9 ;
Create_list_LI ( L2 , T_L2 , 8 ) ;
WRITELN ( All(L1,L2) )
;READLN;
END.
/**-----------------------------------------**/
/** T r a n s l a t i o n Z to C (Standard) **/
/** By Pr. D.E ZEGOUR
**/
/** E S I - Algier
**/
/** Copywrite 2014
**/
/**-----------------------------------------**/
/* ????? ????? ?? ????? */
#include <stdio.h>
#include <stdlib.h>
typedef int bool ;
#define True 1
#define False 0
/** Implementation **\: LIST Of INTEGERS**/
/** Linked lists **/
typedef int Typeelem_Li ;
typedef struct Maillon_Li * Pointer_Li ;
struct Maillon_Li
{
Typeelem_Li Val ;
Pointer_Li Suiv ;
} ;
Pointer_Li Allocate_cell_Li (Pointer_Li *P)
{
*P = (struct Maillon_Li *) malloc( sizeof( struct Maillon_Li)) ;
(*P)->Suiv = NULL;
}
void Ass_val_Li(Pointer_Li P, Typeelem_Li Val)
{
P->Val = Val ;
}
void Ass_adr_Li( Pointer_Li P, Pointer_Li Q)
{
P->Suiv = Q ;
}
Pointer_Li Next_Li( Pointer_Li P)
{ return( P->Suiv ) ; }
Typeelem_Li Cell_value_Li( Pointer_Li P)
{ return( P->Val) ; }
void Free_Li ( Pointer_Li P)
{ free (P);}
/** For temporary variables **/
typedef int Typeelem_V6i;
typedef Typeelem_V6i Typetab_V6i[6];
/** For temporary variables **/
typedef int Typeelem_V8i;
typedef Typeelem_V8i Typetab_V8i[8];
/** Variables of main program **/
Pointer_Li U1=NULL;
Pointer_Li U2=NULL;
Typetab_V6i T_U1;
Typetab_V8i T_U2;
/** High level operations **/
/** creating a linked list **/
void Create_list_Li ( Pointer_Li *L, Typetab_V6i Tab, int N)
{
int I ;
Pointer_Li P, Q ;
*L =NULL;
for( I=1;I<=N;++I)
{
Allocate_cell_Li( &Q ) ;
Ass_val_Li (Q, Tab[I-1]);
Ass_adr_Li (Q, NULL);
if (*L == NULL)
*L = Q ;
else Ass_adr_Li (P, Q);
P = Q ;
}
}
/** Function prototypes **/
bool Bfd (Pointer_Li *U , int *Vwxa) ;
bool Azeah (Pointer_Li *U1 , Pointer_Li *U2) ;
/* ??? ?? ???? ?? ????? */
bool Bfd (Pointer_Li *U , int *Vwxa)
{
/** Local variables **/
bool Bfd2 ;
Pointer_Li _Px1=NULL;
/** Body of function **/
if( *U == NULL) {
Bfd2 = False; }
else
{
if( Cell_value_Li ( *U ) == *Vwxa) {
Bfd2 = True; }
else
{
_Px1 = Next_Li ( *U ) ;
Bfd2 = Bfd ( &_Px1, & *Vwxa );
}
}
return Bfd2 ;
}
/* ?? ??????? ?1 ?????? ?? ??????? ?2? */
bool Azeah (Pointer_Li *U1 , Pointer_Li *U2)
{
/** Local variables **/
bool Azeah2 ;
int _Px1;
Pointer_Li _Px2=NULL;
/** Body of function **/
if( *U1 == NULL) {
Azeah2 = True; }
else
{
_Px1 = Cell_value_Li ( *U1 ) ;
if( ! Bfd ( & *U2 , &_Px1)) {
Azeah2 = False; }
else
{
_Px2 = Next_Li ( *U1 ) ;
Azeah2 = Azeah ( &_Px2, & *U2 );
}
}
return Azeah2 ;
}
int main(int argc, char *argv[])
{
T_U1 [ 0 ] = 2 ;
T_U1 [ 1 ] = 5 ;
T_U1 [ 2 ] = 9 ;
T_U1 [ 3 ] = 8 ;
T_U1 [ 4 ] = 3 ;
T_U1 [ 5 ] = 6 ;
Create_list_Li (&U1 , T_U1 , 6 ) ;
T_U2 [ 0 ] = 12 ;
T_U2 [ 1 ] = 5 ;
T_U2 [ 2 ] = 19 ;
T_U2 [ 3 ] = 8 ;
T_U2 [ 4 ] = 3 ;
T_U2 [ 5 ] = 6 ;
T_U2 [ 6 ] = 2 ;
T_U2 [ 7 ] = 9 ;
Create_list_Li (&U2 , T_U2 , 8 ) ;
printf ( " %d", Azeah(&U1,&U2) );
system("PAUSE");
return 0;
}
11