├── .gitignore ├── BackCover.pdf ├── Chapter_I-1.tex ├── Chapter_I-2.tex ├── Chapter_I-3.tex ├── Chapter_I-4.tex ├── Chapter_I-5.tex ├── Chapter_I-6.tex ├── Chapter_I-7.tex ├── Chapter_I-8.tex ├── Chapter_I-9.tex ├── Chapter_II-1.tex ├── Chapter_II-10.tex ├── Chapter_II-2.tex ├── Chapter_II-3.tex ├── Chapter_II-4.tex ├── Chapter_II-5.tex ├── Chapter_II-6.tex ├── Chapter_II-7.tex ├── Chapter_II-8.tex ├── Chapter_II-9.tex ├── Chapter_III-1.tex ├── Chapter_III-2.tex ├── Chapter_III-3.tex ├── Chapter_III-4.tex ├── Chapter_III-5.tex ├── Chapter_III-6.tex ├── Chapter_III-7.tex ├── Chapter_III-8.tex ├── Chapter_III-9.tex ├── Chapter_IV-1.tex ├── Chapter_IV-2.tex ├── Chapter_IV-3.tex ├── Conclusion.tex ├── Fonts ├── LiberationMono-Bold.ttf ├── LiberationMono-BoldItalic.ttf ├── LiberationMono-Italic.ttf ├── LiberationMono-Regular.ttf ├── LiberationSans-Bold.ttf ├── LiberationSans-BoldItalic.ttf ├── LiberationSans-Italic.ttf ├── LiberationSans-Regular.ttf ├── amiri-bold.ttf ├── amiri-boldslanted.ttf ├── amiri-regular.ttf └── amiri-slanted.ttf ├── FrontCover.pdf ├── Introduction.tex ├── Introduction_original.tex ├── Pictures ├── Chapter_I-1_Compilation.png ├── Chapter_I-1_MetalSlug.png ├── Chapter_I-1_Translation.png ├── Chapter_I-2_CodeBlocks-C.png ├── Chapter_I-2_CodeBlocks-New-project.png ├── Chapter_I-2_CodeBlocks.png ├── Chapter_I-2_CodeBlocks_Compiler.png ├── Chapter_I-2_CodeBlocks_project-path.png ├── Chapter_I-2_Compile-toolbar.png ├── Chapter_I-2_Visual-Cpp-New-file.png ├── Chapter_I-2_Visual-Cpp-New-project.png ├── Chapter_I-2_Visual-Cpp-New-source.png ├── Chapter_I-2_Visual-Cpp-Parameters.png ├── Chapter_I-2_Visual-Cpp-Welcome.png ├── Chapter_I-2_Visual-Cpp-main.png ├── Chapter_I-2_Visual-Cpp.png ├── Chapter_I-2_Xcode-C.png ├── Chapter_I-2_Xcode-New-project.png ├── Chapter_I-2_Xcode-main.png ├── Chapter_I-3_Console-Windows.png ├── Chapter_I-3_Console.png ├── Chapter_I-3_Good-Morning-backslash-n.png ├── Chapter_I-3_Good-Morning.png ├── Chapter_I-3_HelloWorld-run.png ├── Chapter_I-3_HelloWorld.png ├── Chapter_I-3_Paint.png ├── Chapter_I-4_Computer.png ├── Chapter_I-4_RAM-Schema.png ├── Chapter_I-4_RAM.png ├── Chapter_I-7_Loop.png ├── Chapter_I-9_function-io.png ├── Chapter_I-9_main.png ├── Chapter_I-9_triple-call.png ├── Chapter_I-9_triple-io.png ├── Chapter_II-10_array.png ├── Chapter_II-10_array_overflow.png ├── Chapter_II-10_array_patrice.png ├── Chapter_II-10_buffer.png ├── Chapter_II-10_buffer_rest.png ├── Chapter_II-10_string.png ├── Chapter_II-1_Compilation-Schema-Libraries.png ├── Chapter_II-1_Compilation-Schema.png ├── Chapter_II-1_Project-Add-File.png ├── Chapter_II-1_Project-Sokoban-Folder.png ├── Chapter_II-1_Project-Sokoban.png ├── Chapter_II-1_Project.png ├── Chapter_II-2_RAM-Schema-Pointer.png ├── Chapter_II-2_RAM-Schema-Pointer2.png ├── Chapter_II-2_RAM-Schema.png ├── Chapter_II-3_Array-Adresses.png ├── Chapter_II-4_String-Concatenation.png ├── Chapter_II-4_String-Copy.png ├── Chapter_II-4_String-Memory.png ├── Chapter_II-4_String-Memory2.png ├── Chapter_II-4_String-Search.png ├── Chapter_II-5_file-c-file-h.png ├── Chapter_II-6_Axis.png ├── Chapter_II-7_Files.png ├── Chapter_II-7_test-A.png ├── Chapter_II-7_test-fprintf.png ├── Chapter_II-7_test-string.png ├── Chapter_II-8_RAM-Schema-char.png ├── Chapter_II-8_RAM-Schema-int.png ├── Chapter_III-1_CodeBlocks-New-Project.png ├── Chapter_III-1_Game.png ├── Chapter_III-1_SDL-DLL-copy.png ├── Chapter_III-1_SDL-DLL-past.png ├── Chapter_III-1_SDL-Mac-Download-version.png ├── Chapter_III-1_SDL-Mac-Download.png ├── Chapter_III-1_SDL-Project-Welcome.png ├── Chapter_III-1_SDL-Project-path.png ├── Chapter_III-1_SDL-Project.png ├── Chapter_III-1_SDL-add.png ├── Chapter_III-1_SDL-build-target.png ├── Chapter_III-1_SDL-file-properties-advanced.png ├── Chapter_III-1_SDL-file-properties.png ├── Chapter_III-1_SDL-folder.png ├── Chapter_III-1_SDL-h-copy.png ├── Chapter_III-1_SDL-h-past.png ├── Chapter_III-1_SDL-keep-open.png ├── Chapter_III-1_SDL-mainc.png ├── Chapter_III-1_SDL-new-file.png ├── Chapter_III-1_SDL-path-filled.png ├── Chapter_III-1_SDL-path-select-2.png ├── Chapter_III-1_SDL-path-select.png ├── Chapter_III-1_SDL-path.png ├── Chapter_III-1_SDL-project-unused-files.png ├── Chapter_III-1_SDL-remove-cpp.png ├── Chapter_III-1_SDL-rename.png ├── Chapter_III-1_SDL-selection.png ├── Chapter_III-1_SDL-test-project.png ├── Chapter_III-1_SDL-test-window.png ├── Chapter_III-1_SDL.png ├── Chapter_III-1_VisualCpp-Add.png ├── Chapter_III-1_VisualCpp-Assistant.png ├── Chapter_III-1_VisualCpp-project-properties.png ├── Chapter_III-1_Xcode-SDL-build-setting.png ├── Chapter_III-1_Xcode-SDL-framework.png ├── Chapter_III-1_Xcode-SDL-project.png ├── Chapter_III-1_Xcode-SDL-target.png ├── Chapter_III-1_Xcode-drop-framework.png ├── Chapter_III-1_Xcode-gcc.png ├── Chapter_III-2_Colors-paste.png ├── Chapter_III-2_Colors.png ├── Chapter_III-2_Empty-window.png ├── Chapter_III-2_Window-color-centered.png ├── Chapter_III-2_Window-color.png ├── Chapter_III-2_Window-coordinates.png ├── Chapter_III-2_Window-gradient-coordinates.png ├── Chapter_III-2_Window-gradient.png ├── Chapter_III-2_Window-title.png ├── Chapter_III-3_CodeBlocks-Linker.png ├── Chapter_III-3_Window-Image-Sapin.png ├── Chapter_III-3_Window-Image-Zozor-Alpha-0.png ├── Chapter_III-3_Window-Image-Zozor-Alpha-128.png ├── Chapter_III-3_Window-Image-Zozor-Alpha-190.png ├── Chapter_III-3_Window-Image-Zozor-Alpha-255.png ├── Chapter_III-3_Window-Image-Zozor-Alpha-75.png ├── Chapter_III-3_Window-Image-Zozor-transparent.png ├── Chapter_III-3_Window-Image-Zozor.png ├── Chapter_III-3_Window-Image.png ├── Chapter_III-3_Window-icon.png ├── Chapter_III-3_Xcode-frameworks.png ├── Chapter_III-3_Zozor.png ├── Chapter_III-4_Close.png ├── Chapter_III-4_Double-buffering-1.png ├── Chapter_III-4_Double-buffering-2.png ├── Chapter_III-4_Window-Zozor-moved-mouse.png ├── Chapter_III-4_Window-Zozor-moved.png ├── Chapter_III-4_Window-Zozor.png ├── Chapter_III-5_Box.png ├── Chapter_III-5_Box2.png ├── Chapter_III-5_Editor.png ├── Chapter_III-5_Home.png ├── Chapter_III-5_Map.png ├── Chapter_III-5_Mario-Sokoban-exe.png ├── Chapter_III-5_Mario-Sokoban.png ├── Chapter_III-5_Mario-down.png ├── Chapter_III-5_Mario-left.png ├── Chapter_III-5_Mario-right.png ├── Chapter_III-5_Mario-up.png ├── Chapter_III-5_Target.png ├── Chapter_III-5_Wall.png ├── Chapter_III-6_Process-0.png ├── Chapter_III-6_Process.png ├── Chapter_III-7_Blended-text.png ├── Chapter_III-7_Blended.png ├── Chapter_III-7_Font1.png ├── Chapter_III-7_Font2.png ├── Chapter_III-7_Font3.png ├── Chapter_III-7_Italic-underlined-text.png ├── Chapter_III-7_Shaded.png ├── Chapter_III-7_Solid.png ├── Chapter_III-7_Time-text.png ├── Chapter_III-8_Aim-misplaced.png ├── Chapter_III-8_Aim-wellplaced.png ├── Chapter_III-8_Aim.png ├── Chapter_III-8_FindSounds.png ├── Chapter_III-8_Window-aim.png ├── Chapter_III-9_Frequencies.png ├── Chapter_III-9_Window-spectral.png ├── Chapter_IV-1_Array-add.png ├── Chapter_IV-1_Array.png ├── Chapter_IV-1_Linked-list-data.png ├── Chapter_IV-1_Linked-list.png ├── Chapter_IV-1_List-1-element.png ├── Chapter_IV-1_List-NULL.png ├── Chapter_IV-1_List-new-linked.png ├── Chapter_IV-1_List-new.png ├── Chapter_IV-1_List-struct.png ├── Chapter_IV-1_List-to-delete.png ├── Chapter_IV-2_Humans-queue.png ├── Chapter_IV-2_Money-stack.png ├── Chapter_IV-2_Queue.png ├── Chapter_IV-2_Stack-add.png ├── Chapter_IV-2_Stack-history.png ├── Chapter_IV-2_Stack-numbers.png ├── Chapter_IV-2_Stack-remove.png ├── Chapter_IV-2_Stack.png ├── Chapter_IV-3_Array-indices-hash.png ├── Chapter_IV-3_Array-indices.png ├── Chapter_IV-3_Hash-list.png ├── Chapter_IV-3_Student-list.png ├── FrontCover.jpg ├── Introduction_original.png └── OpenClassrooms-logo.jpg ├── Project_page.tex ├── README.md ├── Title_page.tex └── book.tex /.gitignore: -------------------------------------------------------------------------------- 1 | # gitignore for this project 2 | # Ignore everything 3 | * 4 | # except this file, .md, .tex files and Pictures, Fonts folders and their content 5 | !.gitignore 6 | !*.tex 7 | !*.md 8 | !Pictures/ 9 | !Pictures/* 10 | !Fonts 11 | !Fonts/* 12 | # But ignore hidden files 13 | Pictures/.* 14 | -------------------------------------------------------------------------------- /BackCover.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/BackCover.pdf -------------------------------------------------------------------------------- /Chapter_I-1.tex: -------------------------------------------------------------------------------- 1 | \chapter{قلت برمجة؟} 2 | 3 | \section{ما هي البرمجة؟} 4 | 5 | \begin{question} 6 | ما الذي تعنيه كلمة "بَرْمَجَ"؟ 7 | \end{question} 8 | 9 | لن أتعبك وأعطيك أصل كلمة "بَرْمَجَ"، لكنني سأختصر كل شيء في جملة: البرمجة تعني إنشاء برامج حاسوب. وهذه البرامج الّتي تنشئها تأمر الجهاز بالقيام بتعليمات وأفعال معيّنة. 10 | حاسوبك الخاص يحتوي على كثير من هذه البرامج وبمختلف أنواعها: 11 | 12 | \begin{itemize} 13 | \item الآلة الحاسبة تعتبر برنامجًا. 14 | \item معالج النصوص يعتبر برنامجًا أيضًا. 15 | \item وكذلك برنامج المحادثة. 16 | \item ألعاب الفيديو هي برامج كذلك. 17 | \end{itemize} 18 | 19 | \begin{figure}[H] 20 | \centering 21 | \includegraphics[width=0.6\textwidth]{Chapter_I-1_MetalSlug} 22 | 23 | نسخة عن لعبة \textenglish{MetalSlug} الشهيرة تم إنشاؤها من طرف العضو \href{http://www.siteduzero.com/membres-294-176405.html}{\textenglish{joe87}} 24 | \end{figure} 25 | 26 | باختصار البرامج موجودة في كل جهاز، وهي التي تعطي الحاسوب قدرته على إنجاز مختلف المهام التي تُخوَّل إليه. يمكنك أن تنشئ برنامج تشفير أو لعبة ثنائية / ثلاثية الأبعاد باستخدام لغة برمجة مثل \textenglish{C}. 27 | 28 | ملاحظة: لم أقل أن إنشاء لعبة يتم برمشة عين، لقد قلت فقط بأنه شيء ممكن، لكن كن متأكدًا، سوف يتطلب ذلك جهدا كبيرًا! 29 | 30 | وبما أننا في بداية الطريق، فإّننا لن نقوم بإنشاء لعبة ثلاثية الأبعاد! لكنّنا سنبدأ بكيفية عرض نص على الشاشة، طبعا ستقول ما علاقة هذا بإنشاء الألعاب؟ لكن ثِق بي، هذا الأمر ليس بسيطا كما يبدو! 31 | 32 | بالطبع هذا ليس شيئا مُبهرًا، ولكن يجب علينا أن نبدأ من هنا؛ وشيئا فشيئا يمكنك أن تنشئ برامج معقّدة أكثر. فالهدف من هذا الكتاب هو أن أعرفك على كل ما يتعلق بهذه اللغة. 33 | 34 | \section{البرمجة، بأي لغة يا ترى؟} 35 | 36 | حاسوبك هو آلة غريبة جدًا، هذا أقل ما يمكن أن نقوله عنه. يمكننا أن نخاطبه فقط بالصفر والواحد، فمثلا إذا طلبنا منه حساب 3+5 فيمكن لهذا أن يعطينا نتيجة كالتالي (هذه ليست ترجمة دقيقة ولكنها تشبه ما يحدث بالفعل): 37 | \InlineCode{0010110110010011010011110} 38 | 39 | ما تَرَاه هنا يسمى اللغة الثنائية 40 | (\textenglish{Binary language}) 41 | أو لغة الآلة 42 | (\textenglish{Machine language})، 43 | وحاسوبك لا يفهم سوى هذه اللغة، وكما تلاحظ، هذه اللغة غير مفهومة على الإطلاق! 44 | 45 | مشكلتنا الآن: 46 | 47 | \begin{question} 48 | كيف يمكننا التعامل مع حاسوب لا يفهم سوى اللغة الثنائية؟ 49 | \end{question} 50 | 51 | حاسوبك لا يتحدث الإنجليزية، ولا العربية، ولا أي لغة غير هذه اللغة، ولكنها صعبة جدا لدرجة أن حتى أكبر خبراء الحاسوب لا يستخدمونها. 52 | لهذا قام بعض مهندسي الحواسيب باختراع لغات يمكن أن تُتَرجَمَ إلى اللغة الثنائية، لكن الشيء الأصعب هو إنشاء البرامج الّتي تقوم بهذه الترجمة. ولحسن الحظ فقد قاموا بهذا العمل نيابة عنا. هذه البرامج تقوم بترجمة الأوامر الّتي تكتبها (مثلا: "أُحسب 3+5") إلى شيء يشبه هذا: 53 | \InlineCode{0010110110010011010011110}. 54 | 55 | هذا المخطط يلخص ما كنت أشرح: 56 | 57 | \begin{figure}[H] 58 | \centering 59 | \includegraphics[width=0.8\textwidth]{Chapter_I-1_Translation} 60 | \end{figure} 61 | 62 | \section{قليل من المفردات} 63 | 64 | حتّى الآن كنت أتحدّث إليك بكلمات بسيطة، لكن يجب أن تعلم أنه في المعلوماتية توجد مصطلحات علمية لكل ما ذكرت. طوال هذا الكتاب، سوف تتعلم استخدام المفردات المناسبة. هذا سيفيدك كثيرا خصوصا عندما تتحدث مع مبرمجين آخرين، حيث أنك سوف تتفاهم معهم بكل سهولة. 65 | 66 | نعود إلى الحديث عن المخطط السابق. في المستطيل الأول قلت أن "برنامجك مكتوب بلغة مُبَسَّطة"، في الواقع هذا النوع من اللغات يُعرف باسم لغات البرمجة عالية المستوى (\textenglish{High-level programming languages}). هناك مستويات عديدة من لغات البرمجة، وكلما كان مستوى اللغة أعلى كانت أقرب إلى اللغة الحقيقية وكان استخدامها أسهل. إذن، اللغات عالية المستوى سهلة الاستخدام لكنها تتضمن بعض السلبيّات سوف نتعرّف عليها لاحقا. 67 | 68 | توجد العديد من لغات البرمجة، وهي متفاوتة المستوى، منها: 69 | \begin{itemize} 70 | \item \textenglish{C} 71 | \item \textenglish{C++} 72 | \item \textenglish{Java} 73 | \item \textenglish{Visual Basic} 74 | \item \textenglish{Delphi} 75 | \item والعديد غيرها. 76 | \end{itemize} 77 | 78 | كما تلاحظ، لم أرتبها حسب مستوياتها، لذلك لا تعتقد أن اللغة الأولى في القائمة هي الأسهل أو العكس. عموما، لائحة اللغات الموجودة طويلة جدا لدرجة أنه لا يمكنني كتابتها كلها هنا. 79 | 80 | مصطلح آخر يجب تذكّره هو 81 | \textbf{الشفرة المصدرية} 82 | (\textenglish{Source code})، 83 | وهي ببساطة الشفرة الخاصة ببرنامجك الذي تكتبه بلغة عالية المستوى والذي يتم ترجمته فيما بعد إلى اللغة الثنائية. 84 | 85 | ثم يأتي دور البرنامج الذي يحوّل هذه اللغة عالية المستوى إلى اللغة الثنائية، هذا النوع من البرامج يعرف باسم 86 | \textbf{المترجم} 87 | أو 88 | \textbf{المصنّف}، 89 | والعملية الّتي يقوم بها تسمى 90 | \textbf{الترجمة} 91 | أو 92 | \textbf{التصنيف}. 93 | 94 | \begin{information} 95 | يوجد لكل لغة عالية المستوى مترجم خاص، وهذا شيء منطقي، فاللغات مختلفة فيما بينها، فلا يمكننا ترجمة لغة 96 | \textenglish{C} 97 | بنفس الطريقة الّتي نترجم بها 98 | \textenglish{Delphi} 99 | مثلا. 100 | بعض اللغات مثل 101 | \textenglish{C} 102 | تملك العديد من المترجمات، فمنها من هو مكتوب من طرف 103 | \textenglish{Microsoft}، ومنها من 104 | \textenglish{GNU}، 105 | إلخ\dots سوف نتعرّف على كل هذا في الفصل القادم. 106 | لحسن الحظ، هذه المترجمات متطابقة تقريبا (رغم وجود اختلافات طفيفة بينها سوف نتعرف عليها لاحقا). 107 | \end{information} 108 | 109 | أخيرا، البرنامج الثنائي المنشئ بواسطة المترجم يسمى الملف 110 | \textbf{القابل للتنفيذ} 111 | أو 112 | \textbf{التنفيذي} 113 | (\textenglish{Executable}). 114 | لهذا السبب تملك البرامج 115 | (على الأقل برامج 116 | \textenglish{Windows}) 117 | الامتداد 118 | \InlineCode{.exe} 119 | والذي هو اختصار كلمة 120 | \textenglish{EXEcutable}. 121 | 122 | نعود إلى مخططنا السابق، وهذه المرة سنستخدم المصطلحات الصحيحة: 123 | 124 | \begin{figure}[H] 125 | \centering 126 | \includegraphics[width=0.8\textwidth]{Chapter_I-1_Compilation} 127 | \end{figure} 128 | 129 | \section{لماذا نختار تعلّم \textenglish{C}؟} 130 | 131 | كما قلت سابقا، يوجد كثير من اللغات عالية المستوى، فلماذا ينبغي علينا أن نبدأ بإحداها على وجه الخصوص؟ سؤال عظيم! 132 | 133 | على أية حال يجب علينا أن نختار بأي لغة سنبدأ البرمجة عاجلا أم آجلا، وبالتالي لديك الخيار في البدء بـ: 134 | 135 | \begin{itemize} 136 | \item \textbf{لغة ذات مستوى عالي جدّا}: 137 | وتكون سهلة جدّا أوعامة، نذكر من بينها 138 | \textenglish{Python}، \textenglish{Ruby}، \textenglish{Visual Basic}، 139 | وغيرها. هذه اللغات تسمح بكتابة برامج بشكل أسرع. عامّة تحتاج لأن تُرفق معها ملفات مُسَاعِدة لكي تعمل (كَمُفَسِّرٍ مثلا). 140 | \item \textbf{لغة ذات مستوى منخفض قليلا}: 141 | هي أكثر صعوبة نوعا ما، ولكن مع لغة مثل 142 | \textenglish{C} 143 | سوف تتعلم كثيرا عن البرمجة وحول طريقة عمل حاسوبك. ستكون بعد ذلك قادرًا على تعلّم لغة برمجة أخرى إن أردت وبكل يُسْرٍ. 144 | \end{itemize} 145 | 146 | من ناحية أخرى، 147 | \textenglish{C} 148 | لغة برمجة واسعة الإنتشار، أُستخدمت في برمجة العديد من البرامج التي تعرفها. حتى أنها كثيرا ما تدرّس في الدراسات العليا في مجال المعلوماتية. 149 | هذه هي الأسباب الّتي جعلتني أتحمّس لتعليمك لغة 150 | \textenglish{C} 151 | بالتحديد. لم أقل أنّه يجب عليك أن تبدأ بها، لكنّي قلت إنه خيار جيّد لكي أقدّم لك معرفة صلبة في هذا الكتاب. 152 | 153 | \begin{information} 154 | بعض لغات البرمجة موجّهة أكثر للشبكة العنكبوتية 155 | (\textenglish{Web}) 156 | مثل 157 | \textenglish{PHP} 158 | أكثر منها لإنشاء البرامج المعلوماتية. 159 | \end{information} 160 | 161 | سوف أفترض في هذا الكتاب أنّ هذه هي لغة برمجتك الأولى وأنّه لم يسبق لك أن برمجت من قبل. فإن كنت قد برمجت قليلا من قبل فلا مضرّة في أن تعيد من الصفر. 162 | 163 | \begin{question} 164 | ما هو الفرق بين 165 | \textenglish{C} 166 | و 167 | \textenglish{C++}؟ 168 | \end{question} 169 | 170 | هاتان اللغتان قريبتان جدّا من بعضهما، وكلاهما مستخدمتان بكثرة. ولكي تعرف كيف نشأتا يجب عليك أن تدرس التاريخ قليلا: 171 | \begin{itemize} 172 | \item في البداية، عندما كانت الحواسيب تَزِنُ أطنانا وتشغل مكانا قَدْرُهُ حجم منزلك، تمّ اختراع لغة برمجة تسمّى 173 | \textenglish{Algol}. 174 | \item بعدها تطوّرت الأمور أكثر واختُرعَت لغة برمجة جديدة عُرِفَتْ باسْمِ 175 | \textenglish{CPL} 176 | والّتي تطوّرت فيما بعد إلى لغة 177 | \textenglish{BCPL} 178 | ثم أخذت إسم اللغة 179 | \textenglish{B}. 180 | \item مع مضيّ الزمن توصّل الخبراء إلى ابتكار اللغة 181 | \textenglish{C} 182 | وقد تمّ إدخال بعض التعديلات عليها إلّا أنها لا تزال من أحد اللغات الأكثر استخداما اليوم. 183 | \item وبعد زمن، أراد الخبراء أن يضيفوا بعض الأشياء إلى 184 | \textenglish{C}، 185 | يمكن اعتبارها نوعا من التحسينات. والنتيجة كانت بما يعرف بلغة 186 | \textenglish{C++} 187 | ، وهي لغة 188 | \textenglish{C} 189 | مع إضافات تمكّننا من البرمجة بطريقة مختلفة. 190 | \end{itemize} 191 | 192 | \begin{information} 193 | \textenglish{C++} 194 | ليست أحسن من \textenglish{C}، 195 | هي فقط تمكننا من البرمجة بطريقة مختلفة وتساعد المبرمج على تنظيم شفرة برنامجه. رغم ذلك هي تشبه \textenglish{C} 196 | كثيرا. وإن كنت تنوي تعلّم \textenglish{C++} 197 | فيما بعد فَسَوْفَ تجد ذلك سهلا. 198 | \end{information} 199 | 200 | ولو اعتُبرت 201 | \textenglish{C++} 202 | تطويرا لـ\textenglish{C} 203 | فإن هذا لا يعني أنه يجب استخدام 204 | \textenglish{C++} 205 | فقط لإنشاء البرامج. لغة 206 | \textenglish{C} 207 | ليست لغة عجوزا منسيّة، بالعكس هي مستخدمة بكثرة اليوم. بل إنها أساس أنظمة التشغيل الكبيرة مثل 208 | \textenglish{Unix } 209 | (ومنه 210 | \textenglish{GNU/Linux} 211 | و 212 | \textenglish{Mac OS}) و 213 | \textenglish{Windows}. 214 | 215 | \section{هل البرمجة صعبة؟} 216 | هذا سؤال يعذّب روح كل من يريد تعلّم البرمجة! هل يجب أن تكون أستاذ رياضيات كبير درس 10 سنوات من التعليم العالي حتّى تبدأ البرمجة؟ 217 | 218 | الجواب هو لا بالطبع. كل ما تحتاج إليه هو معرفة العمليات الأربع الأساسية: 219 | \begin{itemize} 220 | \item الجمع، 221 | \item الطرح، 222 | \item الضرب، 223 | \item القسمة. 224 | \end{itemize} 225 | هذا ليس مخيفا! سوف أشرح لك في فصل لاحق كيف يقوم الحاسوب بهذه العمليات الأساسية في برامجك. 226 | 227 | باختصار، لا توجد صعوبات غير قابلة للحلّ. في الواقع، هذا يعتمد على طبيعة برنامجك، فإذا كنت تريد إنشاء برنامج تشفير فيجب عليك معرفة بعض الأشياء في الرياضيات، وإن كان برنامجك يقوم بالرسم ثلاثي الأبعاد فيجب أن تكون لديك بعض المعرفة بالهندسة الفضائية. 228 | 229 | كل حالة تعامل بطريقة خاصّة. ولكن لتعلّم لغة 230 | \textenglish{C} 231 | نفسها لا تحتاج إلى أيّة معارف قبليّة. 232 | 233 | \begin{question} 234 | إذن أين هو الفخ؟ وأين تكمن الصعوبة؟ 235 | \end{question} 236 | 237 | يجب أن تعرف كيف يعمل الحاسوب، لتفهم ما الّذي نقوم به في \textenglish{C}. من هذا المنطلق، كن متيقّنا أنّي سأعلّمك كلّ هذا شيئا فشيئا. 238 | 239 | اعلم أن للمبرمج صفات أيضا مثل: 240 | \begin{itemize} 241 | \item الصبر: البرنامج لا يعمل عادة من أوّل محاولة، يجب أن تكون مثابرًا. 242 | \item حسّ المنطق: صحيح أنّك لست بحاجة إلى أن يكون لديك مستوى جيّد في الرياضيّات، لكنّ هذا لا يمنع من التفكير وتحليل المشكلات بالمنطق. 243 | \item الهدوء: فيجب عليك ألّا تضرب حاسوبك بالمطرقة، فهذا لن يجعل برنامجك يعمل! 244 | \end{itemize} 245 | -------------------------------------------------------------------------------- /Chapter_I-5.tex: -------------------------------------------------------------------------------- 1 | \chapter{حسابات سهلة} 2 | 3 | كما قلت لك في الفصل السابق: جهازك ماهو إلا آلة حاسبة كبيرة. سواء كنت تسمع الموسيقى، تشاهد فلمًا أو تلعب لعبة، فإن الحاسوب ينجز الحسابات طيلة الوقت. 4 | 5 | هذا الفصل سيساعدك على التعرف على معظم الحسابات التي يقوم بها الجهاز. سنعيد استعمال ما نحن بصدد تعلّمه عن عالم المتغيرات. الفكرة هي أننا سنقوم بعمليات على المتغيرات: نجمعها، نضربها، نخزّن النتائج في متغيرات أخرى، إلخ. 6 | 7 | حتى وإن لم تكن من هواة الرياضيات، فإن هذا الفصل إلزامي ولا مفرّ منه. 8 | 9 | \section{الحسابات القاعدية} 10 | 11 | بالرغم من قدرة الجهاز الواسعة إلا أنه في الأساس يتعمد في حساباته على عمليات بسيطة للغاية وهي: 12 | 13 | \begin{itemize} 14 | \item الجمع، 15 | \item الطرح، 16 | \item القسمة، 17 | \item الضرب، 18 | \item الترديد 19 | (\textenglish{Modulo}) 20 | (سأشرح لاحقا ما الّذي يعنيه إذا لم تكن تعرفه الآن). 21 | \end{itemize} 22 | 23 | إن كان بودك القيام بحسابات أكثر تعقيدا (كالأسس واللوغاريثم وماشابه)، يجب عليك إذا برمجتها أو بمعنى آخر: 24 | \textbf{توضح للجهاز كيف يقوم بها}.\\ 25 | لحسن الحظ، سترى لاحقًا في هذا الفصل أنه توجد مكتبة في لغة \textenglish{C}، 26 | تحتوي على دوال رياضية جاهزة. لن يكون عليك إعادة كتابتها إلا إذا أردت فعل ذلك تطوّعيا أو كنت أستاذ رياضيات. 27 | 28 | لنبدأ بالعملية الأسهل وهي الجمع.\\ 29 | طبعا في الجمع نحتاج الرمز +.\\ 30 | يجب وضع نتيجة الجمع في متغير ولهذا سنقوم بإنشاء متغير اسمه مثلا 31 | \InlineCode{result} 32 | من نوع 33 | \InlineCode{int} 34 | و نقوم بالحساب: 35 | 36 | \begin{Csource} 37 | int result = 0; 38 | result = 5 + 3; 39 | \end{Csource} 40 | 41 | لا يجب أن تكون محترفا في الحساب الذهني لتعرف أن النتيجة ستكون 8 بعد تشغيل البرنامج.\\ 42 | بالطبع البرنامج لن يظهر أية نتيجة باستعمال هذه الشفرة المصدرية. إذا أردت معرفة محتوى المتغير 43 | \InlineCode{result} 44 | عليك باستعمال الدالة 45 | \InlineCode{printf} 46 | التي تجيد كيفية استخدامها جيدًا الآن: 47 | 48 | \begin{Csource} 49 | printf("5 + 3 = %d", result); 50 | \end{Csource} 51 | 52 | و هذا ما سيظهر على الشاشة: 53 | 54 | \begin{Console} 55 | 5 + 3 = 8 56 | \end{Console} 57 | 58 | و هكذا ننهى عملية الجمع بسهولة.\\ 59 | الأمر مماثل بالنسبة للعمليات الأخرى، نحتاج تغيير الرمز ليس إلا: 60 | 61 | \begin{Table}{2} 62 | العمليّة & الرمز\\ 63 | الجمع & \texttt{+}\\ 64 | الطرح & \texttt{-}\\ 65 | الضرب & \texttt{*}\\ 66 | القسمة & \texttt{/}\\ 67 | الترديد & \texttt{\%}\\ 68 | \end{Table} 69 | 70 | إذا كنت قد استعملت من قبل الآلة الحاسبة الخاصة بحاسوبك، فيفترض بك أن تكون متعوّدا على هذه الإشارات. لا يوجد أي شيء صعب بخصوصها باستثناء القسمة والترديد اللذان سأشرحهما فيما يلي بالتفصيل. 71 | 72 | \subsection{القسمة} 73 | 74 | ينجز الحاسوب عملية القسمة بشكل طبيعيّ عندما لا يوجد أي باق. مثلا العملية 75 | \InlineCode{6 / 2} 76 | تعطينا النتيجة 3، النتيجة صحيحة. حتّى الآن، لا مشكلة. 77 | 78 | لكن لو نأخذ الآن عملية قسمة بباقٍ مثل 79 | \InlineCode{5 / 2} 80 | \dots 81 | نتوقع أن النتيجة ستكون $ 2.5 $، ولكن أنظر إلى ما تعطيه الشفرة: 82 | 83 | \begin{Csource} 84 | int result = 0; 85 | result = 5 / 2; 86 | printf("5 / 2 = %d", result); 87 | \end{Csource} 88 | 89 | \begin{Console} 90 | 5 / 2 = 2 91 | \end{Console} 92 | 93 | هناك مشكل كبير، فنحن نتوقّع أن نحصل على القيمة $ 2.5 $، لكن الحاسوب أعطى القيمة $ 2 $! 94 | 95 | هل يا ترى أجهزتنا غبية لهذه الدرجة؟\\ 96 | في الواقع، يقوم الجهاز بعملية قسمة صحيحة (إقليدية) أي أنه يحتفظ بالجزء الصحيح فقط الذي هو 2. 97 | 98 | \begin{question} 99 | هه أنا أعرف السبب! لأن المتغير 100 | \InlineCode{result} 101 | الذي استخدمناه هو من نوع 102 | \InlineCode{int}! 103 | لو استخدمنا النوع 104 | \InlineCode{double} 105 | لاستطاع تخزين العدد العشري! 106 | \end{question} 107 | 108 | لا، ليس هذا هو السبب! جرب نفس الشفرة بتغيير نوع النتيجة إلى 109 | \InlineCode{double} 110 | و ستجد بأننا نتحصّل على نفس النتيجة 2 لأن طرفا العملية من نوع 111 | \InlineCode{int} 112 | فإن الحاسوب سيعيد نتيجة من نوع 113 | \InlineCode{int}. 114 | 115 | إن أردنا أن يظهر لنا الجهاز القيمة الصحيحة، يجب أن نغير العددين $ 2 $ و$ 5 $ إلى عددين عشريين كالتالي: $ 2.0 $ و$ 5.0 $(قيمتهما هي نفسها لكن الجهاز سيعتبرهما عددين عشريين، وبالتالي هو يظن بأنه يقوم بقسمة عددين عشريين): 116 | 117 | \begin{Csource} 118 | double result = 0; 119 | result = 5.0 / 2.0; 120 | printf("5 / 2 = %f", result); 121 | \end{Csource} 122 | 123 | \begin{Console} 124 | 5 / 2 = 2.500000 125 | \end{Console} 126 | 127 | هنا العدد صحيح بالرغم من وجود عدة أصفار في نهاية العدد، لكنّ القيمة تبقى نفسها. 128 | 129 | فكرة القسمة الإقليدية التي يقوم بها الحاسوب مهمة، تذكّر أنه بالنسبة للحاسوب: 130 | 131 | \begin{itemize} 132 | \item $ 5 / 2 = 2 $، 133 | \item $ 10 / 3 = 3 $، 134 | \item $ 4 / 5 = 0 $. 135 | \end{itemize} 136 | 137 | هذا مفاجئ بعض الشيء، لكنّها طريقته في التعامل مع الأعداد الصحيحة. 138 | 139 | إن أردت الحصول على نتيجة عشريّة، فيجب أن يكون حدّا العملية عشريّين: 140 | 141 | \begin{itemize} 142 | \item $ 5.0 / 2.0 = 2.5 $، 143 | \item $ 10.0 / 3.0 = 3.33333 $، 144 | \item $ 4.0 / 5.0 = 0.8 $. 145 | \end{itemize} 146 | 147 | يمكن القول أن الجهاز يطرح على نفسه السؤال: "كم يوجد من 2 في العدد 5؟" طبعا يوجد 2 فقط. 148 | 149 | و لكن أين الباقي من العملية؟ لأنني لما أقول 5 هي أثنين من 2 ، يبقى 1 طبعا، كيف لنا أن نسترجعه؟\\ 150 | هنا يتدخل الترديد الذي كلمتك عنه. 151 | 152 | \subsection{الترديد} 153 | 154 | هو عبارة عن عملية حسابية تسمح بالحصول على باقي عملية القسمة، وهي عملية غير معروفة مقارنة بالعمليات الأربع الأخرى، لكن الجهاز يعتبرها من العمليات القاعدية، ويمكن اعتبارها حلا لمشكل قسمة الأعداد الطبيعية. 155 | 156 | كما قلت لك الترديد يمثل بالرمز 157 | \InlineCode{\%}.\\ 158 | إليكم بعض الأمثلة: 159 | 160 | \begin{itemize} 161 | \item $ 5 \% 2 = 1 $، 162 | \item $ 14 \% 3 = 2 $، 163 | \item $ 4 \% 2 = 0 $. 164 | \end{itemize} 165 | 166 | الترديد 167 | \InlineCode{5 \% 2} 168 | هو باقي العملية 169 | \InlineCode{5 / 2} 170 | مما يعني أن الجهاز يقوم بالعملية 171 | \InlineCode{5 = 2 * 2 + 1} 172 | حيث أن 1 هو الباقي والذي يقوم بإرجاعه الترديد. 173 | 174 | نفس الشيء بالنسبة للعملية 175 | \InlineCode{14 \% 3}، 176 | العملية هي 177 | \InlineCode{14 = 3 * 4 + 2} 178 | (الترديد يعطي القيمة 2). أخيرا، من أجل 179 | \InlineCode{4 \% 2}، 180 | القسمة تامة، فلا يوجد باقي، لهذا يعطي الترديد القيمة 0. 181 | 182 | حسنا، لا يوجد ما يمكنني إضافته بخصوص عملية الترديد. كان هذا فقط شرحا لمن لا يعرفها. 183 | 184 | لدي خبر جيد آخر، وهو أننا أتممنا كلّ عمليات الحساب القاعدية وتخلصنا من درس الرياضيات! 185 | 186 | \subsection{عمليات على المتغيرات} 187 | 188 | الشيء الجيد هو أنه بعد أن تعلمت كيف تستخدم العمليات القاعدية، يمكنك الآن أن تتعلّم كيفية القيام بهذه العمليات على المتغيرات.\\ 189 | لا شيء يمكنه منعك من كتابة الشفرة التالية: 190 | 191 | \begin{Csource} 192 | result = number1 + number2; 193 | \end{Csource} 194 | 195 | هذا السطر يعمل على جمع المتغيرين 196 | \InlineCode{number1} 197 | و 198 | \InlineCode{number2} 199 | ثم يخزن النتيجة في المتغير 200 | \InlineCode{result}. 201 | 202 | هنا بدأت الأمور الممتعة تظهر، وحقيقة، مستواك الحالي يسمح لك ببرمجة آلة حاسبة بسيطة. نعم، نعم، أؤكّد لك ذلك! 203 | 204 | تخيل وجود برنامج يطلب من المستخدم إدخال عددين، ثم يقوم بتخزينهما في متغيرين، ثم يجمع هذين المتغيرين ويخزن النتيجة في متغير اسمه 205 | \InlineCode{result}. 206 | لم يبق سوى إظهار النتيجة على الشاشة في وقت لا يتمكّن فيه المستخدم حتى من تخمين النتيجة. 207 | 208 | حاول كتابة هذا البرنامج البسيط، إنّه سهل وسيكون تدريبا لك! 209 | 210 | إليك الجواب: 211 | 212 | \begin{Csource} 213 | int main(int argc, char * argv[]) 214 | { 215 | int result = 0, number1 = 0, number2 = 0; 216 | 217 | // We request the two numbers from the user : 218 | 219 | printf("Enter the first number : "); 220 | scanf("%d", &number1); 221 | printf("Enter the second number : "); 222 | scanf("%d", &number2); 223 | 224 | // We calculate the result : 225 | 226 | result = number1 + number2; 227 | 228 | // We display the result on the screen : 229 | 230 | printf("%d + %d = %d\n", number1, number2, result); 231 | 232 | return 0; 233 | } 234 | \end{Csource} 235 | 236 | \begin{Console} 237 | Enter the first number : 30 238 | Enter the second number : 25 239 | 30 + 25 = 55 240 | \end{Console} 241 | 242 | بدون أن تشعر، لقد أنشأت أول برنامج لك ذو فائدة. إنّه قادر على جمع عددين وإظهارا النتيجة على الشاشة! 243 | 244 | يمكنك التجريب باستخدام أعداد أخرى (يجب ألا تتجاوز الحد الأقصى لتحمّل نوع \InlineCode{int}) 245 | و سيقوم الحاسوب بالحساب بشكل سريع جدًا لا يتجاوز بعض أجزاء من المليار من الثانية! 246 | 247 | أنصحك أيضًا بتجريب العمليات الأخرى (الطرح، القسمة والضرب) لكي تتدرب. لن يكون هذا متعبا إلّا بقدر تغيير إشارة أو اثنتين. يمكنك أيضًا إضافة متغير ثالث وجمع ثلاثة متغيرات دفعة واحدة. سيشتغل البرنامج دون مشاكل: 248 | 249 | \begin{Csource} 250 | result = number1 + number2 + number3; 251 | \end{Csource} 252 | 253 | \section{الاختصارات} 254 | 255 | كما وعدتك، لا توجد عمليات أخرى لنتعلّمها اليوم لأن هذه هي كلّ العمليات الموجودة! بهذه العمليات البسيطة يمكنك برمجة أي شيء تريده. أعلم أنّه يصعب عليك التصديق لو قلت لك أن لعبة ثلاثية الأبعاد ليست في النهاية سوى مجموعة من عمليات الجمع والطرح\dots 256 | لكنها الحقيقة. 257 | 258 | توجد طرق في لغة \textenglish{C} 259 | تسمح لنا باختصار كتابة بعض العمليات. لماذا نستعمل هذه الاختصارات؟ لأننا نحتاج في غالب الأحيان من كتابة عمليات مكرّرة. ستفهم ما أريد قوله حينما ترون ما نسمّيه بالزيادة. 260 | 261 | \subsection{الزيادة (\textenglish{Incrementation})} 262 | 263 | في غالب الأحيان ستضطر إلى إضافة 1 إلى محتوى متغير. وبالتقدّم في برنامجك، تكون لديك متغيرات يزيد محتواها في كلّ مرة بـ1. 264 | 265 | نفترض أن لديك متغيرا يحمل اسم 266 | \InlineCode{number}، 267 | هل تعرف كيف تضيف له 1 دون أن تعرف محتواه؟ 268 | 269 | إليك ما يجب عليك فعله: 270 | 271 | \begin{Csource} 272 | number = number + 1; 273 | \end{Csource} 274 | 275 | ما الذي يحصل هنا؟ نقوم بالحساب 276 | \InlineCode{number + 1} 277 | ثم نخزن الناتج في المتغير 278 | \InlineCode{number}! 279 | و منه فإن كان المتغير يحمل القيمة 4 فهو بعد العملية يحمل القيمة 5. لو أنه كان يحمل القيمة 8، فهو الآن يحمل القيمة 9، إلخ. 280 | 281 | هذه العملية تتكرر كثيرا. وبما أن المبرمج شخص كسول، سيتعبه أمر كتابة اسم المتغير مرتين في نفس التعليمة (نعم هذا أمر متعب!). لهذا تم اختراع اختصار لهذه العملية بما نسميه بـ\textbf{الزيادة } 282 | (\textenglish{Incrementation}) 283 | التعليمة أسفله تعطي تماما نفس نتيجة التعليمة السابقة: 284 | 285 | \begin{Csource} 286 | number++; 287 | \end{Csource} 288 | 289 | هذا السطر له نفس وظيفة السطر السابق الذي كتبناه قبل قليل، أليس مختصرا وقصيرا؟ إنه يعني "إضافة 1 لمتغير". يكفي إذا أن نرفق باسم المتغير 290 | \InlineCode{number} 291 | الاشارة + مرتين، مع عدم نسيان الفاصلة المنقوطة الخاصة بنهاية التعليمة. 292 | 293 | هذه العملية ستساعدنا كثيرا مستقبلا لأننا سنضطر للقيام بعملية الزيادة كثيرا. 294 | 295 | \begin{information} 296 | إذا كنت دقيق الملاحظة، كنت لتلحظ أن إشارتي 297 | ++ 298 | متواجدتان أيضًا في اسم اللغة 299 | \textenglish{C++}. 300 | أنت الآن قادر على أن تفهم السر وراء ذلك! \textenglish{C++} 301 | تعني أننا نتكلم عن لغة \textenglish{C} 302 | "مع زيادة". عمليّا، يسمح لنا \textenglish{C++} 303 | بالبرمجة بطريقة مختلفة، لكن لا يعني أنه "أفضل" من \textenglish{C}. 304 | هو فقط مختلف. 305 | \end{information} 306 | 307 | \subsection{الإنقاص (\textenglish{Decrementation})} 308 | 309 | إنّها بكلّ بساطة عكس عملية الزيادة، فهي تقوم بإنقاص 1 من متغير.\\ 310 | بالرغم من أن عملية الزيادة هي أكثر استعمالًا إلا أن عملية الإنقاص تبقى شائعة أيضا. 311 | 312 | إليكم كيف ننقص 1 من متغير بالشكل "الطويل": 313 | 314 | \begin{Csource} 315 | number = number - 1; 316 | \end{Csource} 317 | 318 | و في شكلها المختصر: 319 | 320 | \begin{Csource} 321 | number--; 322 | \end{Csource} 323 | 324 | ربّما كان بإمكانك تخمين ذلك وحدك! بدل وضع إشارة 325 | \InlineCode{++} 326 | نضع إشارة 327 | \InlineCode{{-}{-}}. 328 | إذا كان محتوى المتغير هو 5 فسيصبح بعد الإنقاص يساوي 4. 329 | 330 | \subsection{الاختصارات الأخرى} 331 | 332 | توجد اختصارات أخرى تعمل بنفس المنطلق. هذه الاختصارات تصلح لكل العمليات القاعدية: 333 | \InlineCode{+} 334 | \InlineCode{-} 335 | \InlineCode{*} 336 | \InlineCode{/} 337 | \InlineCode{\%}. 338 | هي تساعدنا على تجنب تكرار نفس اسم المتغير في نفس التعليمة.\\ 339 | لضرب محتوى المتغير في 2 مثلا نقوم بالتالي: 340 | 341 | \begin{Csource} 342 | number = number * 2; 343 | \end{Csource} 344 | 345 | و بالشكل المختصر: 346 | 347 | \begin{Csource} 348 | number *= 2; 349 | \end{Csource} 350 | 351 | بالطبع إن كان للمتغير القيمة $ 5 $ قبل إجراء العملية فسيحمل الآن $ 10 $ بعد هذه التعليمة.\\ 352 | بالنسبة لباقي العمليات القاعدية، فالمبدأ نفسه. إليك برنامجا صغيرا كمثال: 353 | 354 | \begin{Csource} 355 | int number = 2; 356 | number += 4; // number = 6 ... 357 | number -= 3; // ... number = 3 358 | number *= 5; // ... number = 15 359 | number /= 3; // ... number = 5 360 | number %= 3; // ... number = 2 (because 5 = 1 * 3 + 2) 361 | \end{Csource} 362 | 363 | \textit{(لا تتذمر فبعض الحسابات الذهنيّة لن تقتل شخصًا!)} 364 | 365 | الشيء الجيد هنا أنه يمكننا استعمال اختصارات على كلّ العمليات القاعدية، فيمكننا أن نجمع، نطرح، نضرب أيّ عدد.\\ 366 | هي اختصارات عليك تعلّمها إن كان البرنامج الذي تكتبه يحتوي الكثير من التعليمات المكرّرة. 367 | 368 | تذكّر أيضًا أن عملية الزيادة هي الاختصار الأكثر استعمالًا. 369 | 370 | \section{المكتبة الرياضياتيّة} 371 | 372 | في لغة \textenglish{C} 373 | هناك دائما ما نسميه بالمكتبات القياسية 374 | (\textenglish{Standard libraries})، 375 | وهي المكتبات التي تستخدم على الدوام. إنّها مكتبات قاعدية تستخدم كثيرا. 376 | 377 | أذكرك بما قلت سابقا، المكتبة هي مجموعة دوال جاهزة. هذه الدوال تمت كتابتها من طرف مبرمجين قبلك، وهي تساعدك على تجنب إعادة اختراع العجلة في كلّ برنامج جديد. 378 | 379 | في الواقع، العمليات الخمس القاعدية الّتي رأيناها هي أقلّ من أن تكون كافية. إذا لم تفهم هذا، فربّما قد تكون صغيرا في السنّ أو لم تتعلّم الكثير عن الرياضيّات في حياتك. المكتبة الرياضياتيّة تحوي العديد من الدوال الأخرى الّتي قد تحتاجها. 380 | 381 | 382 | أعطيك مثالا، لغة \textenglish{C} 383 | لا تحتوي على عملية الأس! كيف نحسب المربع؟ يمكنك كتابة العملية 384 | \InlineCode{$5~\hat{}~2$} 385 | في برنامجك لكن الجهاز لن يفهمها أبدًا لأنّه لا يعرف مالّذي تعنيه هذه، إلا إن قمت بشرح العملية له باستخدام المكتبة الرياضياتيّة! 386 | 387 | يمكننا الاستعانة بالدوال الجاهزة في المكتبة الرياضياتيّة، لكن لا تنس كتابة توجيهات المعالج القبلي الخاصة بها في بداية كل برنامج: 388 | 389 | \begin{Csource} 390 | #include 391 | \end{Csource} 392 | 393 | ما إن تكتب السطر السابق حتّى تصبح قادرًا على استخدام كل الدوال المتوفرة في هذه المكتبة. 394 | 395 | لديّ نيّة في عرضها لك الآن.\\ 396 | حسنا، بما أنّه يوجد الكثير منها، فلا يمكنني إنشاء قائمة كاملة هنا. من جهة لأنّ هذا سيكون كثيرا للفهم، ومن ناحية أخرى، فأصابعي المسكينة ستذوب قبل إنهاء كتابة هذا الفصل! سأريك إذن الدوال الرئيسيّة فقط، أي الّتي تبدو أكثر أهميّة. 397 | 398 | \begin{information} 399 | ربّما قد لا يكون لديك مستوى الرياضيات اللازم لفهم ما تفعله هذه الدوال. إن كان هذا هو حالك، فلا تقلق. قم بالقراءة فقط، فهذا لن يضرّك فما يلي.\\ 400 | على الرغم من ذلك، أقدّم لك نصيحة مجّانيّة: كن منتبها في دروس الرياضيات، لا نقول هذا من دون سبب، هذا سيفيدك في النهاية. 401 | \end{information} 402 | 403 | \subsection{\texttt{fabs}} 404 | 405 | هذه الدالة تحسب القيمة المطلقة للرقم، ونرمز لها بالشكل التالي: 406 | \textenglish{|x|}.\\ 407 | القيمة المطلقة لعدد هو قيمته الموجبة: 408 | 409 | \begin{itemize} 410 | \item إعطاء العدد $ -52 $ للدالة يجعلها ترجع القيمة $ 52 $، 411 | \item إعطاء العدد $ 52 $ للدالة يجعلها تعيد $ 52 $. 412 | \end{itemize} 413 | 414 | باختصار، تعيد دائما العدد الموجب الموافق لما أعطيته لها. 415 | 416 | \begin{Console} 417 | double absolute = 0, number = -27; 418 | absolute = fabs(number); // absolute = 27 419 | \end{Console} 420 | 421 | هذه الدالّة تعيد 422 | \InlineCode{double}، 423 | لذا فالمتغيّر 424 | \InlineCode{absolute} 425 | يجب أن يكون من نوع 426 | \InlineCode{double}. 427 | 428 | \begin{information} 429 | هناك دالة اخرى مماثلة لـ\InlineCode{fabs} 430 | تسمى 431 | \InlineCode{abs}، 432 | نجدها في 433 | \InlineCode{stdlib.h}.\\ 434 | إنّها تعمل بنفس طريقة الأولى إلا أنها تعمل مع الأعداد الصحيحة، فهي تعيد 435 | \InlineCode{int}. 436 | \end{information} 437 | 438 | \subsection{\texttt{ceil}} 439 | 440 | هذه الدالّة تعطي أول عدد طبيعي بعد العدد العشري الذي نعطيه لها. يمكن القول أنها تدوّر العدد دائما إلى العدد الذي يعلوه في الجزء الصحيح.\\ 441 | لو نعطيها مثلا العدد $ 26.512 $ فستعطينا العدد $ 27 $. 442 | 443 | الدالة تعمل بنفس الطريقة وتعيد 444 | \InlineCode{double} 445 | أيضا: 446 | 447 | \begin{Csource} 448 | double above = 0, number = 52.71; 449 | above = ceil(number); // Above = 53 450 | \end{Csource} 451 | 452 | \subsection{\texttt{floor}} 453 | هذه عكس السابقة، تعيد العدد الأقل مباشرة في الجزء الصحيح.\\ 454 | إذا أعطيتها مثلا العدد $ 37.91 $ تعطيني العدد $ 37 $، يعني الجزء الصحيح. 455 | 456 | \subsection{\texttt{pow}} 457 | 458 | هذه خاصة بحساب قوى عدد (الأسس). يجب أن تعطيها قيمتين، الأولى هي العدد الذي تريد إجراء العملية عليه والثانية هي القوة الّتي يجب رفع العدد إليها. هذا مخطط الدالة: 459 | 460 | \begin{Csource} 461 | pow(number, power); 462 | \end{Csource} 463 | 464 | كمثال: "2 قوة 3" (الّتي نكتبها عادة 465 | \InlineCode{$2~\hat{}~3$} 466 | على الحاسوب) هو الحساب 467 | $ 2 \times 2 \times 2 $ 468 | الّذي يعطي النتيجة 8: 469 | 470 | \begin{Csource} 471 | double result = 0, number = 2; 472 | result = pow(number, 3); // result = 2^3 = 8 473 | \end{Csource} 474 | 475 | \subsection{\texttt{sqrt}} 476 | 477 | هذه الدالة تحسب الجذر التربيعي لعدد، تعيد 478 | \InlineCode{double}. 479 | 480 | \begin{Csource} 481 | double result = 0, number = 100; 482 | result = sqrt(number); // Result = 10 483 | \end{Csource} 484 | 485 | \subsection{\texttt{sin}، \texttt{cos}، \texttt{tan}} 486 | 487 | إنّها الدوال المثلثية الثلاث الشهيرة.\\ 488 | طريقة عملها هي نفسها، تعيد 489 | \InlineCode{double}. 490 | 491 | هذه الدوال تأخذ قيما بـ\textbf{الراديان} 492 | (\textenglish{Radians}). 493 | 494 | \subsection{\texttt{asin}، \texttt{acos}، \texttt{atan}} 495 | 496 | و هي الدوال 497 | \textenglish{arcsin}، \textenglish{arccos}، \textenglish{arctan}، 498 | دوال مثلثية أخرى.\\ 499 | تُستخدم بنفس الطريقة وتعيد 500 | \InlineCode{double} 501 | أيضا. 502 | 503 | \subsection{\texttt{exp}} 504 | 505 | هذه الدالة تحسب قيمة الدالة الأسيّة ذات الأساس 506 | \textenglish{e} 507 | لعدد معين.\\ 508 | تعيد 509 | \InlineCode{double}. 510 | 511 | \subsection{\texttt{log}} 512 | 513 | هذه الدالة تحسب اللوغاريتم النيبيري لعدد معين. (الّذي نرمز له أيضا بـ"\textenglish{ln}") 514 | 515 | \subsection{\texttt{log10}} 516 | 517 | هذه الدالة تحسب اللوغاريتم ذو الأساس 10 لعدد. 518 | 519 | \section*{ملخّص} 520 | 521 | \begin{itemize} 522 | \item الحاسوب ما هو سوى 523 | \textbf{آلة حاسبة كبيرة}: كل ما يجيد فعله هو القيام بالعمليّات. 524 | \item العمليات التي يجيدها الحاسوب 525 | \textbf{قاعدية جدا}: الضرب، القسمة، الجمع، الطرح والترديد (باقي القسمة). 526 | \item بالإمكان 527 | \textbf{إجراء عمليات على المتغيرات}، 528 | الحاسوب سريع جدًا في هذا النوع من العمليات. 529 | \item \textbf{الزيادة} 530 | (\textenglish{Incrementation}) 531 | هي عملية إضافة الرقم 1 إلى متغير. نكتبها 532 | \InlineCode{variable++}. 533 | \item \textbf{الإنقاص} 534 | (\textenglish{Decrementation}) 535 | هي عملية طرح الرقم 1 من متغير. نكتبها 536 | \InlineCode{variable{-}{-}}. 537 | \item لزيادة عدد العمليات التي يمكن للحاسوب القيام بها، نستعمل 538 | \textbf{المكتبة الرياضيّاتيّة} 539 | (أي\\ 540 | \InlineCode{\#include }) 541 | \item تحتوي هذه المكتبة على 542 | \textbf{دوال رياضيّاتيّة متقدّمة} 543 | كالأسّ والجذر واللوغاريثم وغيرها. 544 | \end{itemize} 545 | -------------------------------------------------------------------------------- /Chapter_I-7.tex: -------------------------------------------------------------------------------- 1 | \chapter{الحلقات التكرارية (\textenglish{Loops})} 2 | 3 | بعدما تعلمنا كيف ننشئ شروطا بلغة 4 | \textenglish{C}، 5 | سنكتشف معًا 6 | \textbf{الحلقات التكراريّة} (\textenglish{Loops}). 7 | ما هي الحلقة؟ هي تقنية تسمح بتكرار نفس التعليمات عدة مرات. وستساعدنا كثيرا من الآن وصاعدا خاصة في العمل التطبيقي الأوّل الذي ينتظرنا بعد هذا الفصل. 8 | 9 | استرخ: هذا الفصل سيكون سهلًا. لقد تعرفنا سابقا على ما تعنيه المتغيّرات المنطقية 10 | (\textenglish{booleans}) 11 | و الشروط 12 | (\textenglish{conditions}) 13 | في الفصل السابق، وبذلك كنا قد تخلصنا من عمل كبير. من الآن فصاعدًا ستكون الأمور سلسة أكثر ولن يكون في العمل التطبيقي القادم الكثير من المشاكل. 14 | 15 | فلننتهز الفرصة، لأننا لن نتأخر في الدخول في الجزء الثاني من الكتاب. سيكون من الجيّد لك أن تنتبه! 16 | 17 | \section{ماهي الحلقة؟} 18 | 19 | كما قلت سابقًا: هي عبارة عن تعليمة تسمح لنا بتكرار نفس التعليمات عدة مرات. 20 | 21 | تماما مثل الشروط، توجد طرق عديدة لإنشاء الحلقات. ولكن مهما اختلفت الطرائق فالهدف واحد: تكرار تعليمات لعدد معيّن من المرات. \\ 22 | لدينا في لغة 23 | \textenglish{C} 24 | ثلاثة أنواع من الحلقات: 25 | \begin{itemize} 26 | \item \InlineCode{while} 27 | \item \InlineCode{do\dots while} 28 | \item \InlineCode{for} 29 | \end{itemize} 30 | في جميع الحالات يبقى المخطط نفسه: 31 | 32 | \begin{figure}[H] 33 | \centering 34 | \includegraphics[width=0.4\textwidth]{Chapter_I-7_Loop} 35 | \end{figure} 36 | و هذا ما سيحصل بالترتيب: 37 | 38 | \begin{enumerate} 39 | \item الجهاز يقرأ التعليمات من الأعلى إلى الأسفل كالعادة. 40 | \item ما إن يصل لنهاية الحلقة يتوجه نحو التعليمة الأولى. 41 | \item يعيد بعدها قراءة التعليمات كلها من الأعلى إلى الأسفل. 42 | \item يصل لنهاية الحلقة ويعاود الرجوع للأول من جديد وهكذا\dots 43 | \end{enumerate} 44 | 45 | المشكلة في هذا النظام هو أننا إن لم نقم بإيقافه، فالجهاز قادر على تكرار نفس التعليمات إلى ما لانهاية! ولن يتذمّر، أنت تعرف: هو يفعل ما تأمره أنت بفعله\dots يمكنه أن يعلق في حلقة غير منتهية، وهذا النوع من الحالات يعتبر مصدر خوف بالنسبة للمبرمجين. 46 | 47 | و هنا نجد\dots الشروط! فعندما ننشئ حلقة نقوم دائما بتعريف شرطها. هذا الشرط يعني "كرّر الحلقة دون توقف مادام هذا الشرط صحيحا". 48 | 49 | كما قلت، فهناك عدة طرق للقيام بذلك وسنبدأ من دون تأخير بإنشاء حلقة من نوع 50 | \InlineCode{while} 51 | في \textenglish{C}. 52 | 53 | \section{الحلقة \texttt{while}} 54 | 55 | هكذا نشكل حلقة 56 | \InlineCode{while}: 57 | 58 | \begin{Csource} 59 | while (/* Condition */) 60 | { 61 | // The instructions that we want to repeat 62 | } 63 | \end{Csource} 64 | 65 | لا يوجد أبسط من هذا. الكلمة 66 | \InlineCode{while} 67 | تعني "مادام" ، لذا نقول للجهاز: مادام الشرط صحيحا، كرر التعليمات المتواجدة بين الحاضنتين. 68 | 69 | أقترح عليك أن نقوم باختبار بسيط: سنطلب من المستعمل إدخال العدد 47، مادام لم يقم بإدخاله، نطلب منه إعادة إدخاله مجددًا\dots ولن يتوقف البرنامج حتى يقوم المستعمل بإدخال العدد 47 (نعم أعرف، إنه عمل شيطاني): 70 | 71 | \begin{Csource} 72 | int entredNumber = 0; 73 | while (entredNumber != 47) 74 | { 75 | printf("Enter the number 47 ! "); 76 | scanf("%d", &entredNumber); 77 | } 78 | \end{Csource} 79 | 80 | أنظر إلى الاختبار الذي قمت به، للعلم أنني تعمدت الخطأ ثلاث مرات: 81 | 82 | \begin{Console} 83 | Enter the number 47 ! 10 84 | Enter the number 47 ! 27 85 | Enter the number 47 ! 40 86 | Enter the number 47 ! 47 87 | \end{Console} 88 | 89 | يتوقف البرنامج بعد إدخال العدد 47.\\ 90 | هذه الحلقة 91 | \InlineCode{while} 92 | ستتكرر مادام المستعمل لم يدخل العدد 47، لا يوجد أسهل من هذا. 93 | 94 | الآن لنجعل الأمر ممتعًا أكثر: نريد من الحلقة أن تتوقف بعد عدد معين من التكرارات.\\ 95 | لهذا سنستعين بمتغير 96 | \InlineCode{counter} 97 | الذي سيأخذ القيمة $ 0 $ في بداية البرنامج ثم نقوم 98 | \textbf{بزيادته}، 99 | هل تتذكر ما قلناه في الفصل السابق حول الزيادة 100 | (\textenglish{incrementation})؟ 101 | التي تنص على إضافة 1 لمتغير حينما نكتب 102 | \InlineCode{variable++}. 103 | 104 | إقرأ جيدا الشفرة المصدرية التالية وحاول التمعن فيها وفهمها: 105 | 106 | \begin{Csource} 107 | int counter = 0; 108 | while (counter < 10) 109 | { 110 | printf("Hello !\n"); 111 | counter++; 112 | } 113 | \end{Csource} 114 | 115 | النتيجة: 116 | 117 | \begin{Console} 118 | Hello ! 119 | Hello ! 120 | Hello ! 121 | Hello ! 122 | Hello ! 123 | Hello ! 124 | Hello ! 125 | Hello ! 126 | Hello ! 127 | Hello ! 128 | \end{Console} 129 | 130 | البرنامج يكرر عشر مرات العبارة 131 | "\textenglish{Hello !}" 132 | 133 | \begin{question} 134 | كيف يعمل هذا بالتحديد؟ 135 | \end{question} 136 | 137 | \begin{enumerate} 138 | \item في البداية لدينا متغير 139 | \InlineCode{counter} 140 | مهيّأ على القيمة الابتدائية 0. 141 | \item الحلقة 142 | \InlineCode{while} 143 | تأمر بالتكرار مادامت قيمة المتغير 144 | \InlineCode{counter} 145 | أصغر من 10. بما أن قيمة المتغير 146 | \InlineCode{counter} 147 | هي 0 في البداية، فإننا ندخل في الحلقة لأن الشرط محقق. 148 | \item نقوم بإظهار الرسالة 149 | "\textenglish{Hello !}" 150 | على الشاشة باستخدام الدالة 151 | \InlineCode{printf}. 152 | \item نقوم بزيادة قيمة المتغير 153 | \InlineCode{counter} 154 | بفضل التعليمة 155 | \InlineCode{counter++;}. 156 | كان المتغير 157 | \InlineCode{counter} 158 | يحمل القيمة 0، أمّا الآن فهو يحمل القيمة 1. 159 | \item نصل لنهاية الحلقة (حاضنة الإغلاق): نعيد العملية من جديد ونتأكد ما إن كان الشرط محققًا أي ما إن كانت قيمة المتغير أصغر من 10؟ في هذه الحالة نعم لأن المتغير 160 | \InlineCode{counter} 161 | يحمل القيمة 1 وهي أصغر من 10 إذا سنمرّ بنفس التعليمة داخل الحاضنتين. 162 | \end{enumerate} 163 | 164 | و هكذا دواليك، 165 | \InlineCode{counter} 166 | تصبح 1، 2، 3،\dots، 8، 9 ثمّ 10. حينها يصبح الشرط 167 | \InlineCode{counter < 10} 168 | غير محقق، وعندها نخرج من الحلقة. 169 | 170 | و يمكننا ملاحظة أن قيمة المتغير 171 | \InlineCode{counter} 172 | تزيد في كلّ مرة بواحد. يمكننا التأكّد بـ\InlineCode{printf}: 173 | 174 | \begin{Csource} 175 | int counter = 0; 176 | while (counter < 10) 177 | { 178 | printf("counter = %d\n", counter); 179 | counter++; 180 | } 181 | \end{Csource} 182 | 183 | \begin{Console} 184 | counter = 0 185 | counter = 1 186 | counter = 2 187 | counter = 3 188 | counter = 4 189 | counter = 5 190 | counter = 6 191 | counter = 7 192 | counter = 8 193 | counter = 9 194 | \end{Console} 195 | 196 | إن كنت قد فهمت المثال السابق فقد فهمت كلّ شيء!\\ 197 | يمكنك الاستمتاع بتجربة أعداد أكبر من 10 ( مثلا 100 أو أي عدد آخر). كان هذا سيفيدني كثيرا في صغري لكتابة العقوبات الّتي كان يجب عليّ تكرارها مائة مرّة. 198 | 199 | \subsection{احذر من الحلقات غير المنتهية! } 200 | 201 | عندما تنشئ حلقة فـ\textbf{تأكّد دائما من جعلها قادرة على التوقف في لحظة معينة!} 202 | إن كان الشرط محققًا دائمًا، فلن يتوقف البرنامج أبدًا! وهذا مثال على حلقة غير منتهية: 203 | 204 | \begin{Csource} 205 | while (1) 206 | { 207 | printf("Infinite loop\n"); 208 | } 209 | \end{Csource} 210 | 211 | تذكر ما قلناه بخصوص القيم المنطقية 212 | (\textenglish{booleans}): 213 | فصحيح = 1 وخاطئ = 0. هنا، الشرط محقق دائمًا وبهذا فإن البرنامج سيستمرّ في كتابة العبارة 214 | "\textenglish{Infinite loop}" 215 | بدون توقّف! 216 | 217 | \begin{information} 218 | لإيقاف برنامج كهذا في \textenglish{Windows}، ليس هناك حلّ سوى الضغط على الزر 219 | \InlineCode{X} 220 | الملوّن بالأحمر في أعلى النافذة بينما على مستخدمي \textenglish{Linux} الضغط على 221 | \InlineCode{Ctrl} + \InlineCode{C} 222 | للخروج من البرنامج. 223 | \end{information} 224 | \textbf{\textbf{\textbf{}}} 225 | لكن توخ الحذر. تجنب دائما الوقوع في الحلقات غير المنتهية، بالرغم من أنها قد تكون مفيدة في بعض الحالات، خصوصا في برمجة ألعاب الفيديو، هذا ما سنراه لاحقًا. 226 | 227 | \section{الحلقة \LR{\texttt{do\dots while}}} 228 | 229 | هذا النوع من الحلقات يشبه كثيرا 230 | \InlineCode{while} 231 | إلا أنه قليل الاستعمال عادة.\\ 232 | الشيء الوحيد الذي يتغيّر هو مكان الشرط في الحلقة. فعِوَض أن يكون الشرط في بداية الحلقة، فهو موجود في نهايتها: 233 | 234 | \begin{Csource} 235 | int counter = 0; 236 | do 237 | { 238 | printf("Hello !\n"); 239 | counter++; 240 | } while (counter < 10); 241 | \end{Csource} 242 | 243 | ما الذي تغير؟\\ 244 | هذا أمر بسيط فالحلقة 245 | \InlineCode{while} 246 | يمكن أن لا يتم تشغيلها أبدًا إذا كان الشرط غير محقق منذ البداية. فمثلا لو وضعنا القيمة 50 كقيمة ابتدائية للمتغير 247 | \InlineCode{counter} 248 | فإن الشرط لن يكون محققًا ولذلك لا ندخل في الحلقة أبدا.\\ 249 | بالنسبة للحلقة 250 | \InlineCode{do\dots while} 251 | فالأمر مختلف: هذه الحلقة تتكرر على الأقل مرة واحدة. في الواقع، اختبار الشرط يتم في نهاية الحلقة كما يمكنك الملاحظة. فلو أعطينا القيمة الإبتدائية 50 للمتغير 252 | \InlineCode{counter} 253 | فإن التعليمة بين الحاضنتين سيتم تشغيلها مرة واحدة. 254 | 255 | لهذا يجب أحيانا استخدام الحلقات من هذا النوع، لنضمن تكرارها للعملية على الأقل مرة واحدة. 256 | 257 | \begin{warning} 258 | هناك استثناء في الحلقة 259 | \InlineCode{do\dots while} 260 | يغفل عنه الكثير من المبتدئين، وهو وجود فاصلة منقوطة في نهاية الحلقة! لا تنس وضع واحدة بعد \InlineCode{while} 261 | و إلا ستظهر لك أخطاء أثناء الترجمة! 262 | \end{warning} 263 | 264 | \section{الحلقة \texttt{for}} 265 | 266 | نظريًا، الحلقة 267 | \InlineCode{while} 268 | تلبي رغبتنا في أي نوع كان من التكرارات.\\ 269 | سابقا، كما رأينا مع الشرط 270 | \InlineCode{switch} 271 | فإنه توجد أيضا طريقة أخرى لكتابة حلقة بشكل مختصر أكثر. 272 | 273 | الحلقات 274 | \InlineCode{for} 275 | مستخدمة كثيرا في البرمجة. لا أملك إحصائيات لكن كن واثقًا أنك ستستخدم الحلقة 276 | \InlineCode{for} 277 | أكثر من الحلقة 278 | \InlineCode{while}. 279 | و لهذا يجب عليك أن تجيد استخدام كلتا الحلقتين. 280 | 281 | و كما قلت لك فالحلقة 282 | \InlineCode{for} 283 | ماهي إلا عبارة عن طريقة أخرى لكتابة الحلقة 284 | \InlineCode{while} 285 | التي رأيناها قبل قليل.\\ 286 | من المثال السابق لدينا: 287 | 288 | \begin{Csource} 289 | int counter = 0; 290 | while (counter < 10) 291 | { 292 | printf("Hello !\n"); 293 | counter++; 294 | } 295 | \end{Csource} 296 | 297 | الشفرة المصدرية المكافئة باستعمال الحلقة 298 | \InlineCode{for}: 299 | 300 | \begin{Csource} 301 | int counter; 302 | for (counter = 0; counter < 10; counter++) 303 | { 304 | printf("Hello !\n"); 305 | } 306 | \end{Csource} 307 | 308 | ما الاختلاف؟ 309 | 310 | \begin{itemize} 311 | \item تلاحظ أننا لم نهيّئ المتغير 312 | \InlineCode{counter} 313 | على قيمة ابتدائية تساوي 0 عند إنشائه (لكنّه كان بإمكاننا فعل ذلك). 314 | \item هناك الكثير من التفاصيل داخل القوسين بعد 315 | \InlineCode{for}، 316 | سنفصل ذلك لاحقًا. 317 | \item لا توجد التعليمة 318 | \InlineCode{counter++;} 319 | في الحلقة. 320 | \end{itemize} 321 | 322 | فلنهتم بما يوجد بين القوسين فهو كل ما يهم في الحلقة 323 | \InlineCode{for}. 324 | هناك ثلاث تعليمات مختلفة نفصل فيما بينها بفواصل منقوطة. 325 | 326 | \begin{itemize} 327 | \item الأولى هي 328 | \textbf{التهيئة} 329 | (\textenglish{initialisation}): 330 | هذه التعليمة تعمل على تحضير المتغير 331 | \InlineCode{counter}. 332 | في حالتنا، تهيئته بالقيمة 0. 333 | \item الثانية هي 334 | \textbf{الشرط} 335 | (\textenglish{condition}): 336 | كما رأينا في الحلقة 337 | \InlineCode{while} 338 | فإن الشرط يخبرنا ما إن كان يجب تكرار الحلقة أم لا. مادام الشرط محققًا فإن الحلقة تستمر في تكرار التعليمات. 339 | \item أخيرا، 340 | \textbf{الزيادة} 341 | (\textenglish{incrementation}): 342 | هذه التعليمة يتم تنفيذها بعد كل التعليمات أي في نهاية الدورة الواحدة وهي تقوم بتعديل قيمة المتغير 343 | \InlineCode{counter} 344 | في كلّ مرة. في غالب الأحيان نقوم بالزيادة، لكن يمكننا أن نستعمل الإنقاص (مثلا 345 | \InlineCode{counter{-}{-}})، 346 | كما يمكننا القيام بعمليّات أخرى، مثلا زيادة قيمة العداد بـ2 347 | (\InlineCode{counter+=2}). 348 | \end{itemize} 349 | 350 | في النهاية، نلاحظ أن حلقة 351 | \InlineCode{for} 352 | ماهي سوى حلقة كتابة مختصرة. تعلّم كيفية استعمالها لأنك ستحتاجها بكثرة! 353 | 354 | \section*{ملخّص} 355 | 356 | \begin{itemize} 357 | \item الحلقات هي تعليمات تسمح لنا بتكرار سلسلة من التعليمات عدة مرات. 358 | \item توجد كثير من الحلقات: 359 | \InlineCode{while}، 360 | \InlineCode{for} 361 | و 362 | \InlineCode{do\dots while}. 363 | كلّ منها يُستعمل في الحالة الّتي يكون فيها مناسبا أكثر. 364 | \item الحلقة 365 | \InlineCode{for} 366 | هي التي سنستعملها بكثرة في التطبيقات. نقوم فيها غالبًا بزيادات أو إنقاصات للمتغيرات. 367 | \end{itemize} 368 | -------------------------------------------------------------------------------- /Chapter_I-8.tex: -------------------------------------------------------------------------------- 1 | \chapter{عمل تطبيقي: "أكثر أو أقل"، لعبتك الأولى} 2 | 3 | نصل اليوم إلى أول عمل تطبيقي. الهدف هو أن أريك أنك قادر على برمجة الكثير من الأشياء بما علّمتك إياه. لأنه في الواقع، الجانب النظري للغة أمر جيّد لكننا إن كنا لا نعرف كيف نطبّق ما تعلّمناه بشكل سلس فلا داعي لإهدار وقتنا بتعلم المزيد. 4 | 5 | صدّق أو لا تصدّق، يسمح لك مستواك الآن ببرمجة أول برنامج ممتع. إنّه لعبة كونسول (أذكّرك بأننا سنصل للبرامج بنافذة لاحقا). مبدأ عمل اللعبة سهل للغاية، وسهل البرمجة، ولهذا اخترتها لتكون موضوع أول عمل تطبيقي لك. 6 | 7 | \section{تجهيزات ونصائح} 8 | 9 | \subsection{مبدأ عمل البرنامج} 10 | 11 | قبل كلّ شيء، سأشرح عمل برنامجنا. إنّه لعبة صغيرة نسمّيها "أكثر أو أقل". 12 | 13 | مبدأ عمل اللعبة هو التالي. 14 | 15 | \begin{enumerate} 16 | \item الجهاز يختار عشوائيا عددا من 1 إلى 100. 17 | \item يطلب منك أن تخمن عددا وبالتالي ستختار بدورك عددا من 1 إلى 100. 18 | \item يقوم الجهاز بمقارنة العدد الذي كتبته بالعدد "الغامض" الّذي حصل عليه عشوائيّا، ثم يقول لك ما إن كان العدد الغامض أصغر أو أكبر من العدد الذي اخترته أنت. 19 | \item ثم يقوم الجهاز بإعادة طلب العدد منك. 20 | \item ثم يقول لك ما إن كان العدد الغامض أصغر أو أكبر من العدد الذي اخترته أنت. 21 | \item وهكذا تستمر العملية حتى تجد أنت ذلك العدد. 22 | \end{enumerate} 23 | و الهدف من اللعبة هو أن تجد العدد الغامض في أقل عدد ممكن من المحاولات بالطبع. 24 | 25 | و هذه "لقطة شاشة" مما يجب أن تكون عليه اللعبة في طور التنفيذ: 26 | 27 | \begin{Console} 28 | What's the number ? 50 29 | Greater ! 30 | What's the number ? 75 31 | Greater ! 32 | What's the number ? 85 33 | Lesser ! 34 | What's the number ? 80 35 | Lesser ! 36 | What's the number ? 78 37 | Greater ! 38 | What's the number ? 79 39 | Bravo, you have found the mysterious number !!! 40 | \end{Console} 41 | 42 | \subsection{اختيار عدد عشوائي} 43 | 44 | \begin{question} 45 | لكن كيف يختار الجهاز عددا عشوائيًا؟ أنا لا أجيد فعل هذا! 46 | \end{question} 47 | 48 | صحيح، نحن لا نجيد كيفية توليد عدد عشوائي. ويجب القول أن طلب ذلك من الحاسوب ليس أمرًا سهلًا: هو يجيد القيام بعمليات حسابية، لكن أن يستخرج عددًا عشوائيا، هذا أمر لا يجيد فعله! 49 | 50 | في الواقع، لـ"محاولة" الحصول على عدد عشوائيّ، يجب القيام بحسابات معقّدة للحاسوب، وهذا ما يعود في النهاية إلى القيام بحسابات! 51 | 52 | لكي نفعل هذا، نميز حلين. 53 | \begin{itemize} 54 | \item إما أن نطلب من المستعمل أن يقوم باختيار عددٍ عشوائي في بداية اللعبة بواسطة الدالة 55 | \InlineCode{scanf}. 56 | هذا يستلزم لاعبين: واحد يقوم بإدخال العدد الغامض والآخر يحاول تخمينه بعد ذلك. 57 | \item نجرّب طريقة ثانية لجعل الجهاز يختار وحده العدد. الشيء الجيّد هنا هي أنّك ستتمكن من لعب اللعبة لوحدك. أمّا الشيء السيّئ هو\dots أنّني مضطرّ لأن أشرح لك كيف تقوم بذلك! 58 | \end{itemize} 59 | 60 | طبعا سنقوم بالاختيار الثاني ولكن إن أردت تجريب الحل الأول فيما بعد فلا شيء يمنعك. 61 | 62 | لاختيار عدد عشوائي نستعمل الدالة 63 | \InlineCode{rand}. 64 | و هي دالة تسمح باختيار عدد بطريقة عشوائية. لكنّنا نريد عددًا بين 1 و100 مثلا (لأننا إن لم نعرف الحدود فستصبح اللعبة معقّدة جدّا). 65 | 66 | للقيام بذلك، سنستخدم العبارة التالية (لا يمكنني أن أطلب منك تخمينها هي أيضًا!): 67 | 68 | \begin{Csource} 69 | srand(time(NULL)); 70 | mysteriousNumber = (rand() % (MAX - MIN + 1)) + MIN; 71 | \end{Csource} 72 | 73 | السطر الأول (الذي بـه 74 | \InlineCode{srand}) 75 | يسمح بتهيئة مولَد الأرقام العشوائية. نعم الأمر صعب قليلًا كما أخبرتك. 76 | \InlineCode{mysteriousNumber} 77 | هو متغير سيحمل العدد العشوائي المختار. 78 | 79 | \begin{warning} 80 | التعليمة 81 | \InlineCode{srand} 82 | لا يجب أن تشغّل إلا مرة واحدة (في بداية البرنامج). فيجب وضع 83 | \InlineCode{srand} 84 | مرة واحدة في البداية، ومرة واحدة فقط. \\ 85 | بعدها يمكنك استعمال القدر الذي تريده من الدالة 86 | \InlineCode{rand} 87 | لاختيار العدد العشوائي. ولكن 88 | \underline{يجب ألّا} 89 | يقرأ جهازك التعليمة 90 | \InlineCode{srand} 91 | مرتين، لا تنس ذلك. 92 | \end{warning} 93 | 94 | \InlineCode{MAX} 95 | و 96 | \InlineCode{MIN} 97 | هما ثابتان، الأول هو العدد الأقصى (100) والثاني هو العدد الأدنى (1)، وأنصحك بتعريف الثابتين في بداية البرنامج هكذا: 98 | 99 | \begin{Csource} 100 | const int MAX = 100, MIN = 1; 101 | \end{Csource} 102 | 103 | \subsection{تضمين المكتبات اللازمة} 104 | 105 | كي يشتغل برنامجك بشكل صحيح، يجب أن تقوم بتضمين المكتبات 106 | \InlineCode{stdlib} 107 | و 108 | \InlineCode{stdio} 109 | و 110 | \InlineCode{time} 111 | (الأخيرة تستعمل من أجل الأعداد العشوائية).\\ 112 | يجب إذن أن يبدأ برنامجك بالتالي: 113 | 114 | \begin{Csource} 115 | #include 116 | #include 117 | #include 118 | \end{Csource} 119 | 120 | \subsection{يكفي شرحا!} 121 | 122 | حسنا، سأتوقف هنا لأنه لو أكملت سأعطيك الشفرة الخاصة ببرمجة اللعبة كاملة! 123 | 124 | \begin{information} 125 | لتوليد الأعداد العشوائية، اضطررت لإعطائك شفرة "جاهزة" دون أن أشرح كيف تعمل بالضبط. عادة، لا أحبّ فعل هذا، لكن لا يوجد خيار هنا لأنني لا أريد تعقيد الأشياء كثيرا حاليّا.\\ 126 | تأكّد أنه ستتعلم فيما يلي الكثير من المفاهيم التي ستسمح لك بفهم هذه الأشياء بنفسك. 127 | \end{information} 128 | 129 | باختصار، أنت تعرف الكثير. لقد شرحت لك المبدأ وأعطيتك صورة عن البرنامج لحظة التشغيل.\\ 130 | بعد كل هذا أنت قادر على كتابة البرنامج لوحدك. 131 | 132 | حان وقت العمل! بالتوفيق! 133 | 134 | \section{التصحيح!} 135 | توقف! من الآن سأجمع الأوراق. 136 | 137 | سأعطيك طريقتي الخاصة لحلّ التطبيق. بالطبع هناك طرائق جيّدة عديدة لفعل ذلك. إن كانت لديك شفرة مصدريّة تختلف عن شفرتي وكانت تشتغل، فمن المحتمل أن تكون جيّدة أيضًا. 138 | 139 | \subsection{تصحيح "أكثر أو أقل"} 140 | 141 | هذا هو التصحيح الذي أقترحه: 142 | 143 | \begin{Csource} 144 | #include 145 | #include 146 | #include 147 | int main ( int argc, char** argv ) 148 | { 149 | int mysteriousNumber = 0, inputNumber = 0; 150 | const int MAX = 100, MIN = 1; 151 | // Generation of random number 152 | srand(time(NULL)); 153 | mysteriousNumber = (rand() % (MAX - MIN + 1)) + MIN; 154 | 155 | do 156 | { 157 | // We request the number 158 | printf("What's the number? "); 159 | scanf("%d", &inputNumber ); 160 | // We compare between inputNumber and mysteriousNumber 161 | if (mysteriousNumber > inputNumber ) 162 | printf("Greater !\n\n"); 163 | else if (mysteriousNumber < inputNumber ) 164 | printf("Lesser !\n\n"); 165 | else 166 | printf ("Bravo, you have found the mysterious number !!!\n\n"); 167 | } while (inputNumber != mysteriousNumber); 168 | return 0; 169 | } 170 | \end{Csource} 171 | 172 | \subsection{الملف التنفيذي والشفرة المصدرية} 173 | 174 | لمن يريد ذلك، اللعبة والشفرة المصدرية متوفّران للتنزيل من هنا: 175 | 176 | \textenglish{\url{https://openclassrooms.com/uploads/fr/ftp/mateo21/plusoumoins.zip} \mbox{(7 Ko)}} 177 | 178 | \begin{information} 179 | الملف التنفيذي 180 | (\InlineCode{.exe}) 181 | مترجم لـ\textenglish{Windows}، لذا إن كنت تستخدم نظام تشغيل آخر فيجب عليك إعادة ترجمة البرنامج ليشتغل عندك. 182 | \end{information} 183 | 184 | يوجد مجلّدان، واحد فيه الملف التنفيذي (مترجم لـ\textenglish{Windows}، أكرّر) وآخر فيه ملفات الشفرة المصدرية. 185 | 186 | في حالة "أكثر أو أقل"، المصادر بسيطة جدّا: يوجد فقط الملف 187 | \InlineCode{main.c}.\\ 188 | لا تفتح هذا الملفّ مباشرة، افتح أوّلا البيئة التطويرية الّتي تفضّلها، ثم أنشئ مشروعا جديدًا من نوع 189 | \textenglish{Console} 190 | و قم باستيراد الملف 191 | \InlineCode{main.c}. 192 | يمكنك ترجمة البرنامج من جديد للتجريب كما يمكنك التعديل عليه إن أردت. 193 | 194 | \subsection{الشرح} 195 | 196 | سأشرح الآن الشفرة المصدريّة الخاصة بي بدءً من الأعلى: 197 | 198 | \subsubsection{توجيهات المعالج القبلي} 199 | 200 | هي الأسطر التي تبدأ بعلامة 201 | \InlineCode{\#} 202 | في الأعلى. وهي تقوم بتضمين المكتبات التي نحتاج إليها.\\ 203 | أعطيتها لك جاهزة أعلاه، لذلك فإن استطعت ارتكاب خطأ هنا، فأنت قويّ جدّا! 204 | 205 | \subsubsection{المتغيرات} 206 | 207 | لم نحتج الكثير منها.\\ 208 | احتجنا فقط واحدا للعدد الذي يدخله المستعمل 209 | (\InlineCode{inputNumber}) 210 | و ثانٍ لكي نسمح للجهاز بتوليد عدد عشوائي 211 | (\InlineCode{mysteriousNumber}). 212 | 213 | قمت بتعريف الثوابت كما ذكرت في بداية هذا الفصل. الشيء الجيد أيضًا هو إمكانية تحديد صعوبة اللعبة (بوضع أعلى قيمة هي 1000 مثلا)، يكفي أن نعدّل على هذا السطر ونعيد ترجمة البرنامج. 214 | 215 | \subsubsection{الحلقة} 216 | 217 | لقد اخترت الحلقة 218 | \InlineCode{do\dots while}. 219 | نظريّا، حلقة 220 | \InlineCode{while} 221 | بسيطة يمكنها أن تقوم بالمهمة أيضا، لكنّي وجدت بأن استخدام 222 | \InlineCode{do\dots while} 223 | منطقيّ أكثر. 224 | 225 | لماذا؟ لأنه إن كنت تتذكر، 226 | \InlineCode{do\dots while} 227 | هي حلقة تسمح لنا بتشغيل التعليمات بين الحاضنتين على الأقل مرّة واحدة. ونحن سنطلب من المستعمل إدخال العدد الغامض لمرة واحدة على الأقل أيضًا (فالمستعمل غير قادر على تخمين العدد في أقل من محاولة واحدة، إلا إن كان شخصًا خارقًا!). 228 | 229 | في كلّ دورة من الحلقة نطلب من المستعمل إدخال عدد. نقوم بتخزين القيمة في المتغير 230 | \InlineCode{inputNumber}.\\ 231 | بعدها، نقارن المتغير السابق بالمتغير 232 | \InlineCode{mysteriousNumber}. 233 | هنا نجد ثلاثة احتمالات: 234 | 235 | \begin{itemize} 236 | \item يكون العدد الغامض أكبر من العدد الذي أدخله المستعمل وبالتالي تظهر على الشاشة العبارة 237 | "\textenglish{Greater !}". 238 | \item يكون العدد الغامض أصغر من العدد الذي أدخله المستعمل وبالتالي تظهر على الشاشة العبارة 239 | "\textenglish{Lesser !}". 240 | \item يكون العدد الغامض لا أكبر ولا أصغر من الّذي أدخله المستعمل، أي أنّه مساوٍ بالضرورة! وبالتالي تظهر على الشاشة العبارة 241 | "\textenglish{Bravo, you have found it !}". 242 | \end{itemize} 243 | 244 | يجب أن تضع شرطا للحلقة. وهذا سهل للإيجاد: نعيد تشغيل الحلقة 245 | \textbf{مادام العدد الذي تم إدخاله لا يساوي العدد الغامض}.\\ 246 | و ما إن يتم إدخال العدد المطلوب تتوقف الحلقة وبالتالي ينتهى البرنامج هنا. 247 | 248 | \section*{أفكار للتحسين} 249 | 250 | لم تعتقد أنّي أريد للعمل التطبيقي أن ينتهي هنا؟ أنا أصرّ على أن تقوم بتحسين البرنامج، من أجل التدريب. ولتتأكد بأنه مع التدريب ستتطور قدراتك! من يعتقد أنه يقرأ الدروس ولا يطبّق ما جاء فيها فهو مخطئ، أقولها وأكررها! 251 | 252 | لقد عرفت أنّه لديّ خيال واسع، وحتى بكونه برنامجًا سهلًا فأنا أملك أفكارا لتطويره! 253 | 254 | لكن احذر هذه المرة فلن أعطيك التصحيح، عليك أن تتدبّر أمرك بنفسك! فإن كانت لديك حقّا مشاكل، فيمكنك زيارة منتديات 255 | \href{http://www.siteduzero.com/forum-81-126-langage-c.html}{\textenglish{OpenClassrooms}} 256 | من أجل طلب المساعدة من الآخرين. 257 | 258 | \begin{itemize} 259 | \item \textbf{ضع عدادا للمحاولات}، 260 | وهو متغير نقوم بزيادة قيمته في كلّ مرة عندما لا يجد المستعمل الرقم الغامض. بمعنى آخر في كل مرة يعود فيها البرنامج لتشغيل الحلقة، وعند انتهاء اللعبة تقوم بإظهار عدد المحاولات للاعب هكذا مثلا: 261 | "\textenglish{Bravo ! you have found in 3 tries only !}". 262 | \item في هذا البرنامج، عندما يجد اللاعب العدد الغامض يتوقف البرنامج، لماذا لا نجعل البرنامج يسأله ما إن أراد 263 | \textbf{جولة ثانية}؟\\ 264 | إذا أردت تطبيق الفكرة فيجب عليك وضع حلقة تشمل تقريبا كل برنامجك. وهذه الحلقة تتكرر 265 | \underline{مادام} 266 | اللاعب لم يطلب إيقاف البرنامج، وأنصحك بإضافة متغير منطقي اسمه مثلا 267 | \InlineCode{continuePlaying} 268 | ذي قيمة ابتدائية مساوية لـ1. إذا طلب اللاعب إيقاف البرنامج، تُغيّر القيمة لـ0 ويتوقف البرنامج. 269 | \item \textbf{أنشئ وضع لاعبين}! 270 | يعني بالإضافة إلى وضع اللاعب الواحد، ضع إمكانية اشتراك لاعبين!\\ 271 | لهذا عليك بصنع قائمة 272 | (\textenglish{menu}) 273 | في البداية لتطلب من المستخدم اختيار لاعب واحد أو لاعبين إثنين. الفرق بين الوضعين هو توليد العدد الغامض، ففي الحالة الأولى نستعمل الدالة 274 | \InlineCode{rand} 275 | وفي الحالة الثانية نستعمل الدالة 276 | \InlineCode{scanf}! 277 | \item \textbf{إنشاء مستويات مختلفة لصعوبة اللعبة}. 278 | يمكنك وضع قائمة في البداية ليختار المستخدم فيه المستوى وهذا مثال: 279 | \begin{itemize} 280 | \item 1 = بين 1 و100، 281 | \item 2 = بين 1 و1000، 282 | \item 3 = بين 1 و10000. 283 | \end{itemize} 284 | لفعل هذا يجب التعديل على الثابت 285 | \InlineCode{MAX}. 286 | بطبيعة الحال لا يمكننا أن نسميه ثابتا إن كانت قيمته تتغير أثناء البرنامج! قم بتغيير اسم هذا المتغير إلى 287 | \InlineCode{maximumNumber} 288 | ولا تنس نزع الكلمة المفتاحية 289 | \InlineCode{const} 290 | لأنه ببقاءها يبقى ثابتا!). تتغير قيمة هذه المتغير حسب المستوى المختار. 291 | \end{itemize} 292 | 293 | ستساعدك هذه التحسينات على الاشتغال قليلًا. لا تتردد في إيجاد أفكار أخرى لتطوير هذه اللعبة، أعلم أنّه يوجد! ولا تنس أن المنتديات في خدمتك في حالة واجهت صعوبات. 294 | -------------------------------------------------------------------------------- /Chapter_II-3.tex: -------------------------------------------------------------------------------- 1 | \chapter{الجداول (\textenglish{Arrays})} 2 | 3 | هذا الفصل هو ملحق مباشر للفصل المتعلق بالمؤشرات، وسيعلّمك أهميتها أكثر. إن كنت تعتقد بأنك قادر على تفادي المؤشرات فأنت مخطئ! هي في كلّ مكان في لغة \textenglish{C}. لقد حذّرتك! 4 | 5 | سنتعلم في هذا الفصل كيف ننشئ متغيرات من نوع "جداول". الجداول مهمّة للغاية في لغة \textenglish{C} لأنها تساعد في تنظيم سلسلة من القيم. 6 | 7 | نبدأ هذا الفصل ببعض الشروحات والتفسيرات حول كيفية عمل الجداول في الذاكرة (سأقدم لك الكثير من المخططات التفسيرية). هذه المقدمات حول الذاكرة مهمة جدًا: ستساعدك في في معرفة عمل الجداول. فمن المستحسن أن يعرف المبرمج ما يقوم به كي يتحكم في برامجه أكثر، أليس كذلك؟ 8 | 9 | \section{الجداول في الذاكرة} 10 | 11 | \textit{"الجداول هي تتابع متغيرات من نفس النوع، موجودة في مكان متواصل من الذاكرة."} 12 | 13 | أعرف أن هذا التعريف يشبه قليلا تعريف القاموس. لهذا فسأوضح بطريقة أخرى، فعلياّّ، الجدول عبارة عن "متغيّرات ضخمة" يمكن لها أن تحتوي على أعداد كبيرة من نفس النوع 14 | (\InlineCode{char}، 15 | \InlineCode{long}، 16 | \InlineCode{int}، 17 | \InlineCode{double}\dots). 18 | 19 | للجدول طول محدد. يمكنه أن يكون 2، 3، 10 خانات، 150، 2500 خانة، أنت من يحدد العدد. المخطط التالي مثال عن جدول يحجز 4 خانات بدءً بالعنوان 1600: 20 | 21 | \begin{figure}[H] 22 | \centering 23 | \includegraphics[width=0.4\textwidth]{Chapter_II-3_Array-Adresses} 24 | \end{figure} 25 | 26 | عندما تطلب إنشاء جدول يحجز 4 خانات في الذاكرة، سيطلب برنامجك من نظام التشغيل أن يسمح له باستغلال 4 خانات في الذاكرة، ويجب ان تكون هذه الخانات متتالية، يعني الواحدة بجانب الأخرى. وكما ترى أعلاه فالخانات متتابعة 1600، 1601، 1602، 1603 فلا يوجد "فراغ" بينها. 27 | 28 | أخيرًا، كل خانة تحتوي عددا من نفس النوع. فإن كان الجدول من نوع 29 | \InlineCode{int} 30 | فإن كلّ خانة يجب أن تحتوي عددا من نوع 31 | \InlineCode{int}. 32 | و بهذا نفهم أنه لا يمكننا وضع نوع 33 | \InlineCode{int} 34 | مع 35 | \InlineCode{double} 36 | في الجدول نفسه. 37 | 38 | و كتلخيص، هذا أهم ما يجب أن تعرفه بخصوص الجداول: 39 | 40 | \begin{itemize} 41 | \item عندما يتم إنشاء جدول، يأخذ مكانا متواصلًا في الذاكرة. بحيث تكون الخانات متجاورة الواحدة تلو الأخرى. 42 | \item كل خانات الجدول تكون من نفس النوع، فجدول 43 | \InlineCode{int} 44 | يمكن أن يحمل فقط 45 | \InlineCode{int}، 46 | و لا أي نوع آخر. 47 | \end{itemize} 48 | 49 | \section{تعريف جدول} 50 | 51 | كي نبدأ سننشئ جدولا من 4 أعداد من نوع 52 | \InlineCode{int}: 53 | 54 | \begin{Csource} 55 | int table[4]; 56 | \end{Csource} 57 | 58 | هذا كلّ شيء. يكفي إذن أن تضيف قوسين مربعين 59 | (\InlineCode{[} 60 | و 61 | \InlineCode{]}) 62 | عدد الخانات التي تريد أن يحجزها جدولك، واعلم أنه لا يوجد حدود (إلا إن تجاوزت الحدّ الذي تسمح به ذاكرة جهازك طبعا). 63 | 64 | و لكن الآن، كيف نصل لخانة ما في الجدول؟ 65 | هذا سهل، تكفي كتابة 66 | \InlineCode{table[cellNumber]}. 67 | 68 | \begin{critical} 69 | احذر: كل جدول يجب أن يبدأ بالفهرس 70 | (\textenglish{Index}) 71 | رقم 0! جدولنا متكوّن من 4 72 | \InlineCode{int} 73 | إذن فالفهارس المتوفرة هي: 0، 1، 2 و3. لا وجود للفهرس 4 في جدول من 4 خانات! هذا مصدر أخطاء متداولة، فلا تغفل عنه! 74 | 75 | \end{critical} 76 | 77 | إذا كنت أريد أن أضع في جدولي نفس القيم التي في المخطط فيجب إذا أن أكتُب: 78 | 79 | \begin{Csource} 80 | int table[4]; 81 | table[0] = 10; 82 | table[1] = 23; 83 | table[2] = 505; 84 | table[3] = 8; 85 | \end{Csource} 86 | 87 | \begin{question} 88 | لازلت لا أرى العلاقة بين المؤشرات والجداول؟ 89 | \end{question} 90 | 91 | في الواقع، لو تكتب فقط 92 | \InlineCode{table} 93 | فستحصل على مؤشر، وهو مؤشر على الخانة الأولى من الجدول، قم باختبار التالي: 94 | 95 | \begin{Csource} 96 | int table[4]; 97 | printf("%d", table); 98 | \end{Csource} 99 | 100 | النتيجة ستظهر لك العنوان الذي يتواجد به 101 | \InlineCode{table}: 102 | 103 | \begin{Console} 104 | 1600 105 | \end{Console} 106 | 107 | بينما إذا قمت بوضع فهرس الخانة بين قوسين مربعين، فستحصل على القيمة: 108 | 109 | \begin{Csource} 110 | int table[4]; 111 | printf("%d", table[0]); 112 | \end{Csource} 113 | 114 | \begin{Console} 115 | 10 116 | \end{Console} 117 | 118 | نفس الشيء بالنسبة للفهارس الأخرى. بما أن 119 | \InlineCode{table} 120 | هو مؤشر، يمكننا استعمال الرمز 121 | \InlineCode{*} 122 | للحصول على القيمة الأولى: 123 | 124 | \begin{Csource} 125 | int table[4]; 126 | printf("%d", *table); 127 | \end{Csource} 128 | 129 | \begin{Console} 130 | 10 131 | \end{Console} 132 | 133 | يمكن أيضا الحصول على قيمة الخانة الثانية بكتابة 134 | \InlineCode{*(table + 1)} 135 | (أي عنوان الجدول + 1). لذا فهذان السطران متماثلان: 136 | 137 | \begin{Csource} 138 | table[1] // Returns the value of the second cell (the first is 0) 139 | *(table + 1) // Same thing : returns the value of the second cell. 140 | \end{Csource} 141 | 142 | لذا فعند كتابة 143 | \InlineCode{table[0]}، 144 | فأنت تطلب قيمة الخانة التي تتواجد بعنوان الجدول + 0 145 | خانة، أي 1600.\\ 146 | و إذا كتبت 147 | \InlineCode{table[1]} 148 | فإنك تطلب القيمة المتواجدة في عنوان الجدول + 1 149 | خانة، أي 1601.\\ 150 | و هكذا من أجل الباقي. 151 | 152 | \subsection{الجداول ذات الحجم المتغيّر} 153 | 154 | هناك عدة نسخ من لغة 155 | \textenglish{C}.\\ 156 | نسخة حديثة منها تدعى 157 | \textenglish{C99} 158 | تسمح بإنشاء جداول ذات حجم متغيّر. يعني أن حجم الجداول يمكن أن يكون معرّفا بمتغير. 159 | 160 | \begin{Csource} 161 | int size = 5; 162 | int table[size]; 163 | \end{Csource} 164 | 165 | إلا أن هذه الكتابة ليست مفهومة بالنسبة لكل المترجمات 166 | (\textenglish{Compilers}) 167 | فبعضها تتوقف في السطر الثاني. إن لغة 168 | \textenglish{C} 169 | الّتي اعلمك إياها منذ البداية (تدعى 170 | \textenglish{C89}) 171 | لا تسمح بهذا النوع من الكتابات. ولذا يمكننا القول أن فعل هذه الأشياء أمر ممنوع. 172 | 173 | يجب أن نتفق على شيء وهو: لا تملك الحق في وضع متغير بين القوسين المربعين من أجل تعريف حجم الجدول. حتى وإن كان المتغير ثابتا! يجب على طول الجدول أن يأخذ قيمة ثابتة، ولهذا عليك أن تحدده كعدد: 174 | \begin{Csource} 175 | int table[5]; 176 | \end{Csource} 177 | 178 | \begin{question} 179 | إذن\dots هل من الممنوع إنشاء جدول يعتمد حجمه على قيمة متغير؟ 180 | \end{question} 181 | 182 | بلى إنه ممكن حتى مع 183 | \textenglish{C89}. 184 | لكن لفعل هذا سنعتمد على تقنية أخرى (أكيدة أكثر وتعمل مع كل المترجمات) تدعى بـ\textbf{الحجز الحيّ} 185 | (\textenglish{Dynamic allocation}). 186 | سندرسها في مرحلة متقدمة من هذا الكتاب. 187 | 188 | \section{تصفح جدول} 189 | 190 | لنفرض أنني أريد الآن أن أُظهر كل قيم خانات الجدول.\\ 191 | يمكنني أن أستدعي الدالة 192 | \InlineCode{printf} 193 | بالقدر الذي يحتويه الجدول من خانات. لكن سيكون الأمر ثقيلًا ومليئًا بالتكرار، وتخيل حجم الشفرة المصدرية لو أننا أردنا إظهار قيم الجدول واحدة بواحدة! 194 | 195 | الأحسن هو أن نستعين بحلقة. لم لا حلقة 196 | \InlineCode{for}؟ فهي الأنسب لتصفح الجداول: 197 | 198 | \begin{Csource} 199 | int main(int argc, char *argv[]) 200 | { 201 | int table[4], i = 0; 202 | table[0] = 10; 203 | table[1] = 23; 204 | table[2] = 505; 205 | table[3] = 8; 206 | for (i = 0 ; i < 4 ; i++) 207 | { 208 | printf("%d\n", table[i]); 209 | } 210 | return 0; 211 | } 212 | \end{Csource} 213 | 214 | \begin{Console} 215 | 10 216 | 23 217 | 505 218 | 8 219 | \end{Console} 220 | 221 | إن حلقتنا تتصفح الجدول بمساعدة متغير يسمى 222 | \InlineCode{i} 223 | (اسم شائع لدى المبرمجين يخص المتغير الذي يستخدم لتصفح جدول!). 224 | 225 | إن الشيء العَمَلِيَّ خاصة، هو أنه بإمكاننا وضع متغير داخل قوسين مربعين بالفعل. فالمتغير كان ممنوعا في مرحلة إنشاء الجدول (لتعريف حجمه). لكن، ولحسن الحظ، هو مسموح من أجل "تصفح" الجدول، أي إظهار قيمه!\\ 226 | هنا قد نعطي المتغير 227 | \InlineCode{i} 228 | بشكل متتالي القيم 0، 1، 2، 3. بهذا سنقوم إذن بإظهار قيمة 229 | \InlineCode{table[0]}، 230 | \InlineCode{table[1]}، 231 | \InlineCode{table[2]} 232 | و 233 | \InlineCode{table[3]}! 234 | 235 | \begin{critical} 236 | اِنتبه لعدم محاولة إظهار قيمة 237 | \InlineCode{table[4]}! 238 | فجدول من 4 خانات يتضمن الفهارس 0، 1، 2، 3 فقط. فإن حاولت عرض 239 | \InlineCode{table[4]} 240 | فإمّا أن تحصل على قيمة عشوائية، أو أن يظهر لك خطأ جميل، نظام التشغيل يوقف برنامجك فهو يحاول الوصول لعنوان لا ينتمي إليه. 241 | \end{critical} 242 | 243 | \subsection{تهيئة جدول} 244 | 245 | الآن ومادمنا قد عرفنا كيف نتصفح جدولا، يمكننا أن نضبط كل قيمه على 0 باستخدام حلقة! 246 | 247 | إن القيام بتصفح جدول لضبط كلّ قيمه على الصفر أمر يمكن القيام به بمستواك هذا: 248 | 249 | \begin{Csource} 250 | int main(int argc, char *argv[]) 251 | { 252 | int table[4], i = 0; 253 | // Initialization of the table 254 | for (i = 0 ; i < 4 ; i++) 255 | { 256 | table[i] = 0; 257 | } 258 | // Displaying the values of the table to check 259 | for (i = 0 ; i < 4 ; i++) 260 | { 261 | printf("%d\n", table[i]); 262 | } 263 | return 0; 264 | } 265 | \end{Csource} 266 | 267 | \begin{Console} 268 | 0 269 | 0 270 | 0 271 | 0 272 | \end{Console} 273 | 274 | \subsection{طريقة أخرى للتهيئة} 275 | 276 | يجب أن تعرف أنه هناك طريقة أخرى لإعطاء قيم ابتدائية لجدول في لغة \textenglish{C}.\\ 277 | و هذه الطريقة تعمل بكتابة 278 | \InlineCode{table[4] = \{value1, value2, value3, value4\}}. 279 | ببساطة، تضع القيم بين حاضنتين واحدة تلو الأخرى وتفصل بينها بفواصل. 280 | 281 | \begin{Csource} 282 | int main(int argc, char *argv[]) 283 | { 284 | int table[4] = {0, 0, 0, 0}, i = 0; 285 | for (i = 0 ; i < 4 ; i++) 286 | { 287 | printf("%d\n", table[i]); 288 | } 289 | return 0; 290 | } 291 | \end{Csource} 292 | 293 | \begin{Console} 294 | 0 295 | 0 296 | 0 297 | 0 298 | \end{Console} 299 | 300 | و هناك أحسن من هذه الطريقة: بإمكانك تعريف القيم الخاصة بالخانات الأولى من الجدول وكل التي لم تُشر إليها ستُضبط على 0. 301 | 302 | أي أنني إن قمت بكتابة التالي: 303 | 304 | \begin{Csource} 305 | int table[4] = {10, 23}; // Inserted values : 10, 23, 0, 0 306 | \end{Csource} 307 | 308 | الخانة 0 تأخذ القيمة 10 والخانة 1 تأخذ القيمة 23 وكل الخانات المتبقية تأخذ القيمة 0 (افتراضيًا). 309 | 310 | كيف نضبط كل الجدول على الصفر بمعرفة هذا؟\\ 311 | يكفي أن تضبط القيمة الأولى على 0، وكل القيم الأخرى غير المشار إليها تأخذ القيمة 0. 312 | 313 | \begin{Csource} 314 | int table[4] = {0}; // All the columns of the table will be initialised to 0 315 | \end{Csource} 316 | 317 | هذه التقنية لها شيء مميز وهو أنها تعمل مع أي جدول مهما كان حجمه (في هذا المثال نجحت الطريقة مع 4 خانات وستنجح لو كان الجدول بـ100 خانة أيضا). 318 | 319 | \begin{critical} 320 | احذر، قد تصادفك الكتابة التالية: 321 | \InlineCode{int table[4] = \{1\};} 322 | و التي تعني إدخال القيم التالية في الجدول: 323 | 1، 0، 0، 0.\\ 324 | خلافًا لما يعتقده الكثير، لن يتم تهيئة كل خانات الجدول على 1. بل الخانة الأولى هي الوحيدة التي تضبط على 1 أما الباقي فعلى 0. لا يمكننا إذن القيام بتهيئة كل الجدول على القيمة 1 تلقائيّا، إلّا باستعمال حلقة. 325 | \end{critical} 326 | 327 | \section{تمرير جدول لدالة} 328 | 329 | في كثير من الأوقات ستحتاج لإظهار محتوى كلّ الجدول، فلما لا نقوم بكتابة دالة تقوم بهذا؟ بهذا ستكتشف كيف نمرر جدولا إلى دالة (وهذا يساعدني). 330 | 331 | يتطلب الأمر أن تبعث معلومتين للدالة. الجدول (أي عنوان الجدول) وأيضا حجمه خاصّة!\\ 332 | بالفعل، يجب أن تكون دالتنا قادرة على تهيئة جدول مهما كان حجمه. لكن في دالتنا، أنت لا تعرف حجم جدولك ولهذا يجب أن ترسل متغيرا يحمل الاسم 333 | \InlineCode{tableSize} 334 | مثلا. 335 | 336 | و كما قلت لك مسبقا، يمكننا اعتبار 337 | \InlineCode{table} 338 | مؤشرا، ولهذا يمكننا أن نرسله للدالة مثلما نرسل مؤشرا عاديا. 339 | 340 | \begin{Csource} 341 | // Prototype of the display function 342 | void display(int *table, int tableSize); 343 | 344 | int main(int argc, char *argv[]) 345 | { 346 | int table[4] = {10, 15, 3}; 347 | // We display the content of the table 348 | display(table, 4); 349 | return 0; 350 | } 351 | 352 | void display(int *table, int tableSize) 353 | { 354 | int i; 355 | for (i = 0 ; i < tableSize; i++) 356 | { 357 | printf("%d\n", table[i]); 358 | } 359 | } 360 | \end{Csource} 361 | 362 | \begin{Console} 363 | 10 364 | 15 365 | 3 366 | 0 367 | \end{Console} 368 | 369 | الدالة غير مختلفة عن التي درسناها في فصل المؤشرات، فهي تأخذ كمعامل مؤشرًا نحو 370 | \InlineCode{int} 371 | (جدولنا) وأيضا حجمه (مهم جدا كي نعرف متى تتوقف الحلقة!).\\ 372 | كل محتوى الجدول تُظهره الدالة بواسطة الحلقة. 373 | 374 | لاحظ أنّه توجد طريقة أخرى للإشارة إلى أن الدالة تستقبل جدولا. بدلا من أن نشير أن الدالة تستقبل 375 | \InlineCode{int *table}، 376 | أكتب التالي: 377 | 378 | \begin{Csource} 379 | void display(int table[], int tableSize) 380 | \end{Csource} 381 | 382 | هذا يعني تماما نفس الشيء، ولكن وجود القوسين المربعين يُعلمان المبرمج بأن الدالة تأخذ جدولا وليس مؤشرا عاديا وهذا يزيل الغموض. 383 | 384 | شخصيا أستعمل دائما القوسين المربعين في دوالي لكي أُظهر بأن الدالة تنتظر جدولا. أنصحك باستعمال نفس الطريقة. ليس مهما وضع حجم الجدول بين القوسين المربعين هذه المرة. 385 | 386 | \subsection{بعض التمارين!} 387 | 388 | لدي أفكار متعددة عن تمارين متعلقة بالجداول ستساعدك على التدريب! وفكرة التمارين هي إنشاء دوال تعمل على الجداول. 389 | 390 | و كتحدي، ستجد هنا نصوص التمارين فقط، ولن أعطي الإجابة كي أجبرك على الاجتهاد في إيجاد الحلول، فإن لم تستطع فيمكنك زيارة 391 | \href{http://www.siteduzero.com/forum-81-126-langage-c.html}{المنتديات} 392 | لطرح أسئلتك. 393 | 394 | \subsubsection{التمرين 1} 395 | 396 | أنشئ دالة 397 | \InlineCode{tableSum} 398 | ترجع مجموع القيم الموجودة في الجدول (استعمل 399 | \InlineCode{return} 400 | لإرجاع النتيجة) وللمساعدة، هذا هو نموذج الدالة: 401 | 402 | \begin{Csource} 403 | int tableSum(int table[], int tableSize); 404 | \end{Csource} 405 | 406 | \subsubsection{التمرين 2} 407 | 408 | أنشئ دالة 409 | \InlineCode{tableAverage} 410 | تحسب وتُرجع معدّل القيم الموجودة في الجدول. تفضل النموذج: 411 | 412 | \begin{Csource} 413 | double tableAverage(int table[], int tableSize); 414 | \end{Csource} 415 | 416 | الدالة ترجع 417 | \InlineCode{double} 418 | فالمعدّل عادة هو قيمة عشرية. 419 | 420 | \subsubsection{التمرين 3} 421 | 422 | أنشئ دالة 423 | \InlineCode{tableCopy} 424 | التي تأخذ كمعاملات جدولين، حيث تقوم بنسخ محتوى الجدول الأول في الجدول الثاني، تفضل النموذج: 425 | 426 | \begin{Csource} 427 | void tableCopy(int originalTable[], int copyTable[], int tableSize); 428 | \end{Csource} 429 | 430 | \subsubsection{التمرين 4} 431 | 432 | أنشئ دالّة 433 | \InlineCode{tableMaximum} 434 | دورها إسناد 0 لكلّ خانة جدول تحوي قيمة أكبر من القيمة العظمى. هذه الدالة تأخذ كمعاملات الجدول والعدد الأقصى المسموح به 435 | (\InlineCode{maxValue}). 436 | كلّ الخانات الّتي تملك عددا أكبر من 437 | \InlineCode{maxValue} 438 | يجب أن تعاد إلى 0. النموذج: 439 | 440 | \begin{Csource} 441 | void tableMaximum(int table[], int tableSize, int maxValue); 442 | \end{Csource} 443 | 444 | \subsubsection{التمرين 5} 445 | 446 | هذا أصعب. أنشئ دالة 447 | \InlineCode{sortTable} 448 | التي ترتب قيم جدول تصاعديا. كمثال جدول يتكوّن من القيم 449 | \InlineCode{\{15, 81, 22, 13\}}، 450 | بعد العملية يصبح: 451 | \InlineCode{\{13, 15, 22, 81\}}!\\ 452 | تفضل النموذج: 453 | 454 | \begin{Csource} 455 | void sortTable(int table[], int tableSize); 456 | \end{Csource} 457 | 458 | هذا التمرين أصعب بقليل عن السابقين لكن القيام به ليس مستحيلا، سيشغلكم بعض الوقت. 459 | 460 | \begin{information} 461 | أنشئ ملفا خاصا باسم 462 | \InlineCode{tables.c} 463 | (مع مرافقه الملف 464 | \InlineCode{tables.h} 465 | الذي يحتوي النماذج! بالطبع) يحوي كلّ الدوال التي تقوم بعمليّات على الجداول. 466 | \end{information} 467 | 468 | إلى العمل! 469 | 470 | \section*{ملخّص} 471 | 472 | \begin{itemize} 473 | \item \textbf{الجداول} 474 | هي عبارة عن مجموعة متغيرات لها نوع واحد مرتبة بجنب بعضها في الذاكرة. 475 | \item يجب أن يكون حجم الجدول محددًا قبل ترجمة البرنامج، لا يمكن أن تعتمد على متغيّر. 476 | \item الجدول ذو النوع 477 | \InlineCode{int} 478 | لا يحتوي سوى متغيرات من نوع 479 | \InlineCode{int}. 480 | \item خانات الجدول مرقّمة عن طريق 481 | \textbf{الفهارس} 482 | ابتداءً من 0: 483 | \InlineCode{table[0]}، \InlineCode{table[1]}، \InlineCode{table[2]}، 484 | إلخ. 485 | \end{itemize} 486 | -------------------------------------------------------------------------------- /Chapter_III-9.tex: -------------------------------------------------------------------------------- 1 | \chapter{عمل تطبيقي: الإظهار الطيفي للصوت} 2 | 3 | هذا العمل التطبيقي سيقترح عليك التعامل مع 4 | \textenglish{SDL} 5 | و 6 | \textenglish{FMOD} 7 | في نفس الوقت. هذه المرّة، لن نعمل على لعبة. كما نعرف فـ\textenglish{SDL} 8 | مخصصة لهذا، لكن يمكن استعمالها في ميادين أخرى. سيقوم هذا الفصل بإثبات أنها صالحة لأجل أشياء أخرى. 9 | 10 | سنحقق هنا إظهارًا للطيف الصوتي بـ\textenglish{SDL}. 11 | يتوقّف هذا على إظهار تركيبة الصوت الذي نشغّله، مثلًا موسيقى. نجد هذه الخاصية في كثير من برامج قراءة الأصوات. إنه أمرٌ ممتع وليس بقدر الصعوبة التي يبدو عليها! 12 | 13 | سيسمح لك هذا الفصل بالعمل على مفاهيم قُمنا باستكشافها مؤخّرًا: 14 | 15 | \begin{itemize} 16 | \item التحكّم في الوقت. 17 | \item المكتبة 18 | \textenglish{FMOD}. 19 | \end{itemize} 20 | 21 | سنتعرّف علاوة على ذلك، على كيفية التعديل على مساحة بيكسلا ببيكسل. 22 | 23 | الصورة التالية تعطيك مظهرًا للبرنامج الذي سنكتبه في هذا الفصل. 24 | 25 | \begin{figure}[H] 26 | \centering 27 | \includegraphics[width=0.6\textwidth]{Chapter_III-9_Window-spectral} 28 | \end{figure} 29 | 30 | هو نوع الإظهار الذي نجده في قارئي الأصوات كـ\textenglish{Winamp}، 31 | \textenglish{Windows Media Player} أو \textenglish{AmaroK}.\\ 32 | كما قلتُ لك إن الأمر ليس صعبَ التحقيق. على عكس العمل التطبيقي الخاص بـ\textenglish{Mario Sokoban}، 33 | هذه المرّة ستقوم بنفسك بالعمل. سيمثّل هذا بالنسبة إليك تمرينًا جيدًا. 34 | 35 | \section{التعليمات} 36 | 37 | التعليمات بسيطة. اتّبعها خطوة بخطوة بالترتيب، ولن تواجه أي مشاكل. 38 | 39 | \subsection{قراءة ملف \textenglish{MP3}} 40 | 41 | لكي تبدأ، يجب عليك إنشاء برنامج يقوم بقراءة ملف 42 | \textenglish{MP3}. ليس عليك سوى إعادة 43 | الأغنية 44 | "\textenglish{Home}" 45 | للمجموعة 46 | "\textenglish{Hype}" 47 | و التي استعملناها في الفصل الخاص بـ\textenglish{FMOD} 48 | لتلخيص كيفية عمل تشغيل الموسيقى. 49 | 50 | إذا اتّبعت جيّدا الفصل حول 51 | \textenglish{FMOD}، 52 | لا تحتاج أكثر من بضعة دقائق لكي تقوم بالعملية. أنصحك بالمناسبة أن تقوم بنقل الملف 53 | \textenglish{MP3} 54 | إلى مجلّد المشروع. 55 | 56 | \subsection{استرجاع المعلومات الطيفية للصوت} 57 | 58 | لكي نعرف كيف يعمل الإظهار الطيفي للصوت، من الواجب أن أشرح لك كيفية يعمل الأمر من الداخل (بشكل تقريبي فقط، وإلا سندخل في درس رياضيات). 59 | 60 | يمكن أن يتم تقسيم الصوت إلى ترددات 61 | (\textenglish{Frequencies}). 62 | بعض الترددات منخفضة، بعضها متوسطة وبعضها مرتفعة. ما سنقوم به في عملية الإظهار هو إظهار كمية كلّ واحدة من الترددات على شكل شرائط وكلّما يكون الشريط كبيرًا، كلما يكون التردد مستعملًا أكثر: 63 | 64 | \begin{figure}[H] 65 | \centering 66 | \includegraphics[width=0.6\textwidth]{Chapter_III-9_Frequencies} 67 | \end{figure} 68 | 69 | على يسار النافذة، نقوم بإظهار الترددات المنخفضة، وعلى اليمين الترددات المرتفعة. 70 | 71 | \begin{question} 72 | لكن كيف نسترجع كميّة كلّ تردد؟ 73 | \end{question} 74 | 75 | ستهتم 76 | \textenglish{FMOD} 77 | بهذا العمل. يمكننا استدعاء الدالة 78 | \InlineCode{FMOD\_Channel\_GetSpectrum} 79 | ذات النموذج: 80 | 81 | \begin{Csource} 82 | FMOD_RESULT FMOD_Channel_GetSpectrum( 83 | FMOD_CHANNEL * channel, 84 | float * spectrumarray, 85 | int numvalues, 86 | int channeloffset, 87 | FMOD_DSP_FFT_WINDOW windowtype 88 | ); 89 | \end{Csource} 90 | 91 | و هاهي المعاملات التي تحتاجها الدالة: 92 | 93 | \begin{itemize} 94 | \item القناة التي تشتغل فيها الموسيقى. يجب إذا استرجاع مؤشّر نحو هذه القناة. 95 | \item جدول 96 | \InlineCode{float}. 97 | يجب أن يتم حجز الذاكرة من أجل هذا الجدول مسبّقًا، بشكل ثابت أو حيّ، لكي نسمح لـ\textenglish{FMOD} 98 | بملئه بشكل صحيح. 99 | \item حجم الجدول. يجب أن يكون حجم الجدول إجباريًا عبارة عن قوّة للعدد 2، مثلا 512. 100 | \item يسمح هذا المعامل بتعريف بأي مخرج نحن مهتمون. مثلًا لو أننا في 101 | \textenglish{stereo}، 102 | فـ$ 0 $ تعني اليسار و$ 1 $ تعني اليمين. 103 | \item هذا المعامل معقّد قليلًا، ولا يهمّنا حقيقة في هذا الفصل. سنكتفي بإعطائه القيمة\\ 104 | \InlineCode{FMOD\_DSP\_FFT\_WINDOW\_RECT}. 105 | \end{itemize} 106 | 107 | \begin{information} 108 | تذكير: النوع 109 | \InlineCode{float} 110 | هو نوع عشري، مثل 111 | \InlineCode{double}. 112 | الاختلاف بين الاثنين يكمن في كون 113 | \InlineCode{double} 114 | أكثر دقّة من الآخر، لكن في حالتنا يكفينا 115 | \InlineCode{float}. 116 | هذا الأخير مستعمل من طرف 117 | \textenglish{FMOD} 118 | هنا. ولذلك، هو ما سنستعمله نحن أيضًا. 119 | \end{information} 120 | 121 | بشكل واضح، نعرّف جدول 122 | \InlineCode{float}: 123 | 124 | \begin{Csource} 125 | float spectrum[512]; 126 | \end{Csource} 127 | 128 | ثم، حين يتم تشغيل الموسيقى، نطلب من 129 | \textenglish{FMOD} 130 | ملء جدول الأطياف بالقيام مثلًا بـ: 131 | 132 | \begin{Csource} 133 | FMOD_Channel_GetSpectrum(channel, spectrum, 512, 0, FMOD_DSP_FFT_WINDOW_RECT); 134 | \end{Csource} 135 | 136 | يمكننا بعد ذلك تصفّح الجدول لكي نتحصّل على قيم الأطياف: 137 | 138 | \begin{Csource} 139 | spectrum[0] // The lowest frequency (Left) 140 | spectrum[1] 141 | spectrum[2] 142 | ... 143 | spectrum[509] 144 | spectrum[510] 145 | spectrum[511] // The highest frequency (Right) 146 | \end{Csource} 147 | 148 | كلّ تردد هو عبارة عن عدد عشري محصور بين $ 0 $ (لا شيء) و$ 1 $ (قيمة قصوى). ينصّ عملك على إظهار كلّ شريط سواء كان قصيرًا أو كبيرًا بدلالة القيمة التي تحتويها كلّ من خانات الجدول. 149 | 150 | مثلًا، إذا كانت القيمة هي $ 0.5 $ يجدر بك رسم شريط يكون علّوه مساويًا لنصف علوّ النافذة. إذا كانت القيمة هي $ 1 $، فسيأخذ الشريط كلّ علو النافذة. 151 | 152 | بشكل عام، تكون القيم ضعيفة (أكثر قربًا من $ 0 $ على $ 1 $). أنصحك بضرب كلّ القيم بـ20 لكي ترى الطيف بشكل أفضل.\\ 153 | احذر: إذا قمت بهذا، تأكد بأنك لن تتجاوز $ 1 $ (قم بتدوير القيمة إلى $ 1 $ إذا احتجت إلى ذلك). إذا وجدت أنك تتعامل مع أعداد تفوق $ 1 $، فقد تواجه مشاكل لاحقًا في رسم الشرائط العموديّة لاحقا! 154 | 155 | \begin{question} 156 | لكن يجدر بالشرائط أن تتحرّك في نفس الوقت الذي يتم فيه تشغيل الصوت، أليس كذلك؟ بما أن الصوت يتحرّك كلّ الوقت، يجب تحديث الصورة الرسومية، ما العمل؟ 157 | \end{question} 158 | 159 | سؤال جيد. في الواقع، الجدول الخاص المتكون من 160 | 512 \InlineCode{float} 161 | الذي ترجعه لنا 162 | \textenglish{FMOD} 163 | يتغيّر كل 25 مث (لكي نكون في نفس الفاصل الزمني بالنسبة للصوت الحالي). يجب إذا في الشفرة المصدرية أن تعيد قراءة جدول الـ512 164 | \InlineCode{float} 165 | (بإعادة استدعاء 166 | \InlineCode{FMOD\_Channel\_GetSpectrum} 167 | كلّ 25 مث)، ثم تقوم بتحديث رسمك ذي الشرائط. 168 | 169 | أعد قراءة الفصل حول التحكّم في الوقت بـ\textenglish{SDL} 170 | لكي تتذكّر كيفية عمل ذلك. لديك الخيار بين 171 | \InlineCode{GetTicks} 172 | و الـ\textenglish{callbacks}. 173 | استعمل ما تراه أكثر سهولة لك. 174 | 175 | \subsection{إنشاء التدرّج اللوني} 176 | 177 | في البداية، يمكنك تحقيق الشرائط بلون موحّد. يمكنك إذا إنشاء مساحات. يجب إذا أن تكون هناك 512 مساحة: واحدة من أجل كلّ شريط. كلّ مساحة تأخذ إذا بيكسلا واحدا كعُرض. ويختلف علوّ الشرائط بدلالة شدّة كلّ تردد. 178 | 179 | أنصحك بعدها أن تقوم بتحسين: يجب على الشريط أن يميل للأحمر كلّما زادت كثافة الصوت. أي أنه على الشريط أن يكون أخضرًا من الأسفل وأحمرًا من الأعلى. 180 | 181 | \begin{question} 182 | لكن\dots المساحة الواحدة لا يمكنها أن تأخذ سوى لونٍ واحدٍ لو عندما نستعمل الدالة 183 | \InlineCode{SDL\_FillRect}. 184 | لا يمكننا إنشاء تدرّج لوني! 185 | \end{question} 186 | 187 | في الواقع، يمكننا بالتأكيد إنشاء مساحات بعَرْض 1 بيكسل وعُلُو 1 بيكسل من أجل كلّ لون في التدرّج. لكن هذا سيأخذ بنا إلى إنشاء مساحات عديدة ولن يكون التحكّم فيها مثاليًا! 188 | 189 | كيف يمكن لنا أن نرسم بيكسلا ببيكسل؟\\ 190 | لم أعلّمك هذا من قبل، لأنّ هذه التقنية لا تستحقّ فصلًا كاملًا. ستجد أنها في الواقع ليست صعبة. 191 | 192 | في الواقع، لا تقترح \textenglish{SDL} 193 | أية دالة للرسم بيكسلا ببيكسل. لكن لنا الحق في أن نكتبها بأنفسنا. لكي نقوم بهذا، يجب اتّباع هذه الخطوات النموذجية بالترتيب: 194 | 195 | \begin{enumerate} 196 | \item استدع الدالة 197 | \InlineCode{SDL\_LockSurface} 198 | لنعلن لـ\textenglish{SDL} 199 | أننا سنقوم بالتعديل على المساحة يدويًا. هذا "يعطّل" المساحة لـ\textenglish{SDL} 200 | وستكون وحدك قادرًا على التحكّم فيها مادامت المساحة معطّلة. 201 | 202 | هنا، أنصحك بأن تعمل بمساحة واحدة فقط: الشاشة. إذا أردت رسم بيكسل في منطقة محددة من الشاشة، يجب عليك تعطيل المساحة 203 | \InlineCode{screen}: 204 | 205 | \begin{Csource} 206 | SDL_LockSurface(screen); 207 | \end{Csource} 208 | 209 | \item يمكنك بعد ذلك تغيير محتوى كلّ بيكسل من المساحة. بما أن \textenglish{SDL} 210 | لا تقترح أية دالة للقيام بهذا، يجب أن نكتبها بأنفسنا في البرنامج. 211 | 212 | سأعطيك هذه الدالة، والتي استخرجتها من الملفات التوجيهية لـ\textenglish{SDL}. 213 | هي معقدّة أكثر لأنها تعمل على المساحة مباشرة وتتحكم في كلّ أعماق اللون الممكنة (بيتات على البيكسل). لا تحتاج لحفظها أو فهمها، قم بنسخها ببساطة في البرنامج لكي تتمكّن من استعمالها: 214 | 215 | \begin{Csource} 216 | void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) 217 | { 218 | int bpp = surface->format->BytesPerPixel; 219 | 220 | Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; 221 | 222 | switch(bpp) { 223 | case 1: 224 | *p = pixel; 225 | break; 226 | 227 | case 2: 228 | *(Uint16 *)p = pixel; 229 | break; 230 | 231 | case 3: 232 | if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { 233 | p[0] = (pixel >> 16) & 0xff; 234 | p[1] = (pixel >> 8) & 0xff; 235 | p[2] = pixel & 0xff; 236 | } else { 237 | p[0] = pixel & 0xff; 238 | p[1] = (pixel >> 8) & 0xff; 239 | p[2] = (pixel >> 16) & 0xff; 240 | } 241 | break; 242 | 243 | case 4: 244 | *(Uint32 *)p = pixel; 245 | break; 246 | } 247 | } 248 | \end{Csource} 249 | \end{enumerate} 250 | 251 | هي سهلة الاستعمال. ابعث لها المعاملات التالية: 252 | 253 | \begin{itemize} 254 | \item المؤشّر نحو المساحة التي تريد التعديل عليها (يجب أن تكون معطّلة بواسطة 255 | \InlineCode{SDL\_LockSurface}). 256 | \item وضعية الفاصلة الخاصة بالبيكسل الذي نريد التعديل عليه في المساحة 257 | (\InlineCode{x}). 258 | \item وضعية الترتيبة الخاصة بالبيكسل الذي نريد التعديل عليه في المساحة 259 | (\InlineCode{y}). 260 | \item اللون الجديد الذي نعطيه للبيكسل. يجب أن يكون هذا اللون بصيغة 261 | \InlineCode{Uint32}. 262 | يمكنك إذا توليده بالاستعانة بالدالة 263 | \InlineCode{SDL\_MapRGB} 264 | التي تتقننها جيدًا الآن. 265 | \item أخيرًا، حينما تنتهي من العمل على المساحة، يجب ألا تنسى أن تزيل تعطيلها باستدعاء 266 | \InlineCode{SDL\_UnlockSurface}. 267 | \end{itemize} 268 | 269 | \begin{Csource} 270 | SDL_UnlockSurface(screen); 271 | \end{Csource} 272 | 273 | \subsection{شفرة ملخّصة للمثال} 274 | 275 | لو نلخّص، ستجد بأن كلّ شيء سهل.\\ 276 | هذه الشفرة ترسم بيكسلا أحمرا في منتصف المساحة 277 | \InlineCode{screen} 278 | (أي في منتصف النافذة). 279 | 280 | \begin{Csource} 281 | SDL_LockSurface(screen); // We lock the surface 282 | setPixel(screen, screen->w / 2, screen->h / 2, SDL_MapRGB(screen->format, 255, 0, 0)); // We draw a red pixel in the middle of the screen 283 | SDL_UnlockSurface(screen); // We unlock the surface 284 | \end{Csource} 285 | 286 | من هذه القاعدة، يجدر بك أن تتمكن من تحقيق التدرّج اللوني من الأخضر للأحمر (يجب أن تستعمل الحلقات التكرارية). 287 | 288 | \section{التصحيح} 289 | 290 | إذا، كيف وجدت الموضوع؟ ليس صعب الفهم، يجب فقط القيام ببعض الحسابات، خاصة من أجل تحقيق التدرّج اللوني. مستوى التمرين هو مستوى عام، يجب فقط أن تفكّر أكثر. 291 | 292 | بعض الأشخاص يأخذون وقتًا أطول من آخرين لإيجاد التصحيح. إذا لم تتمكّن من حلّ التمرين، هذا ليس سيئًا. ما يهمّ هو أن ننتهي بالوصول إلى هدفنا. مهما كان المشروع الذي تعمل عليه، فسيكون هناك بالتأكيد أوقات نجد فيها أنه لا ينقصنا أن نجيد البرمجة لكي نتمكّن من حلّ المشكل، يجب أيضًا أن نكون منطقيين ونجيد التفكير. 293 | 294 | سأعطيك الشفرة المصدرية الكاملة. لقد علّقت عليها بشكل كافٍ: 295 | 296 | \begin{Csource} 297 | #include 298 | #include 299 | #include 300 | #include 301 | #define WINDOW_WIDTH 512 // MUST stay equal to 512 because there are 512 bars corresponding to 512 floats 302 | #define WINDOW_HIGHT 400 // You can change this. 303 | #define RATIO (WINDOW_HIGHT / 255.0) 304 | #define LIMIT_TIME_TO_REFRESH 25 // Time in ms between two updates of the graph (25 is the minimum) 305 | #define SPECTERUM_SIZE 512 306 | void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel); 307 | int main(int argc, char *argv[]) 308 | { 309 | SDL_Surface *screen = NULL; 310 | SDL_Event event; 311 | int cont = 1, barHeight = 0, currentTime = 0, previousTime = 0, i = 0, j = 0; 312 | float spectrum[SPECTERUM_SIZE]; 313 | /* Initializing FMOD: 314 | Load FMOD, the music and start playing the music 315 | */ 316 | 317 | FMOD_SYSTEM *system; 318 | FMOD_SOUND *music; 319 | FMOD_CHANNEL *channel; 320 | FMOD_RESULT result; 321 | FMOD_System_Create(&system); 322 | FMOD_System_Init(system, 1, FMOD_INIT_NORMAL, NULL); 323 | // We open the music 324 | result = FMOD_System_CreateSound(system, "hype_home.mp3", FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM, 0, &music); 325 | // We check if it has been opened correctly (IMPORTANT) 326 | if (result != FMOD_OK) 327 | { 328 | fprintf(stderr, "Can't read the mp3 file\n"); 329 | exit(EXIT_FAILURE); 330 | } 331 | // We play the music 332 | FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, music, 0, NULL); 333 | 334 | // We get the channel pointer 335 | FMOD_System_GetChannel(system, 0, &channel); 336 | /* 337 | Initializing the SDL: 338 | --------------------- 339 | We load the SDL, open a window and write in its title bar. 340 | We get also a pointer to the surface screen which will be the only surface to use in this program 341 | */ 342 | SDL_Init(SDL_INIT_VIDEO); 343 | screen = SDL_SetVideoMode(WINDOW_WIDTH, WINDOW_HIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF); 344 | SDL_WM_SetCaption("Visualisation spectrale du son", NULL); 345 | // Main loop 346 | while (cont) 347 | { 348 | SDL_PollEvent(&event); // We have to use PollEvent because we don't have to wait for the user's event to refresh the window 349 | switch(event.type) 350 | { 351 | case SDL_QUIT: 352 | cont = 0; 353 | break; 354 | } 355 | // We clear the screen every time before drawing the graph (black wallpaper) 356 | SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); 357 | /* Managing the time 358 | ----------------- 359 | We compare between the current time and the previous one (the last iteration of the loop). 360 | If the difference is less than 25 ms (updating time limit) 361 | Then we wait until 25ms pass. 362 | After that, we update previousTime with the new time. */ 363 | currentTime = SDL_GetTicks(); 364 | if (currentTime - previousTime < LIMIT_TIME_TO_REFRESH) 365 | { 366 | SDL_Delay(LIMIT_TIME_TO_REFRESH-(currentTime-previousTime)); 367 | } 368 | previousTime = SDL_GetTicks(); 369 | /* Drawing the sound spectrum 370 | ------------------------ 371 | It's the most important part. We have to think a little bit before drawing the spectrum. Maybe it's hard but it's possible, here is the proof. 372 | We fill the 512 floats table via FMOD_Channel_GetSpectrum() 373 | Then we work pixel by pixel on the surface screen to draw the bars. 374 | We make a first loop to browse the window in width. 375 | The second loop browses the window in height to draw the bars. 376 | */ 377 | 378 | /* We fill the 512 floats table. I've chosen to be interested in the left output */ 379 | FMOD_Channel_GetSpectrum(channel, spectrum, SPECTERUM_SIZE, 0, FMOD_DSP_FFT_WINDOW_RECT); 380 | SDL_LockSurface(screen); 381 | /* We block the surface screen because we're going to directly modify its pixels */ 382 | 383 | /* LOOP 1 : We browse the window in width (for every vertical bar) */ 384 | for (i = 0 ; i < WINDOW_WIDTH ; i++) 385 | { 386 | /* We calculate the vertical bar's height that we're going to draw. 387 | spectrum[i] will return a number between 0 and 1 that we're going to multiply by 20 to zoom in order to have a better view (As I said). 388 | 389 | The, we multiply by WINDOW_HEIGHT so the bar will be expanded comparing to the window's size. */ 390 | 391 | barHeight = spectrum[i] * 20 * WINDOW_HIGHT; 392 | /* We verify that the bar doesn't exceed the height of the window 393 | If it's the case, we crop the bar so it become equal to the window's height. */ 394 | if (barHeight > WINDOW_HIGHT) 395 | barHeight = WINDOW_HIGHT; 396 | /* LOOP 2 : we browse in height the vertical bar to draw it */ 397 | 398 | for (j = WINDOW_HIGHT - barHeight ; j < WINDOW_HIGHT ; j++) 399 | { 400 | /* We draw each pixel of the bar with the right colour. 401 | We simply vary the red and green colours, each one in a different way. 402 | 403 | j doesn't vary between 0 and 255 but between 0 and WINDOW_HEIGHT. 404 | 405 | If we want to adapt it proportionally to the window's height, we can simply calculate j / RATIO, where RATIO is equal to (WINDOW_HEIGHT / 255.0). 406 | 407 | It tooks for me 2-3 minutes so I can find the write calculation to do, every one can do it. You just have to think a little bit */ 408 | 409 | setPixel(screen, i, j, SDL_MapRGB(screen->format, 255 - (j / RATIO), j / RATIO, 0)); 410 | } 411 | } 412 | SDL_UnlockSurface(screen); /* We have finished working on the screen, we unblock the surface */ 413 | SDL_Flip(screen); 414 | } 415 | /* The program is finished. 416 | We free the music from the memory 417 | And we close FMOD and SDL */ 418 | 419 | FMOD_Sound_Release(music); 420 | FMOD_System_Close(system); 421 | FMOD_System_Release(system); 422 | SDL_Quit(); 423 | return EXIT_SUCCESS; 424 | } 425 | /* The function setPixel lets us draw a surface pixel by pixel */ 426 | 427 | void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) 428 | { 429 | int bpp = surface->format->BytesPerPixel; 430 | Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; 431 | switch(bpp) 432 | { 433 | case 1: 434 | *p = pixel; 435 | break; 436 | case 2: 437 | *(Uint16 *)p = pixel; 438 | break; 439 | case 3: 440 | if(SDL_BYTEORDER == SDL_BIG_ENDIAN) 441 | { 442 | p[0] = (pixel >> 16) & 0xff; 443 | p[1] = (pixel >> 8) & 0xff; 444 | p[2] = pixel & 0xff; 445 | } 446 | else 447 | { 448 | p[0] = pixel & 0xff; 449 | p[1] = (pixel >> 8) & 0xff; 450 | p[2] = (pixel >> 16) & 0xff; 451 | } 452 | break; 453 | case 4: 454 | *(Uint32 *)p = pixel; 455 | break; 456 | } 457 | } 458 | \end{Csource} 459 | 460 | يجدر بك أن تتحصّل على نتيجة تشبه الصورة التالية: 461 | 462 | \begin{figure}[H] 463 | \centering 464 | \includegraphics[width=0.6\textwidth]{Chapter_III-9_Window-spectral} 465 | \end{figure} 466 | 467 | من المعلوم أن النتيجة المرئية أفضل لتقدير النتيجة. أنصحك بالاطلاع عليها من هنا: 468 | 469 | \textenglish{\url{https://openclassrooms.com/uploads/fr/ftp/mateo21/spectre.html} (4.3 Mo)} 470 | 471 | لاحظ أن ضغط الملف أنقص من جودة الصوت وعدد الصور في الثانية.\\ 472 | الأفضل هو أن تقوم بتحميل البرنامج كاملًا (مرفقًا بالشفرة المصدرية) لكي تجربه عندك. يمكنك حينها تقدير البرنامج في ظروف أفضل. 473 | 474 | تنزيل الملف التنفيذي والشفرة المصدرية الكاملة: 475 | 476 | \url{https://openclassrooms.com/uploads/fr/ftp/mateo21/spectre.zip} 477 | 478 | \begin{critical} 479 | يجب قطعًا أن يكون الملف 480 | \InlineCode{Hype\_Home.mp3} 481 | متواجدًا في مجلّد المشروع لكي يشتغل البرنامج (وإلا فسيتوقف حالًا). 482 | \end{critical} 483 | 484 | \section*{أفكار للتحسين} 485 | 486 | يمكن دائما تحسين البرنامج. هنا، لدي مثلًا أفكار تمديد كثيرة يمكنها أن تصل بك إلى إنشاء برنامج صغير لقراءة الملفات 487 | \textenglish{MP3}. 488 | 489 | \begin{itemize} 490 | \item سيكون من الجيد أن نختار بأنفسنا الملف 491 | \textenglish{MP3} 492 | الذي نريد قراءته. يمكن مثلًا أن نقدّم لائحة تضم كلّ الملفات بذات الصيغة والمتواجدة في مجلّد المشروع. لم نرَ كيف نقوم بذلك، لكن يمكنك وحدك أن تكتشف ذلك. كمساعدة: استعمل المكتبة 493 | \textenglish{dirent} 494 | ( قم بتضمين الملف 495 | \InlineCode{dirent.h}). 496 | عليك بالبحث في الأنترنت لتعرف كيفيّة العمل بها. 497 | \item إذا كان البرنامج قادرا على التحكّم في لائحات التشغيل 498 | (\textenglish{Playlists}) 499 | المشغّلة، سيكون أمرًا أفضل. توجد كثير من صيغ اللائحات وأشهرها الصيغة 500 | \textenglish{M3U}. 501 | \item يمكنك إظهار اسم الـ\textenglish{MP3} 502 | التي أنت بصدد تشغيله في النافذة مثلًا (يجب استعمال 503 | \textenglish{SDL\_ttf}). 504 | \item يمكنك إظهار مؤشّر يشير إلى المكان في القراءة الّذي وصل إليه التشغيل، هذا ما يفعله أغلب قارئي الـ\textenglish{MP3}. 505 | \item يمكنك أيضًا أن تقترح التعديل على قوة الصوت. 506 | \item إلى آخره. 507 | \end{itemize} 508 | 509 | باختصار، هناك الكثير لفعله. لديك إمكانيّة إنشاء قارئي أصوات ممتازة، ليس عليك سوى كتابة الشفرة الخاصة بها! 510 | -------------------------------------------------------------------------------- /Chapter_IV-1.tex: -------------------------------------------------------------------------------- 1 | \chapter{القوائم المتسلسلة (\textenglish{Linked lists})} 2 | 3 | لكي نخزّن المعلومات في الذاكرة، استعملنا متغيّرات بسيطة (من نوع 4 | \InlineCode{int}، \InlineCode{double}\dots)، 5 | كما استعملنا جداول وهياكل مخصّصة. إذا أردت تخزين سلسلة من البيانات، فالأبسط غالبًا هو استعمال جداول. 6 | 7 | لكن تصبح الجداول أحيانًا محدودة جدًا. مثلًا، إذا أنشأت جدولًا ذو 10 خانات ثم تبيّن لك لاحقًا في البرنامج أنك تحتاج إلى حجم أكبر، سيكون من المستحيل تكبير حجم الجدول. وأيضًا لا يمكنك إدخال خانة إلى وسط الجدول. 8 | 9 | تمثّل القوائم المتسلسلة طريقة لتنظيم البيانات في الذاكرة بطريقة أكثر مرونة. وبما أن لغة 10 | \textenglish{C} 11 | لا تقترح قاعديًا هذا النظام من التخزين، سيكون علينا أن ننشئه بأنفسنا. سيكون تمرينًا ممتازًا يساعدك على أن ترتاح أكثر مع هذه اللغة. 12 | 13 | \section{تمثيل قائمة متسلسلة} 14 | 15 | ماهي القائمة المتسلسلة؟ أقترح عليك أن تنطلق من نموذج الجدول. يمكن تمثيل الجدول في الذاكرة بالطريقة التي توضّحها الصورة التالية. نتكلّم هنا عن جدول يحتوي على خانات من نوع 16 | \InlineCode{int}. 17 | 18 | \begin{figure}[H] 19 | \centering 20 | \includegraphics[width=0.3\textwidth]{Chapter_IV-1_Array} 21 | \end{figure} 22 | 23 | \begin{information} 24 | اخترت هنا تمثيل الجدول أفقيًا، لكن يمكن تمثيله عموديًا كذلك، هذا لا يهم. 25 | \end{information} 26 | 27 | 28 | كما قلت لك في المقدّمة، مشكل الجداول يكمن في كونها ثابتة. لا يمكن تكبير حجمها، إلا إذا فكّرنا في إعادة إنشائها من جديد وتكون أكبر (لاحظ الشكل التالي). أيضًا، لا يمكن أن نضيف عنصُرًا في وسط الجدول إلا إذا قمنا بإزاحة كلّ العناصر الأخرى. 29 | 30 | \begin{figure}[H] 31 | \centering 32 | \includegraphics[width=0.5\textwidth]{Chapter_IV-1_Array-add} 33 | \end{figure} 34 | 35 | لا تقترح علينا لغة 36 | \textenglish{C} 37 | نظامًا آخرًا لتخزين البيانات، لكن من الممكن أن ننشئ بأنفسنا هذا النظام بعناصره الكاملة: ستكون الغاية من هذا الفصل والفصول الموالية اكتشاف حلول لهذا المشكل. 38 | 39 | القائمة المتسلسلة هي طريقة لتنظيم سلسلة من البيانات في الذاكرة. هذا يسمح بجمع هياكل 40 | (\textenglish{structures}) 41 | مرتبطة ببعضها البعض بواسطة مؤشّرات. يمكننا تمثيلها كالتالي: 42 | 43 | \begin{figure}[H] 44 | \centering 45 | \includegraphics[width=0.4\textwidth]{Chapter_IV-1_Linked-list} 46 | \end{figure} 47 | 48 | يمكن لكلّ عنصر أن يحتوي على ما نريد: قيمة من نوع 49 | \InlineCode{int} 50 | أو أكثر، 51 | \InlineCode{double}\dots 52 | بالإضافة إلى ذلك، كلّ عنصر يحتوي على مؤشّر نحو العنصر الموالي: 53 | 54 | \begin{figure}[H] 55 | \centering 56 | \includegraphics[width=0.4\textwidth]{Chapter_IV-1_Linked-list-data} 57 | \end{figure} 58 | 59 | أعرف بأن كلّ هذه المعلومات نظرية وربّما تبدو لك غير واضحة الآن. احفظ فقط طريقة اتّصال العناصر ببعضها: هي تشكل 60 | \textbf{سلسلة من المؤشّرات}، 61 | و من هنا نجد الاسم "قائمة متسلسلة". 62 | 63 | \begin{information} 64 | على عكس الجداول، لا تُوضع عناصر القائمة المتسلسلة جنبًا إلى جنب في الذاكرة. كل خانة تؤشّر نحو خانة أخرى لا تتواجد ضروريًا بجنب الأخرى. 65 | \end{information} 66 | 67 | \section{بناء قائمة متسلسلة} 68 | 69 | فلنمرّ الآن إلى صلب الموضوع. سنحاول أن ننشئ بُنية تعمل بنفس المبدأ الذي اكتشفناه الآن.\\ 70 | أذكّرك بأن كلّ ما سنقوم به هنا يستدعي تقنيات لغة 71 | \textenglish{C} 72 | التي تعرفها من قبل. لا يوجد شيء جديد، سنكتفي بإنشاء هياكلنا الخاصة ودوال ثم تحويلها إلى نظام منطقي قادر على العمل لوحده. 73 | 74 | \subsection{عنصر من القائمة} 75 | 76 | من أجل الأمثلة، سننشئ قائمة متسلسلة من أعداد صحيحة. كل عنصر من القائمة له شكل الهيكل التالي: 77 | 78 | \begin{Csource} 79 | typedef struct Element Element; 80 | struct Element 81 | { 82 | int number; 83 | Element *next; 84 | }; 85 | \end{Csource} 86 | 87 | \begin{information} 88 | يمكننا أيضًا إنشاء قوائم متسلسلة تحتوي أعدادا عشرية أو حتى جداول أو هياكل. مبدأ القوائم المتسلسلة صالح من أجل أي نوع من البيانات مهما كان، لكن هنا، أنصحك بتبسيط العملية حتى تفهم المبدأ. 89 | \end{information} 90 | 91 | قُمنا الآن بإنشاء عنصر واحد من القائمة، يوافق الصورة التي رأيناها أعلاه. على ماذا يحتوي الهيكل؟ 92 | 93 | \begin{itemize} 94 | \item قطعة بيانات، هنا تتمثل في عدد من نوع 95 | \InlineCode{int}: 96 | يمكننا تغيير هذا بأي قطعة أخرى 97 | (\InlineCode{double}، 98 | جدول\dots). هذا يعتمد على نوع البيانات التي تريد تخزينها، سيكون عليك تغييرها على حسب حاجتك في البرنامج. 99 | 100 | \begin{information} 101 | إذا أردنا العمل بطريقة عامة، الأمثل هو استعمال مؤشّر نحو الفراغ: 102 | \InlineCode{void*}. 103 | هذا يسمح بالتأشير على أي نوع من البيانات. 104 | \end{information} 105 | \item مؤشّر نحو عنصر من نفس النوع يسمّى 106 | \InlineCode{next}. 107 | هذا ما يسمح بوصل العناصر الواحد بالآخر: كلّ عنصر "يعلم" أين يتواجد العنصر الذي يليه في الذاكرة. كما قلتُ لك مسبقًا، الخانات لا تتواجد جنبًا إلى جنب في الذاكرة. هذا هو الاختلاف الكبير بالنسبة للجداول. هذا ما سيمنحنا مرونة أكثر لأنه بإمكاننا بسهولة إضافة خانات أخرى لاحقًا حينما نحتاج إليها. 108 | 109 | \begin{information} 110 | وبالمقابل، لا يمكننا معرفة العنصر السابق، أي أنه من المستحيل الرجوع إلى الخلف انطلاقًا من عنصر من هذا النوع من القوائم. لأننا هنا نتكلّم عن قائمة "بسيطة التسلسل"، بينما توجد قوائم أخرى تسمّى "مزدوجة التسلسل" وتحتوي على مؤشّرات في كلتا الجهتين وبهذا فهي أصعب بقليل. 111 | \end{information} 112 | \end{itemize} 113 | 114 | 115 | \subsection{هيكل التحكّم} 116 | 117 | بالإضافة إلى الهيكل الذي نحن بصدد بنائه (والذي نضاعفه بعدد المرات التي فيها عناصر أخرى)، سنحتاج إلى هيكل آخر لكي نتحكّم في كامل القائمة المتسلسلة. سيكون لهذا الهيكل الشكل التالي: 118 | 119 | \begin{Csource} 120 | typedef struct List List; 121 | struct List 122 | { 123 | Element *first; 124 | }; 125 | \end{Csource} 126 | 127 | هذا الهيكل 128 | \InlineCode{List} 129 | يحتوي على مؤشّر نحو أوّل عنصر من القائمة. في الواقع، يجب الاحتفاظ بعنوان العنصر الأول لكي نعرف أين تبدأ القائمة. إذا عرفنا العنصر الأول، يمكننا أن نجد العناصر الأخرى بـ"القفز" من عنصر لآخر بالاستعانة بالمؤشرات الموالية. 130 | 131 | \begin{information} 132 | هيكل مكوّن من مركّب واحد هو في الغالب غير مفيد. ومع ذلك، أعتقد أننا سنحتاج أن نضيف إليه لاحقًا مركّبات أخرى، يمكننا مثلًا أن نخزّن به حجم القائمة، أي عدد العناصر التي تحتويها. 133 | \end{information} 134 | 135 | لن يكون علينا إنشاء سوى نسخة واحدة من الهيكل 136 | \InlineCode{List}. 137 | هي تسمح بالتحكّم في كلّ القائمة المتسلسلة: 138 | 139 | \begin{figure}[H] 140 | \centering 141 | \includegraphics[width=0.7\textwidth]{Chapter_IV-1_List-struct} 142 | \end{figure} 143 | 144 | \subsection{آخر عنصر في القائمة} 145 | 146 | المخطط أصبح تقريبًا كاملًا. ينقصه شيء أخير: نفضّل أن نحفظ العنصر الأخير من القائمة. في الواقع، يجب أن نتوقّف من التقدّم في القائمة المتسلسلة في لحظة ما. كيف سيتسنى لنا أن نقول للبرنامج: "توقف، هذا هو آخر عنصر"؟ 147 | 148 | سيكون ممكنًا أن نضيف إلى الهيكل 149 | \InlineCode{List} 150 | مؤشّرا نحو آخر عنصر. لكن هناك ما هو أبسط: يكفي أن يؤشّر آخر عنصر من القائمة على 151 | \InlineCode{NULL}، 152 | أي إعطاء المؤشّر 153 | \InlineCode{next} 154 | القيمة 155 | \InlineCode{NULL}. 156 | هذا سيسمح لنا أخيرًا برسم مخطط كامل لبُنية القائمة المتسلسلة: 157 | 158 | \begin{figure}[H] 159 | \centering 160 | \includegraphics[width=0.6\textwidth]{Chapter_IV-1_List-NULL} 161 | \end{figure} 162 | 163 | \section{دوال معالجة القوائم المتسلسلة} 164 | 165 | لقد قًمنا بإنشاء هيكلين يسمحان لنا بالتعامل مع القوائم المتسلسلة: 166 | 167 | \begin{itemize} 168 | \item \InlineCode{Element}، 169 | الذي يوافق عنصرًا من القائمة والذي يمكن لنا أن نكرره بقدر المرات التي نريد. 170 | \item \InlineCode{List}، 171 | الذي يتحكّم في مجموع القائمة المتسلسلة. لن نحتاج إلا لنسخة واحدة منه. 172 | \end{itemize} 173 | 174 | هذا جيد، لكن ينقص الآن الأهم: الدوال التي ستتعامل مع القائمة المتسلسلة. في الواقع، لن نغيّر "يدويا" محتوى الهياكل في كلّ مرة نحتاج فيها إلى ذلك! سيكون من الأكثر حكمة والأكثر نظافة أن نمرّ بدوال تقوم بجعل العمل يتم بشكل تلقائيّ. يجب إنشاؤها هي بدورها. 175 | 176 | كنظرة أولى، أقول بأنك نحتاج إلى دوال لكي: 177 | 178 | \begin{itemize} 179 | \item تهيّئ القائمة. 180 | \item تضيف عنصرًا إليها. 181 | \item تحذف عنصرًا منها. 182 | \item تُظهر محتواها. 183 | \item تحذف القائمة بأكملها. 184 | \end{itemize} 185 | 186 | يمكننا إنشاء دوال أخرى (حساب حجم القائمة مثلًا) لكن يمكن الاستغناء عنها. سنركّز الآن على الدوال التي قمتُ الآن بتعدادها، هذا سيُعطينا قاعدة جيدة. سأدعوك بعد ذلك إلى تحقيق دوال أخرى لكي تتدرّب بعدما تكون قد فهمت المبدأ جيّدًا. 187 | 188 | \subsection{تهيئة القائمة} 189 | 190 | دالة تهيئة القائمة هي أول دالة سنحتاج إلى استدعائها. إذ أنها تقوم بإنشاء هيكل التحكّم وأوّل عنصر من القائمة. أقترح عليك الدالة أسفله والتي سنعلّق عليها بعد ذلك: 191 | 192 | \begin{Csource} 193 | List *initialization() 194 | { 195 | List *list = malloc(sizeof(*list)); 196 | Element *element = malloc(sizeof(*element)); 197 | if (list == NULL || element == NULL) 198 | { 199 | exit(EXIT_FAILURE); 200 | } 201 | element->number = 0; 202 | element->next = NULL; 203 | list->first = element; 204 | return list; 205 | } 206 | \end{Csource} 207 | 208 | نبدأ بإنشاء هيكل التحكّم 209 | \InlineCode{list}. 210 | 211 | \begin{information} 212 | لاحظ أن نوع البيانات هو 213 | \InlineCode{List} 214 | و أن المتغير يسمى 215 | \InlineCode{list}. 216 | تسمح طريقة كتابة الحرف الأول بالتفريق بينهما. 217 | \end{information} 218 | 219 | نحجز بطريقة حيّة هيكل التحكّم باستعمال 220 | \InlineCode{malloc}. 221 | الحجم الذي نحجزه محسوبٌ تلقائيًا باستعمال 222 | \InlineCode{sizeof(*list)}. 223 | سيعرف الجهاز بأنه سيحجز المكان الكافي لتخزين الهيكل 224 | \InlineCode{List}. 225 | 226 | \begin{information} 227 | كان بإمكاننا أن نكتُب أيضًا 228 | \InlineCode{sizeof(List)}، 229 | لكن إن أردنا لاحقًا تغيير نوع المؤشّر 230 | \InlineCode{list} 231 | سيكون علينا تحديث 232 | \InlineCode{sizeof} 233 | كذلك. 234 | \end{information} 235 | 236 | نحجز أيضًا بنفس الطريقة الذاكرة اللازمة لتخزين أول عنصر. نتأكد من أن الحجز الحيّ قد تمّ بنجاح. في حالة خطأ، نوقف البرنامج حالًا باستدعاء الدالة 237 | \InlineCode{exit}. 238 | 239 | أما إن تمّ كلّ شيء على ما يُرام، نعرّف قيم أول عنصر من القائمة المتسلسلة: 240 | 241 | \begin{itemize} 242 | \item يتم إعطاء $ 0 $ للمتغير 243 | \InlineCode{number} 244 | افتراضيًا. 245 | \item المؤشّر 246 | \InlineCode{next} 247 | يؤشّر نحو 248 | \InlineCode{NULL} 249 | لأن أول عنصر في القائمة هو أيضًا آخر واحد لحدّ الآن. كما رأينا سابقًا، يجب على آخر عنصر أن يؤشّر نحو 250 | \InlineCode{NULL} 251 | ليشير إلى نهاية القائمة. 252 | \end{itemize} 253 | 254 | لقد نجحنا الآن في إنشاء قائمة في الذاكرة متكوّنة من عنصر واحد ولها الشكل التالي: 255 | 256 | \begin{figure}[H] 257 | \centering 258 | \includegraphics[width=0.2\textwidth]{Chapter_IV-1_List-1-element} 259 | \end{figure} 260 | 261 | \subsection{إضافة عنصر} 262 | 263 | هنا، تبدأ الأمور في التعقد قليلًا. أين سنضيف عنصراَ جديدًا؟ في بداية القائمة، في نهايتها أو في الوسط؟ 264 | 265 | الإجابة هي أنه لدينا الخيار. سنكون أحرارًا في اختيار ما نريد. في هذا الفصل، أقترح عليك أن نتعلّم كيفية إضافة عنصر إلى بداية القائمة. من ناحية، هذا الأمر سهل الفهم، ومن ناحية أخرى سأعطيك الفرصة في نهاية الفصل في التفكير في طريقة إنشاء دالة تضيف عُنصُرًا في مكان محدد من القائمة. 266 | 267 | يجدر بنا إنشاء دالة قادرة على أن تضيف عُنصرًا جديدًا إلى بداية القائمة. ولكي نفهم أكثر، تخيّل أننا في حالة مشابهة لما تعرضه الصورة الموالية: تتكون القائمة من ثلاثة عناصر ونريد أن نضيف لها عُنصرًا جديدا في البداية: 268 | 269 | \begin{figure}[H] 270 | \centering 271 | \includegraphics[width=0.6\textwidth]{Chapter_IV-1_List-new} 272 | \end{figure} 273 | 274 | يجب أن نقوم بتغيير وضعية المؤشّر 275 | \InlineCode{first} 276 | الخاص بالقائمة وأيضًا المؤشّر 277 | \InlineCode{next} 278 | الخاص بالعنصر الجديد لكي "ندرج" هذا الأخير بشكل صحيح في القائمة. أقترح عليك هذه الشفرة المصدرية التي سنحللها لاحقًا: 279 | 280 | \begin{Csource} 281 | void insertion(List *list, int newNumber) 282 | { 283 | // Creating a new element 284 | Element *new = malloc(sizeof(*new)); 285 | if (list == NULL || new== NULL) 286 | { 287 | exit(EXIT_FAILURE); 288 | } 289 | new->number = newNumber; 290 | // Inserting the element at the beginning of the list 291 | new->next = list->first; 292 | list->first = new; 293 | } 294 | \end{Csource} 295 | 296 | تأخذ الدالة 297 | \InlineCode{insertion} 298 | كمعاملات: عنصر التحكّم في القائمة (الذي يحتوي على عنوان أول عنصر) والعدد الذي نريد تخزينه في العنصر الجديد الذي سنقوم بإنشائه. 299 | 300 | سنقوم أولا بحجز المكان اللازم لتخزين العنصر الجديد ونضع به العدد 301 | \InlineCode{newNumber}. 302 | تبقى إذا المرحلة الحساسة: إدراج العنصر الجديد في القائمة المتسلسلة. 303 | 304 | لقد اخترنا هنا، تسهيلًا للعملية، إضافة العنصر إلى بداية القائمة. لكي نحدّث المؤشّرات بشكل صحيح، سنعتمد على الخطوتين التاليتين بهذا الترتيب المحدد: 305 | 306 | \begin{enumerate} 307 | \item تأشير العنصر الجديد نحو العنصر الذي سيليه مستقبلًا، أي العنصر الحالي الأول من القائمة. 308 | \item تأشير المؤشّر 309 | \InlineCode{first} 310 | نحو العنصر الجديد. 311 | \end{enumerate} 312 | 313 | \begin{warning} 314 | لا يمكننا القيام بهاتين الخطوتين في الترتيب المعاكس! في الواقع، إن قمنا بجعل المؤشّر 315 | \InlineCode{first} 316 | يؤشّر أولا نحو العنصر الجديد، سنخسر عنوان العنصر الأول من القائمة! جرّب ذلك، وستفهم بعد ذلك لمَ عكس الخطوتين أمر مستحيل. 317 | \end{warning} 318 | 319 | بإتباع الخطوتين سنتمكن من إدراج العنصر الجديد بشكل صحيح إلى القائمة المتسلسلة: 320 | 321 | \begin{figure}[H] 322 | \centering 323 | \includegraphics[width=0.7\textwidth]{Chapter_IV-1_List-new-linked} 324 | \end{figure} 325 | 326 | \subsection{حذف عنصر} 327 | 328 | و نفس الشيء بالنسبة للإضافة، سنركّز الآن على عملية حذف أول عنصر من القائمة. تقنيا، يُسمح بمسح عنصر متواجد في وضعية محددة من وسط القائمة، سيكون هذا واحدا من التمارين التي أقترحها عليك في نهاية الفصل. 329 | 330 | عملية حذف عنصر من القائمة المتسلسلة لا تطرح مشكلًا إضافيًا. يجب فقط أن نجري التغييرات على المؤشّرات في الترتيب الصحيح لكي لا "نخسر" أية معلومة. 331 | 332 | \begin{Csource} 333 | void deletion(List *list) 334 | { 335 | if (list == NULL) 336 | { 337 | exit(EXIT_FAILURE); 338 | } 339 | if (list->first != NULL) 340 | { 341 | Element *toDelete = list->first; 342 | list->first = list->first->next; 343 | free(toDelete); 344 | } 345 | } 346 | \end{Csource} 347 | 348 | نبدأ بالتأكد من أن المؤشّر الذي استقبلناه لا يساوي 349 | \InlineCode{NULL}، 350 | و إلا فلن نتمكّن من العمل. نتأكد بعد ذلك إذا كان هناك على الأقل عنصر واحد في القائمة وإلا فلا يوجد أي شيء لنقوم به. 351 | 352 | بعد الانتهاء من هذه الاختبارات، يمكننا حفظ عنوان العنصر الذي نريد حذفه في مؤشّر نسميه 353 | \InlineCode{toDelete}. 354 | يؤشّر بعد ذلك المؤشّر 355 | \InlineCode{first} 356 | نحو العنصر الجديد الأول، والذي هو حاليًا في الوضعية الثانية من القائمة المتسلسلة. 357 | 358 | لا يبقى إلا تحرير العنصر الموافق للمؤشّر 359 | \InlineCode{toDelete} 360 | باستعمال الدالة 361 | \InlineCode{free}: 362 | 363 | \begin{figure}[H] 364 | \centering 365 | \includegraphics[width=0.5\textwidth]{Chapter_IV-1_List-to-delete} 366 | \end{figure} 367 | 368 | هذه الدالة قصيرة لكن هل يمكنك إعادة كتابتها لوحدك؟ يجب أن نفهم جيدًا بأننا يجب أن نقوم بالعمل اتّباعًا لخطوات محددة: 369 | 370 | \begin{enumerate} 371 | \item تأشير 372 | \InlineCode{first} 373 | نحو العنصر الثاني. 374 | \item مسح العنصر الأول باستعمال 375 | \InlineCode{free}. 376 | \end{enumerate} 377 | 378 | إذا قُمنا بالعكس، سنخسر عنوان العنصر الثاني! 379 | 380 | \subsection{إظهار محتوى القائمة المتسلسلة} 381 | 382 | لكي نرى بشكل واضح محتوى القائمة المتسلسلة، سيكون من الأمثل أن نكتب دالة عرض! يكفي أن ننطلق من العنصر الأول وإظهار العناصر واحدًا تلو الآخر بـ"القفز" من كتلة لأخرى. 383 | 384 | \begin{Csource} 385 | void displayList(List *list) 386 | { 387 | if (list == NULL) 388 | { 389 | exit(EXIT_FAILURE); 390 | } 391 | Element *current = list->first; 392 | while (current != NULL) 393 | { 394 | printf("%d -> ", current->number); 395 | current = current->next; 396 | } 397 | printf("NULL\n"); 398 | } 399 | \end{Csource} 400 | 401 | هذه الدالة بسيطة: ننطلق من العنصر الأول ونُظهر محتوى كلّ عنصر (عدد). نستفيد من المؤشّر 402 | \InlineCode{next} 403 | لننتقل إلى العنصر المُوالي في كلّ مرة. 404 | 405 | يمكننا أن نستمتع بتجريب إنشاء قائمتنا المتسلسلة وإظهارها في 406 | \InlineCode{main}: 407 | 408 | \begin{Csource} 409 | int main() 410 | { 411 | List *myList = initialization(); 412 | insertion(myList, 4); 413 | insertion(myList, 8); 414 | insertion(myList, 15); 415 | deletion(myList); 416 | displayList(myList); 417 | return 0; 418 | } 419 | \end{Csource} 420 | 421 | بالإضافة إلى العنصر الأول (والذي تركناه هنا يحمل القيمة 0)، نضيف ثلاثة عناصر جديدة لهذه القائمة. ثم نقوم بحذف عنصر واحد. في النهاية، يتم إظهار محتوى القائمة المتسلسلة بالشكل التالي: 422 | 423 | \begin{Console} 424 | 8 -> 4 -> 0 -> NULL 425 | \end{Console} 426 | 427 | 428 | \section{اذهب بعيدا} 429 | 430 | لقد قُمنا الآن بكتابة الدوال اللازمة للتحكّم في قائمة متسلسلة: التهيئة، إضافة عنصر، حذف عنصر، إلخ. إليك بعض الدوال التي تنقص والتي أدعوك إلى كتابتها، سيكون هذا بمثابة تمرين جيد لك! 431 | 432 | \begin{itemize} 433 | \item \textbf{إضافة عنصر في وسط القائمة}: 434 | حاليًا، لا يمكننا إضافة عناصر إلا في بداية القائمة، هذا كافٍ بشكل عام. أما إن أردنا إضافة عنصر إلى منتصف القائمة، سيكون علينا أن نكتب دالة تأخذ معاملا إضافيّا: عنوان العنصر الذي يسبق العنصر الجديد في القائمة. ستقوم الدالة بالتقدّم في القائمة إلى حين الوصول إلى العنصر المُراد وتقوم بإضافة العنصر الجديد بعده مباشرة. 435 | \item \textbf{حذف عنصر من وسط القائمة}: 436 | المبدأ نفسه بالنسبة للإضافة في وسط القائمة. هذه المرة، يجب عليك أن تضيف معاملا يمثل عنوان العنصر الذي نريد حذفه. 437 | \item \textbf{تدمير القائمة}: 438 | يكفي أن نقوم بحذف كل العناصر واحدًا تلو الآخر! 439 | \item \textbf{حجم السلسلة}: 440 | تشير هذه الدالة إلى كم من عنصر تتكون القائمة المتسلسلة. الأمثل، وفي عوض أن يتم حساب هذه القيمة في كلّ مرة، هو أن نضيف عددا صحيحا 441 | \InlineCode{nbOfElements} 442 | إلى الهيكل 443 | \InlineCode{List}. 444 | يكفي أن نزيد من قيمته في كلّ مرة نضيف فيها عنصرًا جديدًا للقائمة وأن ننقص من قيمته في كلّ مرة نحذف عنصرًا منها. 445 | \end{itemize} 446 | 447 | أنصحك بجمع كلّ دوال معالجة القوائم المتسلسلة في ملفين 448 | \InlineCode{linked\_list.c} 449 | و 450 | \InlineCode{linked\_list.h} 451 | مثلًا. ستكون أوّل مكتبة تكتبها بنفسك! يمكنك إعادة استعمالها في كلّ برامجك الأخرى التي تحتاج فيها إلى القوائم المتسلسلة. 452 | 453 | يمكنك تنزيل مشروع القوائم المتسلسلة الذي يحتوي الدوال التي اكتشفناها سويًا. ستكون هذه بمثابة قاعدة جيدة لك. 454 | 455 | \url{http://www.siteduzero.com/uploads/fr/ftp/mateo21/c/listes_chainees.zip} 456 | 457 | \section*{ملخّص} 458 | 459 | \begin{itemize} 460 | \item تشكّل القوائم المتسلسلة طريقة جديدة لتخزين البيانات في الذاكرة. هي أكثر مرونة من الجداول لأنها تمكّننا من إضافة وحذف "خانات" في أي لحظة نريد. 461 | \item لا تحتوي لغة 462 | \textenglish{C} 463 | على نظام تحكّم في القوائم المتسلسلة، إذ يجب أن نكتبه بأنفسنا! يعتبر هذا طريقة ممتازة للتقدّم في الخوارزميات والبرمجة بشكل عام. 464 | \item في قائمة متسلسلة، كل عنصر هو عبارة عن هيكل يحتوي عنوان العنصر الموالي. 465 | \item يُنصح بإنشاء هيكل تحكّم (من نوع 466 | \InlineCode{List} 467 | في حالتنا هذه) يحتوي عنوان أول عنصر في القائمة. 468 | \item توجد نسخة محسّنة - لكن أكثر تعقيدًا - من القوائم المتسلسلة ونسمّيها "القوائم مزدوجة التسلسل"، والتي يحتوي كلّ عنصر فيها على عنوان العنصر السابق أيضًا. 469 | \end{itemize} 470 | -------------------------------------------------------------------------------- /Chapter_IV-2.tex: -------------------------------------------------------------------------------- 1 | \chapter{المكدّسات والطوابير (\textenglish{Stacks and Queues})} 2 | 3 | لقد اكتشفنا مع القوائم المتسلسلة طريقة جديدة أكثر مرونة من الجداول لتخزين البيانات. هذه القوائم مرنة بشكل خاص لأنه يمكننا أن نُدرج فيها ونحذف منها بيانات من أي مكان أردنا وفي أية لحظة. 4 | 5 | المكدّسات والطوابير التي سنكتشفها هنا هما شكلان خاصّان نوعًا ما من القوائم المتسلسلة. فهما تسمحان بالتحكّم بالطريقة التي تُضاف بها العناصر الجديدة إليها. هذه المرة لن نقوم بإضافة عناصر جديدة في وسط القائمة، بل فقط في البداية أو النهاية. 6 | 7 | المكدّسات والطوابير تعتبران مفيدتان للغاية من أجل البرامج التي تحلل المعطيات الّتي تصل بالتدريج. سنرى بالتفصيل كيف تعملان في هذا الفصل. 8 | 9 | تتشابه المكدّسات والطوابير كثيرًا، لكنهما تختلفان اختلافًا بسيطًا ستتعرف عليه بسرعة. سنكتشف أولًا المكدّسات والتي ستذكّرك بالقوائم المتّصلة بشكل كبير. 10 | 11 | بشكل عام، سيكون هذا الفصل بسيطًا إذا كنت قد فهمت جيّدًا كيفية عمل القوائم المتسلسلة. إن لم تكن هذه حالتك، فأعد قراءة الفصل السابق لأننا سنحتاج إليه. 12 | 13 | \section{المكدّسات (\textenglish{Stacks})} 14 | 15 | تخيّل مكدّسًا للقطع النقدية (الصورة التالية). يمكنك إضافة قطع أخرى واحدة تلو الأخرى في أعلى المكدّس، ويمكنك أيضًا نزع القطع من أعلى المكدّس. بالمقابل، لا يمكن نزع قطعة من أسفل المكدّس. إن أردت التجريب، أتمنى لك حظًا موفّقًا! 16 | 17 | \begin{figure}[H] 18 | \centering 19 | \includegraphics[height=0.2\textheight]{Chapter_IV-2_Money-stack} 20 | \end{figure} 21 | 22 | \subsection{كيفية عمل المكدّسات} 23 | 24 | مبدأ عمل المكدّسات في البرمجة ينصّ على تخزين البيانات مع وصولها على التوالي واحدة فوق الأخرى لكي نستطيع استرجاعها فيما بعد. مثلا، تخيّل مكدّسًا للأعداد الصحيحة من نوع 25 | \InlineCode{int} 26 | (الصورة الموالية). لو أضيف عنصرًا (نتكلّم عن 27 | \textbf{التكديس})، 28 | فستتم إضافته في أعلى المكدّس، تمامًا كما في لعبة 29 | \textenglish{Tetris}: 30 | 31 | \begin{figure}[H] 32 | \centering 33 | \includegraphics[height=0.15\textheight]{Chapter_IV-2_Stack} 34 | \end{figure} 35 | \begin{figure}[H] 36 | \centering 37 | \includegraphics[height=0.2\textheight]{Chapter_IV-2_Stack-add} 38 | \end{figure} 39 | 40 | الأكثر أهمية هو وجود عملية تقوم باستخراج الأعداد من المكدّس. نحن نتكلّم عن 41 | \textbf{إلغاء التكديس}. 42 | نسترجع القيم واحدة تلو الأخرى، بدءً من الأخيرة الموضوعة أعلى المكدّس (الصورة الموالية). ننزع البيانات على التوالي حتى نصل إلى قاع المكدّس. 43 | 44 | \begin{figure}[H] 45 | \centering 46 | \includegraphics[height=0.2\textheight]{Chapter_IV-2_Stack-remove} 47 | \end{figure} 48 | 49 | نسمي هذا بخوارزمية 50 | \textbf{\textenglish{LIFO}}، 51 | و التي تعني 52 | "\textenglish{Last In First Out}". 53 | الترجمة: "آخر عُنصر تمت إضافته، هو أول عنصر يخرج". 54 | 55 | عناصر المكدّس مرتبطة ببعضها بطريقة القوائم المتسلسلة. فهي تحمل مؤشّرًا نحو العنصر الموالي ولا تُوضع بالضرورة بجنب بعضها في الذاكرة. يجب على آخر عُنصر (في أقصى أسفل المكدّس) أن يؤشّر نحو 56 | \InlineCode{NULL} 57 | لكي يقول أنّنا\dots لمسنا القاع: 58 | 59 | \begin{figure}[H] 60 | \centering 61 | \includegraphics[height=0.15\textheight]{Chapter_IV-2_Stack-numbers} 62 | \end{figure} 63 | 64 | \begin{question} 65 | فيما ينفع كلّ هذا، واقعيّا؟ 66 | \end{question} 67 | 68 | توجد برامج تحتاج فيها إلى تخزين البيانات مؤقّتًا لإخراجها اعتمادًا على ترتيب محدد: يجب على آخر عُنصر أدخلته أن يخرج هو الأول. 69 | 70 | لأعطي مثالًا واقعيًا، يستعمل نظام التشغيل في حاسوبك هذا النوع من الخوارزميات لكي يتذكر الترتيب الذي تم استدعاء الدوال فيه. تخيّل مثالا: 71 | 72 | \begin{enumerate} 73 | \item يبدأ البرنامج بالدالة 74 | \InlineCode{main} 75 | (مثل كل مرّة). 76 | \item تستدعي فيها الدالة 77 | \InlineCode{play}. 78 | \item تقوم هذه الدالة 79 | \InlineCode{play} 80 | بدورها باستدعاء الدالة 81 | \InlineCode{load}. 82 | \item ما إن تنتهي الدالة 83 | \InlineCode{load}، 84 | نعود إلى الدالة 85 | \InlineCode{play}. 86 | \item ما إن تنتهي الدالة 87 | \InlineCode{play}، 88 | نعود إلى الدالة 89 | \InlineCode{main}. 90 | \item أخيرًا، ما إن تنتهي الدالة 91 | \InlineCode{main}. 92 | لا تبقى أية دالة تحتاج إلى الاستدعاء، ينتهي البرنامج. 93 | \end{enumerate} 94 | 95 | لكي "يتذكّر" الترتيب الذي تم فيه استدعاء الدوال، يُنشئ الحاسوب مكدّسًا لهذه الدوال على التوالي: 96 | 97 | \begin{figure}[H] 98 | \centering 99 | \includegraphics[width=0.5\textwidth]{Chapter_IV-2_Stack-history} 100 | \end{figure} 101 | 102 | هذا مثال واقعيّ عن استعمال المكدّسات. وبفضل هذه التقنية يعرف الجهاز الآن إلى أي دالة يجب عليه أن يعود. يمكنه أن يكدّس 100 استدعاء للدوال إن وجب الأمر، لكنّه سيرجع ليجد الدالة الرئيسية في أسفل المكدّس! 103 | 104 | \subsection{إنشاء نظام مكدّس} 105 | 106 | و الآن بما أننا فهمنا مبدأ عمل المكدّسات، فلنحاول بناء واحد. تماما مثل القوائم المتسلسلة، لا يوجد نظام مكدّس مضمّن في لغة 107 | \textenglish{C}. 108 | يجب أن ننشئه بأنفسنا. 109 | 110 | سيكون لكل عنصر من المكدّس هيكل مماثل للهيكل الخاص بالقائمة المتسلسلة: 111 | 112 | \begin{Csource} 113 | typedef struct Element Element; 114 | struct Element 115 | { 116 | int number; 117 | Element *next; 118 | }; 119 | \end{Csource} 120 | 121 | يحتوي هيكل التحكّم على عنوان أول عنصر من المكدس، أي العنصر المتواجد في الأعلى: 122 | 123 | \begin{Csource} 124 | typedef struct Stack Stack; 125 | struct Stack 126 | { 127 | Element *first; 128 | }; 129 | \end{Csource} 130 | 131 | سنحتاج ككل إلى الدوال التالية: 132 | 133 | \begin{itemize} 134 | \item تكديس عنصر. 135 | \item إلغاء تكديس عنصر. 136 | \end{itemize} 137 | 138 | ستلاحظ أنه، على خلاف القوائم المتسلسلة، لا نتكلّم لا عن الإضافة ولا عن الحذف. نتكلّم عن التكديس وإلغاء التكديس. لأن هاتين العمليتين محدودتان على عنصر واحد محدد، كما رأينا. بهذا، يمكننا إضافة ونزع عنصر من المكدّس من الأعلى فقط. 139 | 140 | يمكننا أيضًا كتابة دالة لإظهار محتوى المكدّس، أمر عمليّ للتأكد من أن البرنامج يعمل بشكل صحيح. 141 | 142 | هيا بنا! 143 | 144 | \subsubsection{التكديس (\textenglish{stacking})} 145 | 146 | يجدر بدالتنا 147 | \InlineCode{stack} 148 | أن تأخذ كمعاملين هيكل التحكّم في المكدّس (من نوع 149 | \InlineCode{Stack}) 150 | و العدد الجديد لتخزينه.\\ 151 | أذكّرك بأننا نخزّن هنا أعدادًا صحيحة 152 | \InlineCode{int}، 153 | لكن لا شيء يمنعنا من تعديل هذه الأمثلة لأنواع أخرى من البيانات. يمكننا تخزين أي شيء: أعداد 154 | \InlineCode{double}، 155 | محارف 156 | \InlineCode{char}، 157 | سلاسل محارف، جداول وحتى هياكل أخرى! 158 | 159 | \begin{Csource} 160 | void stack(Stack *stk, int newNumber) 161 | { 162 | Element *new = malloc(sizeof(*new)); 163 | if (stk == NULL || new == NULL) 164 | { 165 | exit(EXIT_FAILURE); 166 | } 167 | new->number = newNumber; 168 | new->next = stk->first; 169 | stk->first = new; 170 | } 171 | \end{Csource} 172 | 173 | تتم الإضافة في بداية المكدّس لأنه، كما رأينا، يستحيل القيام بذلك في المنتصف. هذا مبدأ عمل المكدّسات، نضيف دائما من الأعلى. \\ 174 | بهذا، على عكس القوائم المتسلسلة، لا يجب أن ننشئ دالة لإدراج عنصر في منتصف المكدّس. يجب أن تكون الدالة 175 | \InlineCode{stack} 176 | هي الوحيدة الّتي يمكنها إضافة عناصر جديدة للمكدس. 177 | 178 | \subsubsection{إلغاء التكديس (\textenglish{unstacking})} 179 | 180 | دور دالة إلغاء التكديس هو حذف العنصر المتواجد في أعلى المكدّس، قد تشك في ذلك. لكن يجب على هذه الدالة أيضا أن تُرجع إلينا العنصر الذي حذفته. في حالتنا، هو العدد الّذي كان موجودا في أعلى المكدّس. 181 | 182 | هذه هي الطريقة التي نصل بها إلى عناصر المكدّس: ننزعها واحدًا تلو الآخر. نحن لا نتقدّم فيها باحثين عن الوصول إلى ثاني وثالث عنصر. بل نطلب دائمًا استرجاع على أول عنصر. 183 | 184 | دالتنا 185 | \InlineCode{unstack} 186 | ستُرجع إذا 187 | \InlineCode{int} 188 | يوافق العدد المتواجد في رأس المكدّس: 189 | 190 | \begin{Csource} 191 | int unstack(Stack *stack) 192 | { 193 | if (stack == NULL) 194 | { 195 | exit(EXIT_FAILURE); 196 | } 197 | int unstackedNumber = 0; 198 | Element *unstackedElement = stack->first; 199 | if (stack != NULL§\footnotemark§ && stack->first != NULL) 200 | { 201 | unstackedNumber = unstackedElement->number; 202 | stack->first = unstackedElement->next; 203 | free(unstackedElement); 204 | } 205 | return unstackedNumber; 206 | } 207 | \end{Csource} 208 | 209 | \begin{tcolorbox}[title={\footnotemark[1]ملاحظة مُرَاجِع الكتاب}, colback=orange!20, colframe=orange!70, fontupper=\small, coltitle=white, fonttitle=\normalsize, attach title] 210 | يبدو لي أن مؤلّف الكتاب قد أضاف جزءً عديم الفائدة في الشرط الثاني: 211 | \InlineCode{stack != NULL}، 212 | فَبِوُصول البرنامج إلى ذلك السطر سيكون هذا الجزء من الشرط خاطئا بكلّ تأكيد لأنّنا قد تحقّقنا من عكسه في الشرط الأوّل 213 | (\InlineCode{if(stack == NULL)}). 214 | و حتى عند عدم وجود الشرط الأوّل، فالتعليمة 215 | \InlineCode{stack->first} 216 | كانت ستعطّل البرنامج لأنّ مؤشّرًا 217 | \InlineCode{NULL} 218 | لا يملك أيّة مركّبات! 219 | \end{tcolorbox} 220 | 221 | نسترجع العدد الذي في رأس المكدّس لنبعثه في نهاية الدالة. نعدّل عنوان أول عنصر من المكدّس بما أن هذا الأخير يتغير. 222 | أخيرًا، نحذف بالتأكيد رأس المكدّس القديم باستعمال 223 | \InlineCode{free}. 224 | 225 | \subsubsection{إظهار محتوى المكدّس} 226 | 227 | بالرغم من أن هذه الدالة غير ضروريّة (الدالتان 228 | \InlineCode{stack} 229 | و 230 | \InlineCode{unstack} 231 | كافيتان للتحكّم في المكدّس!)، ستكون مهمّة لاختبار عمل المكدّس وخاصّة "لمعاينة" النتيجة: 232 | 233 | \begin{Csource} 234 | void displayStack(Stack *stack) 235 | { 236 | if (stack == NULL) 237 | { 238 | exit(EXIT_FAILURE); 239 | } 240 | Element *current = stack->first; 241 | while (current != NULL) 242 | { 243 | printf("%d\n", current->number); 244 | current = current ->next; 245 | } 246 | printf("\n"); 247 | } 248 | \end{Csource} 249 | 250 | بما أن هذه الدالة بسيطة بسخافة، فهي لا تحتاج شرحًا. 251 | 252 | بالمقابل، حان الآن إذًا لكتابة الدالة الرئيسية لاختبار سلوك مكدّسنا: 253 | 254 | \begin{Csource} 255 | int main() 256 | { 257 | Stack *myStack = initialization(); // See the previous chapter 258 | stack(myStack, 4); 259 | stack(myStack, 8); 260 | stack(myStack, 15); 261 | stack(myStack, 16); 262 | stack(myStack, 23); 263 | stack(myStack, 42); 264 | printf("\nStack's state :\n"); 265 | displayStack(myStack); 266 | printf("I unstack %d\n", unstack(myStack)); 267 | printf("I unstack %d\n", stack(myStack)); 268 | printf("\nStack's state :\n"); 269 | displayStack(myStack); 270 | return 0; 271 | } 272 | \end{Csource} 273 | 274 | نُظهر حالة المكدّس بعد الكثير من التكديس ومرة أخرى بعد كثير من إلغاء التكديس. نُظهر أيضًا العدد الذي قُمنا بحذفه في كلّ مرة نقوم بإلغاء التكديس. النتيجة في الكونسول هي التالية: 275 | 276 | \begin{Console} 277 | Stack's state : 278 | 42 279 | 23 280 | 16 281 | 15 282 | 8 283 | 4 284 | 285 | I unstack 42 286 | I unstack 23 287 | 288 | Stack's state : 289 | 16 290 | 15 291 | 8 292 | 4 293 | \end{Console} 294 | 295 | تأكّد أنك تفهم جيّدًا ما يحصل في البرنامج. إذا فهمت هذا، فقد فهمت كيفية عمل المكدّسات! 296 | 297 | يمكنك تنزيل مشروع المكدّسات كاملًا لو أردت: 298 | 299 | \url{http://www.siteduzero.com/uploads/fr/ftp/mateo21/c/piles.zip} 300 | 301 | \section{الطوابير (\textenglish{Queues})} 302 | 303 | تشبه الطوابير المكدّسات كثيرًا، إلا أنها تعمل بالاتجاه المعاكس! 304 | 305 | \subsection{كيفية عمل الطوابير} 306 | 307 | في هذا النظام، يتم وضع العناصر الواحد بعدَ الآخر. أوّل عنصر يخرج من الطابور هو أول عنصر يدخل إليه. نتكلّم هنا عن خوارزمية 308 | \textenglish{FIFO} (\textenglish{First In First Out})، 309 | و هذا يعني: "أول من يصل هو أول من يخرج". 310 | 311 | تسهل المشابهة بالحياة اليوميّة. حينما تشتري تذكرة لمشاهدة السينما، تقف في طابور شبّاك التذاكر (الصورة الموالية). باستثناء إن كنت أحد إخوة بائع التذاكر، يجدر بك الوقوف في الطابور وانتظار دورك مثل كلّ الآخرين. أول الواصلين هو أول من تتم خدمته. 312 | 313 | \begin{figure}[H] 314 | \centering 315 | \includegraphics[width=0.6\textwidth]{Chapter_IV-2_Humans-queue} 316 | \end{figure} 317 | 318 | في البرمجة، تفيد الطوابير في إيقاف مؤقّت للمعلومات حسب الترتيب الذي وصلت به. مثلًا، في برنامج مُحادثة، لو تتلقى ثلاثة رسائل يفصلها فارق زمني قصير جدًا، يتم صفُّها في طابور واحدة تلو الأخرى في الذاكرة. ثم يتم إظهار أوّل رسالة وصلت ثم الثانية وهكذا. 319 | 320 | يتم تخزين الأحداث التي تبعثها المكتبة 321 | \textenglish{SDL} 322 | التي قُمنا بدراستها أيضا في طابور. إذا حرّكت الفأرة، يتم توليد حدث من أجل كلّ بيكسل تحرّك فوقه مؤشّر الفأرة. تخزن 323 | \textenglish{SDL} 324 | الأحداث في طابور ثم تبعثها لنا واحدا واحدا في كلّ مرة نستدعي فيها الدالة 325 | \InlineCode{SDL\_PollEvent} 326 | (أو 327 | \InlineCode{SDL\_WaitEvent}). 328 | 329 | في لغة 330 | \textenglish{C}، 331 | الطابور هو قائمة متسلسلة أين يقوم كلّ عنصر فيها بالتأشير على العنصر الموالي، تمامًا مثل المكدّسات. آخر عنصر من الطابور يؤشّر نحو 332 | \InlineCode{NULL}: 333 | 334 | \begin{figure}[H] 335 | \centering 336 | \includegraphics[width=0.4\textwidth]{Chapter_IV-2_Queue} 337 | \end{figure} 338 | 339 | \subsection{إنشاء نظام طابور} 340 | 341 | نظام الطابور يشبه ذلك الخاص بالمكدّسات. يوجد اختلاف بسيط في كون أن العناصر تخرج في الاتجاه المعاكس، لا يوجد شيء صعب إن كنت قد فهمت المكدّسات. 342 | 343 | سننشئ هيكل 344 | \InlineCode{Element} 345 | و هيكل تحكّم 346 | \InlineCode{Queue}: 347 | 348 | \begin{Csource} 349 | typedef struct Element Element; 350 | struct Element 351 | { 352 | int number; 353 | Element *next; 354 | }; 355 | typedef struct Queue Queue; 356 | struct Queue 357 | { 358 | Element *first; 359 | }; 360 | \end{Csource} 361 | 362 | تماما كالمكدّسات، كل عنصر من الطابور سيكون من نوع 363 | \InlineCode{Element}. 364 | بالاستعانة بالمؤشّر 365 | \InlineCode{first} 366 | سنتوفّر دائمًا على العنصر الأول ويمكننا من خلاله الصعود إلى آخر عنصر. 367 | 368 | \subsubsection{إضافة عنصر إلى الطابور (\textenglish{enqueuing})} 369 | 370 | الدالة التي تضيف عُنصُرًا إلى الطابور تسمّى دالة "الإلحاق" 371 | (\textenglish{enqueuing}). 372 | توجد حالتان: 373 | 374 | \begin{itemize} 375 | \item إما أن الطابور فارغ، في هذه الحالة يجب أن ننشئ الطابور بجعل المؤشّر 376 | \InlineCode{first} 377 | يؤشّر نحو العنصر الجديد الذي نحن بصدد إنشائه. 378 | \item إما أن الطابور غير فارغ، في هذه الحالة يجب أن نتقدّم في الطابور انطلاقًا من العنصر الأول حتى نصل إلى آخر عنصر. نضيف العنصر الجديد بعد آخر عنصر. 379 | \end{itemize} 380 | إليك ما يمكننا فعله عمليًا: 381 | 382 | \begin{Csource} 383 | void enqueue(Queue *q, int newNumber) 384 | { 385 | Element *new = malloc(sizeof(*new)); 386 | if (q == NULL || new == NULL) 387 | { 388 | exit(EXIT_FAILURE); 389 | } 390 | new->number = newNumber; 391 | new->next = NULL; 392 | if (q->first != NULL) // The queue is not empty 393 | { 394 | // We move to the end of the queue 395 | Element *currentElement = q->first; 396 | while (currentElement->next != NULL) 397 | { 398 | currentElement = currentElement->next; 399 | } 400 | currentElement->next = new; 401 | } 402 | else /* The queue is empty, it's our first element */ 403 | { 404 | q->first = new; 405 | } 406 | } 407 | \end{Csource} 408 | 409 | ترى في هذه الشفرة المصدرية تحليل كلتا الحالتين، كلّ منهما يجب أن تتم دراستها على حدى. الاختلاف مقارنةً بالمكدّسات، والذي يضيف لمسة صعوبة صغيرة، هو أنه يجب التموضع في نهاية الطابور لوضع العنصر الجديد. لكن لابأس فحلقة 410 | \InlineCode{while} 411 | كافية للقيام باللازم، هذا ما يمكنك ملاحظته. 412 | 413 | \subsubsection{إزالة عنصر من الطابور (\textenglish{dequeuing})} 414 | 415 | عملية إلغاء الإلحاق 416 | (\textenglish{dequeuing}) 417 | تشابه كثيرًا عملية إلغاء التكديس. بامتلاكنا مؤشّرا نحو أول عنصر من الطابور، يكفي أن ننزعه وأن نُرجع قيمته. 418 | 419 | \begin{Csource} 420 | int dequeue(Queue *queue) 421 | { 422 | if (queue == NULL) 423 | { 424 | exit(EXIT_FAILURE); 425 | } 426 | int dequeuedNumber = 0; 427 | // We verify if there's something to dequeue 428 | if (queue->first != NULL) 429 | { 430 | Element *dequeuedElement = queue->first; 431 | dequeuedNumber = dequeuedElement->number; 432 | queue->first = dequeuedElement->next; 433 | free(dequeuedElement); 434 | } 435 | return dequeuedNumber; 436 | } 437 | \end{Csource} 438 | 439 | \subsubsection{حان دورك!} 440 | 441 | تبقى دالة إظهار محتوى الطابور 442 | \InlineCode{displayQueue} 443 | و عملها مشابه لما قمنا به مع المكدّسات. سيسمح لك هذا بالتأكد من سلامة عمل الطابور. 444 | 445 | قم بعد ذلك بكتابة 446 | \InlineCode{main} 447 | من أجل تجريب البرنامج. يجدر بنتيجة البرنامج أن تشبه هذه: 448 | 449 | \begin{Console} 450 | Queue's state : 451 | 4 8 15 16 23 42 452 | 453 | I dequeue 4 454 | I dequeue 8 455 | 456 | Queue's state : 457 | 15 16 23 42 458 | \end{Console} 459 | 460 | يجدر أن تكون قادرًا على إنشاء مكتبة الطوابير الخاصة بك، بملفات 461 | \InlineCode{queue.h} 462 | و 463 | \InlineCode{queue.c} 464 | مثلًا. 465 | 466 | أقترح عليك تنزيل مشروع التحكّم في الطوابير كاملًا إن أردت. إنه يتضمّن الدالة 467 | \InlineCode{displayQueue}: 468 | 469 | \url{http://www.siteduzero.com/uploads/fr/ftp/mateo21/c/files.zip} 470 | 471 | \section*{ملخّص} 472 | 473 | \begin{itemize} 474 | \item تسمح المكدّسات والطوابير بتنظيم معطيات في الذاكرة عند وصولها بالتوالي. 475 | \item تستعمل المكدّسات والطوابير نظام قوائم متسلسلة لتجميع العناصر. 476 | \item في حالة المكدّسات، تتم إضافة المعطيات الواحدة فوق الأخرى. وإن أردنا استخراج بيانة، فسنستخرج آخر واحدة والتي كنا بصدد إضافتها (الأحدث). نتكّلم هنا عن خوارزمية 477 | \textenglish{LIFO} (\textenglish{Last In First Out}). 478 | \item في حالة الطوابير، تتم إضافة المعطيات الواحدة بعد الأخرى. نقوم باستخراج البيانة الأولى والتي قمنا بإضافتها أولا للطابور (الأقدم). نتكلّم عن خوارزمية 479 | \textenglish{FIFO} (\textenglish{First In First Out}). 480 | \end{itemize} 481 | -------------------------------------------------------------------------------- /Chapter_IV-3.tex: -------------------------------------------------------------------------------- 1 | \chapter{جداول التجزئة (\textenglish{Hash tables})} 2 | 3 | للقوائم المتسلسلة نقطة ضعف كبيرة في حال أردنا قراءة محتواها: يستحيل الوصول إلى عنصر معيّن مباشرة. يجب التقدّم في القائمة عنصرًا بعنصر حتى نجد العنصر الذي نريد. هذا يطرح مشاكل من ناحية الأداء ما إن يكون حجم القائمة المتسلسلة ضخمًا. تخيّل قائمة متسلسلة تتكوّن من 1000 عنصر بينما العنصر الذي نبحث عنه موجود في آخرها! 4 | 5 | تمثّل جداول التجزئة طريقة أخرى لتخزين البيانات. حيث أنها تستند على مبدأ الجداول في لغة 6 | \textenglish{C} 7 | و التي نعرف التعامل معها جيّدًا. ماهي فائدتها الكُبرى؟ هي تسمح بإيجاد سريع لعنصر محدد، سواء كان الجدول يحتوي 100، 1000، 10000 خانة أو حتى أكثر! 8 | 9 | \section{لماذا نستعمل جدول تجزئة؟} 10 | 11 | لننطلق من المشكل الذي تطرحه القوائم المتسلسلة. هذه الأخيرة مرنة بشكل خاص، هذا ما استطعنا ملاحظته: يمكننا إضافة أو إزالة خانات في أي لحظة نريد، بينما يكون الجدول "ثابتًا" ما إن يتم إنشاؤه. 12 | 13 | لكن، كما قلتُ لك في المقدّمة، للقوائم المتسلسلة عيب كبير: إذا أردنا استرجاع عنصر محدد من القائمة، يجب تصفّح هذه الأخيرة حتى نجد ذلك العنصر! 14 | 15 | تخيّل قائمة متسلسلة تحتوي معلومات حول الطلّاب: الاسم، العُمر والمعدّل. سيتم تمثيل كلّ طالب بهيكل نسميه 16 | \InlineCode{Student}. 17 | 18 | \begin{information} 19 | عملنا سابقًا على القوائم المتسلسلة التي تحتوي على 20 | \InlineCode{int}. 21 | كما قلتُ لك، من الممكن تخزين أي شيء نريد في قائمة، حتى مؤشّرًا نحو هيكل آخر كما سأقترحه لك الآن. 22 | \end{information} 23 | 24 | إذا أردتُ الوصول إلى المعلومات الخاصة بالشخص 25 | \textenglish{Luc Doncieux} 26 | في الصورة الموالية، يجب عليّ التقدّم في كلّ القائمة كي أكتشف بأنه العنصر الأخير فيها! 27 | 28 | \begin{figure}[H] 29 | \centering 30 | \includegraphics[width=0.8\textwidth]{Chapter_IV-3_Student-list} 31 | \end{figure} 32 | 33 | \begin{information} 34 | بالفعل، لو أننا بحثنا عن الشخص 35 | \textenglish{Julien Lefebvre}، 36 | كان البحث ليكون أسرع بما أنه متواجد في بداية القائمة. ومع ذلك، لتقييم كفاءة الخوارزمية، يجب أن نفكّر دائمًا في أسوء الحالات. والأسوأ هو 37 | \textenglish{Luc} 38 | هنا.\\ 39 | هنا، نقول أن خوارزمية البحث لها تعقيد 40 | (\textenglish{complexity}) 41 | \textit{\textenglish{O(n)}}، 42 | لأنه يجب تصفّح كل القائمة المتسلسلة للوصول إلى العُنصر المراد، وفي أسوء الحالات يكون هذا هو آخر عنصر. إذا كانت القائمة تحتوي على 9 عناصر، يجب أن يتم تشغيل 9 دورات للحلقة كحد أقصى لإيجاد العنصر. 43 | \end{information} 44 | 45 | في هذا المثال، لا تحتوي القائمة المتسلسلة سوى على أربعة عناصر. سيجد الحاسوب الشخص 46 | \textenglish{Luc Doncieux} 47 | بسرعة كبيرة لا تسمح لنا حتى بأن نقول كلمة "أووه". لكن تخيّل أن هذا الشخص يتواجد في آخر قائمة متسلسلة من 10000 عنصر! ليس مقبولا أن يتم البحث في 10000 عنصر لإيجاد المعلومة. هنا تتدخّل جداول التجزئة. 48 | 49 | \section{ماهي جداول التجزئة؟} 50 | 51 | إذا كنت تتذكر جيدًا، لا تعرف الجداول هذا النوع من المشاكل. لهذا، كي نصل إلى العنصر في الوضعية 2 من الجدول تكفيني كتابة التالي: 52 | 53 | \begin{Csource} 54 | int table[4] = {12, 7, 14, 33}; 55 | printf("%d", table[2]); 56 | \end{Csource} 57 | 58 | لو نعطي للحاسوب 59 | \InlineCode{table[2]}، 60 | فسيتوجّه مباشرة إلى المكان في الذاكرة أين هو مخزّن العدد 14. أي أنه لن يتقدّم في الجدول خانة بخانة. 61 | 62 | \begin{question} 63 | هل أنت بصدد القول أن الجداول ليست "بذلك القدر من السوء"؟ لكن في هذه الحالة سنخسر الميزات التي توفّرها القوائم المتسلسلة التي تسمح لنا بإضافة وإزالة خانات في أي لحظة! 64 | \end{question} 65 | 66 | في الواقع، القوائم المتسلسلة مرنة أكثر. أما بالنسبة للجداول، فهي تسمح بالوصول السريع للمعطيات. يمكننا القول أن 67 | \textbf{جداول التجزئة} 68 | تشكّل حلّا وسطا بين الإثنين. 69 | 70 | يوجد عيب في استعمال الجداول لم نتكلّم عنه سابقًا: يتم تعريف خانات الجدول عن طريق أرقام نسمّيها 71 | \textbf{الفهارس} 72 | (\textenglish{Indices}). 73 | لا يمكن أن نطلب من الحاسوب: "ماهي المعلومات المتواجدة في الخانة التي تسمّى 74 | "\textenglish{Luc Doncieux}". 75 | أي أننا لإيجاد العُمر والمعدّل لن نتمكّن من كتابة: 76 | 77 | \begin{Csource} 78 | table["Luc Doncieux"]; 79 | \end{Csource} 80 | 81 | مع أنه سيكون عمليًا لو أننا نستطيع الوصول إلى خانة ما باستعمال الاسم فقط! حسنًا، هذا ممكن باستعمال جداول التجزئة. 82 | 83 | \begin{information} 84 | كما رأينا مؤخّرًا. لا تشكّل جداول التجزئة "جزءً" من لغة 85 | \textenglish{C}. 86 | نتحدّث هنا عن مبدأ. سنعيد استعمال أساسيات لغة 87 | \textenglish{C} 88 | التي نعرفها من قبل لأجل إنشاء نظام ذكي جديد. وكأنه في لغة 89 | \textenglish{C}، 90 | باستعمال بعض الأدوات القاعدية، يمكننا إنشاء الكثير من الأشياء! 91 | \end{information} 92 | 93 | \begin{question} 94 | بما أنه من الواجب أن يتم ترقيم الجدول بالفهارس، كيف سنجد رقم الخانة لو أننا نعرف الاسم 95 | "\textenglish{Luc Doncieux}" 96 | فقط؟ 97 | \end{question} 98 | 99 | ملاحظة جيدة. في الواقع، يبقى الجدول جدولًا ولن يعمل إلا بالفهارس المرقّمة. تخيّل جدولًا يوافق الصورة الموالية: كل خانة لها فهرس وتتوفر على مؤشّر نحو هيكل من نوع 100 | \InlineCode{Student}. 101 | أنت تعرف القيام بهذا الآن: 102 | 103 | \begin{figure}[H] 104 | \centering 105 | \includegraphics[height=0.3\textheight]{Chapter_IV-3_Array-indices} 106 | \end{figure} 107 | 108 | لو أردنا إيجاد الخانة التي توافق 109 | \textenglish{Luc Doncieux}، 110 | يجب أن نجيد تحويل الاسم إلى فهرس في الجدول. وبهذا، يجب أن نتمكّن من ربط كلّ اسم برقم من خانة في الجدول: 111 | 112 | \begin{itemize} 113 | \item \textenglish{Julien Lefebvre} = $0$. 114 | \item \textenglish{Aurélie Bassoli} = $1$. 115 | \item \textenglish{Yann Martinez} = $2$. 116 | \item \textenglish{Luc Doncieux} = $3$. 117 | \end{itemize} 118 | 119 | لا يمكننا أن نكتب 120 | \InlineCode{table["Luc Doncieux"]} 121 | كما فعلتُ سابقًا. لأن هذا غير مسموح به في لغة 122 | \textenglish{C}. 123 | 124 | السؤال الذي يُطرح هو: كيف نحوّل سلسلة محارف إلى عدد؟ هذا هو سحر التجزئة. تجب كتابة دالة تأخذ كمعامل سلسلة محارف، تطبّق حسابات عليها، ثم تُرجع لنا عددًا يوافق تلك السلسلة. سيكون هذا العدد هو فهرس الخانة في الجدول: 125 | 126 | \begin{figure}[H] 127 | \centering 128 | \includegraphics[width=\textwidth]{Chapter_IV-3_Array-indices-hash} 129 | \end{figure} 130 | 131 | \section{كتابة دالة تجزئة} 132 | 133 | تكمن كلّ الصعوبة في كتابة دالة تجزئة صحيحة. كيف نحوّل سلسلةً محرفيّة إلى عدد وحيد؟ 134 | 135 | أولا وقبل كلّ شيء، لنوضح الأمور: جدول التجزئة لا يحتوي 4 خانات كما أضع في الأمثلة، لكن 100 أو 1000 أو أكثر. لا يهم حجم الجدول، لأن البحث سيكون سريعًا جدًا دائما. 136 | 137 | \begin{information} 138 | نقول أن هذا تعقيد بـدرجة 139 | \textit{\textenglish{O(1)}} 140 | لأننا نجد مباشرة عنصر البحث. في الواقع، دالة التجزئة سترجع لنا فهرسا: يكفي "القفز" مباشرة إلى الخانة الموافقة للجدول. لسنا بحاجة إلى تصفّح كلّ الخانات! 141 | \end{information} 142 | 143 | تخيّل إذًا جدولًا من 100 خانة، تقوم فيه بتخزين مؤشّرات نحو هياكل من نوع 144 | \InlineCode{Student}. 145 | 146 | \begin{Csource} 147 | Student* table[100]; 148 | \end{Csource} 149 | 150 | يجب علينا أن نكتب دالة، انطلاقًا من اسم، تولّد عددًا محصورًا بين 0 و99 (رُتب الجدول). هنا يتطلّب منا الأمر الحذاقة. توجد طُرق رياضية جدّ معقّدة كي "نجزّئ" البيانات، أي أن نحوّلها إلى أعداد. 151 | 152 | \begin{information} 153 | الخوارزميتان 154 | \textenglish{MD5} 155 | و 156 | \textenglish{SHA1} 157 | هما دالتا تجزئة مشهورتان، لكنهما متقدّمتان كثيرا بالنسبة لنا حاليًا. 158 | \end{information} 159 | 160 | يمكنك اختراع دالة التجزئة الخاصة بك. هنا، لكي نبسّط الأمور، أقترح عليك ببساطة أن تجمع القيم 161 | \textenglish{ASCII} 162 | لكلّ حرف من الاسم، أي من أجل الاسم 163 | \textenglish{Luc Doncieux} 164 | ستكون لدينا عملية الجمع التالية: 165 | 166 | \begin{Csource} 167 | 'L' + 'u' + 'c' + ' ' + 'D' + 'o' + 'n' + 'c' + 'i' + 'e' + 'u' + 'x' 168 | \end{Csource} 169 | 170 | سيكون لدينا مشكل: هذا المجموع يتخطّى الـ100! بما أن الجدول الذي أنشأناه لا يحتوي سوى على 100 خانة، فإن أخذنا بهذه القيمة فسنخاطر بالخروج من حدود الجدول.\\ 171 | أذكّرك بأن كلّ محرف في جدول 172 | \textenglish{ASCII} 173 | يمكن أن يكون مرقّما حتّى 255. وبهذا سنتجاوز بسرعة حاجز الـ100. 174 | 175 | لحلّ هذا المشكل، يمكننا استعمال عامل الترديد 176 | \InlineCode{\%}. 177 | هل تتذكره؟ إنّه يعطي باقي القسمة! لو نقوم بهذا الحساب: 178 | 179 | \begin{Csource} 180 | lettersSum % 100 181 | \end{Csource} 182 | 183 | سنتحصّل قطعًا على عدد محصور بين 0 و99. مثلًا، لو أن المجموع يساوي 4315، باقي القسمة على 100 هو 15. ستُرجع إذا دالة التجزئة القيمة 15. 184 | 185 | إليك ما يمكن أن تكون عليه الدالة: 186 | 187 | \begin{Csource} 188 | int hash(char *string) 189 | { 190 | int i = 0, hashNumber= 0; 191 | for (i = 0 ; string[i] != '\0' ; i++) 192 | { 193 | hashNumber += string[i]; 194 | } 195 | hashNumber %= 100; 196 | return hashNumber; 197 | } 198 | \end{Csource} 199 | 200 | لو نعطيها 201 | \InlineCode{hash("Luc Doncieux")}، 202 | ستُرجع لنا القيمة 55. وبـ\InlineCode{hash("Yann Martinez")}، 203 | نتحصّل على 80. 204 | 205 | بفضل دالة التجزئة هذه، يمكنك أن تعرف في أي خانة من الجدول يجب أن تضع المعلومات! إذا أردت الوصول إلى هذه الخانات لاحقًا لاسترجاع المعلومة، تكفي "تجزئة" اسم الشخص من جديد لكي نجد فهرس الخانة في الجدول أين تخزّن المعلومات! 206 | 207 | أنصحك بإنشاء دالة بحث تتكفّل بتجزئة المفتاح (الاسم) وتُرجع لنا مؤشّرًا نحو المعلومات التي نبحثُ عنها. هذا سيعطينا مثلا: 208 | 209 | \begin{Csource} 210 | infoAboutLuc = findHashTable(table, "Luc Doncieux"); 211 | \end{Csource} 212 | 213 | \section{معالجة التصادمات (\textenglish{Collisions management})} 214 | 215 | حينما تُرجع دالة التجزئة نفس العدد من أجل مفتاحين مختلفين، نقول أنّه حدث 216 | \textbf{تصادم}. 217 | مثلا في دالتنا، لو أننا نملك شخصًا اسمه تحريك حروف لـ\textenglish{Luc Doncieux}، 218 | مثلًا 219 | \textenglish{Luc Doncueix}، 220 | سيكون مجموع الأحرف هو نفسه، وبهذا فإن نتيجة دالة التجزئة ستكون نفسها! 221 | 222 | يمكن لسببين أن يشرحا التصادم: 223 | 224 | \begin{itemize} 225 | \item دالة التجزئة لا تعمل بكفاءة عالية. هذا يمثّل حالتنا. لقد كتبنا دالة سهلة جدًا (لكن نوعًا ما كافية) من أجل الأمثلة. الدالتان 226 | \textenglish{MD5} 227 | و 228 | \textenglish{SHA1} 229 | المذكورتان أعلاه هما ذات جودة عالية لأنهما تنتجان نسبة قليلة من التصادُمات. ولتعلم أن 230 | \textenglish{SHA1} 231 | مفضّلة في أيامنا هذه أكثر من 232 | \textenglish{MD5} 233 | لأنها تنتج نسبة تصادمات أقل مقارنة بنظيرتها. 234 | 235 | \item الجدول الذي نخزن به المعلومات صغير الحجم كثيرًا. لو أننا ننشئ جدولا من 4 خانات ونريد تخزين 5 أشخاص، فسيحدث تصادم بالتأكيد، أي أن دالة التجزئة ستُعطي نفس الفهرس من أجل اسمين مختلفين. 236 | \end{itemize} 237 | 238 | إذا حصل تصادم فلا داعي للخوف! هناك حلان يمكنك الاختيار بينهما: العـَنوَنـَة المفتوحة والسَلْسَلَة. 239 | 240 | 241 | \subsection{العنونة المفتوحة (\textenglish{Open addressing})} 242 | إذا بقيت أمكنة شاغرة في الجدول، يمكنك تطبيق التقنية التي تُدعى 243 | \textbf{التجزئة الخطيّة}. 244 | المبدأ سهل. هل الخانة محجوزة؟ لا يوجد مشكل، سننتقل للخانة التي تليها. آه، هل هذه محجوزة أيضًا؟ توجّه للتي بعدها. 245 | 246 | و هكذا حتى تجد خانة موالية فارغة. إن وصلت إلى نهاية الجدول، فعد إلى البداية وأكمل البحث. 247 | 248 | تطبيق هذه الطريقة سهل جدًا، لكن إن واجهت الكثير من التصادمات، فسيكون عليك استغراق وقت كبير في البحث عن الخانة الشاغرة الموالية. 249 | 250 | توجد طرق بديلة (التجزئة المزدوجة، التجزئة الرباعية\dots) والتي تنصّ على التجزّئة من جديد حسب دالة أخرى في حالة وجود تصادم. هذه الدوال أكثر كفاءة لكن أكثر تعقيدا من ناحية التطبيق. 251 | 252 | \subsection{السَلْسَلَة (\textenglish{Chaining})} 253 | 254 | حلّ آخر ينصّ على إنشاء قائمة متسلسلة في مكان التصادم. هل تريد تخزين بيانتين (أو أكثر) في نفس الخانة؟ استعمل قائمة متسلسلة وأنشئ مؤشّرًا نحو هذه القائمة انطلاقًا من الجدول: 255 | 256 | \begin{figure}[H] 257 | \centering 258 | \includegraphics[height=0.3\textheight]{Chapter_IV-3_Hash-list} 259 | \end{figure} 260 | 261 | بالفعل، سنعود لمشكل القوائم المتسلسلة: إذا كان هناك 300 عنصرٍ في هذا الموقع من الجدول، يجب تصفّح القائمة المتسلسلة إلى حين إيجاد العنصر الصحيح. 262 | 263 | هنا، كما ترى. ليست القوائم المتسلسلة دائمًا الأمثل، لكن لجداول التجزئة حدودها أيضًا. يمكننا المزج بين الاثنين من أجل الحصول على الجانب الأفضل من كلّ بنية. 264 | 265 | على أية حال، النقطة الحساسة في جداول التجزئة هي دالة التجزئة. فكلّما أنتجت تصادُمات أقل. كلما كان ذلك أفضل. 266 | سأترك لك مهمة إيجاد دالة التجزئة المناسبة لحالتنا! 267 | 268 | \section*{ملخّص} 269 | 270 | \begin{itemize} 271 | \item القوائم المتسلسلة مرنة، لكن عملية إيجاد عنصر محدد تستغرق وقتًا طويلًا لأنه يجب تصفّح القائمة عنصرًا بعنصر. 272 | \item جداول التجزئة هي جداول نخزّن فيها المعلومات في مكان محدد بواسطة دالة التجزئة. 273 | \item تأخذ دالة التجزئة مفتاحًا كمعامل (مثلًا: سلسلة محرفيّة) وتعيد عددا كمخرج. 274 | \item يتم استعمال هذا العدد لمعرفة عند أي فهرس من الجدول يجب تخزين البيانات. 275 | \item دالة التجزئة الأكثر كفاءة هي التي لا تولّد عددًا كبيرًا من التصادُمات، أي أنها تتجنب قدر المستطاع إرجاع نفس العدد من أجل مفتاحين مختلفين. 276 | \item في حالة التصادم، يمكننا استعمال تقنية العنونة المفتوحة (البحث عن خانة شاغرة أخرى في الجدول) أو استعمال تقنية السلسلة (الدمج مع القوائم المتسلسلة). 277 | \end{itemize} 278 | -------------------------------------------------------------------------------- /Conclusion.tex: -------------------------------------------------------------------------------- 1 | \chapter*{خاتمة} 2 | 3 | هل تريد 4 | \textit{المزيد} 5 | ؟ 6 | 7 | لماذا لا تتعلّم لغة \textenglish{C++} 8 | ؟ 9 | 10 | \url{http://www.siteduzero.com/tuto-3-5395-0-apprenez-a-programmer-en-c.html} 11 | 12 | هذا درس آخر كتبتُه حول هذه اللغة قريبة \textenglish{C}. 13 | إذا كنت تعرف \textenglish{C}، 14 | فلن تكون ضائعًا بل ستفهم بسرعة فائقة الفصول الأولى!\\ 15 | فليكن في علمك أنني كتبت درسًا قصيرا يسمّى "من \textenglish{C} 16 | إلى \textenglish{C++}" 17 | الذي يبيّن جزءًا من الاختلاف بين \textenglish{C} 18 | و\textenglish{C++}. 19 | 20 | \url{http://www.siteduzero.com/tutoriel-3-430167-du-c-au-c.html} 21 | 22 | بلغة \textenglish{C++}، 23 | يمكنك البدء في البرمجة غرضية التوجّه (أو البرمجة الكائنية) (\textenglish{OOP}). 24 | قد يكون هذا المبدأ معقّدا قليلا في البداية، لكن ستجد بأن هذه الطريقة في البرمجة ناجعة جدًا! ستكتشف أيضًا معها المكتبة 25 | \textenglish{Qt} 26 | التي تسمح بإنجاز واجهات رسومية كاملة جدّا. 27 | 28 | أشكر كثيرا 29 | \href{http://www.siteduzero.com/membres-294-45753.html}{Taurre} 30 | و 31 | \href{http://www.siteduzero.com/membres-294-181268.html}{Pouet\_forever} 32 | لمساعدتهم الكبيرة في القيام بالمراجعات الأخيرة لهذه الدروس. 33 | -------------------------------------------------------------------------------- /Fonts/LiberationMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationMono-Bold.ttf -------------------------------------------------------------------------------- /Fonts/LiberationMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationMono-BoldItalic.ttf -------------------------------------------------------------------------------- /Fonts/LiberationMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationMono-Italic.ttf -------------------------------------------------------------------------------- /Fonts/LiberationMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationMono-Regular.ttf -------------------------------------------------------------------------------- /Fonts/LiberationSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationSans-Bold.ttf -------------------------------------------------------------------------------- /Fonts/LiberationSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationSans-BoldItalic.ttf -------------------------------------------------------------------------------- /Fonts/LiberationSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationSans-Italic.ttf -------------------------------------------------------------------------------- /Fonts/LiberationSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/LiberationSans-Regular.ttf -------------------------------------------------------------------------------- /Fonts/amiri-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/amiri-bold.ttf -------------------------------------------------------------------------------- /Fonts/amiri-boldslanted.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/amiri-boldslanted.ttf -------------------------------------------------------------------------------- /Fonts/amiri-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/amiri-regular.ttf -------------------------------------------------------------------------------- /Fonts/amiri-slanted.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Fonts/amiri-slanted.ttf -------------------------------------------------------------------------------- /FrontCover.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/FrontCover.pdf -------------------------------------------------------------------------------- /Introduction.tex: -------------------------------------------------------------------------------- 1 | \chapter*{تقديم} 2 | إن التحرّر الفكري في بداية القرن العشرين أدّى إلى توسّع في البحوث العلمية التي شملت كل الميادين لا سيّما التكنولوجية منها كعلوم الحاسوب. هذه الأخيرة أعقبتها ثورة في لغات البرمجة التي تعتبر ركيزة أساسية تقوم عليها البرامج. من بين هذه اللغات نجد لغة \textenglish{C}، 3 | إذ تعتبر من أقوى لغات البرمجة وأكثرها شيوعًا، فهي مستلهمة من طرف لغتي 4 | \textenglish{B} 5 | و 6 | \textenglish{BCPL} 7 | حيث تمّ تطويرها في عام 1972 من طرف 8 | \textenglish{Ken Thompson} 9 | و 10 | \textenglish{Dennis Ritchie}، 11 | وفي ظرف سنة واحدة توسّعت لتكون عِـماد نظام التشغيل 12 | \textenglish{UNIX} 13 | بنسبة 14 | 90\% 15 | ثم تم توزيعها في العام المـُوالي رسميًا عبر الجامعات لتصبح بذلك لغة برمجة عالمية. واشتهرت لغة \textenglish{C} 16 | كونـُها لغة عالية المستوى، لها مُترجم سريع وفعّال. كما أنها لغة برمجية نقّالة، هذا يعني أن أي برنامج يحترم المعيار 17 | \textenglish{AINSI} 18 | يمكن أن يتمّ تشغيله على أيّة منصّة تحتوي على مترجم 19 | \textenglish{C} 20 | دون أيّة تخصيصات. 21 | 22 | يعتبر هذا الكتاب بوابة سهلة لكلّ مبتدئ لتعلّم لغة \textenglish{C} 23 | خطوة بخطوة بدءً من الأساسيات وصولًا إلى تطوير ألعاب ثنائية الأبعاد والتحكّم في هياكل البيانات الأكثر تعقيدًا. الكتاب مرفق بجملة من التمارين والأعمال التطبيقية المحلولة التي تساعد على هضم المفاهيم المكتسبة وتطبيقها على أيّ مشكل برمجي مهما كان نوعه. ولأن الكثير من لغات البرمجة تعتمد أساسًا على \textenglish{C} 24 | مثل \textenglish{Java} 25 | و\textenglish{C++} 26 | و\textenglish{C\#} 27 | (لغات برمجية غرضية التوجّه) وحتى 28 | \textenglish{PHP} 29 | (لغة لبرمجة المواقع) فإن تعلّم لغة \textenglish{C} 30 | سيساعد على تعلّم أيّة لغة برمجية كانت. تبقى الإرادة وحبّ العمل والشغف المفاتيح الرئيسية للنجاح والوصول إلى الاحترافية. 31 | 32 | \vfill 33 | 34 | \hfill\parbox{0.3\textwidth}{\centering 35 | عدن بلواضح 36 | 37 | \vspace{1em} 38 | الجزائر\\[0.5em] 39 | في 40 | 24 ذو القعدة 1438\\[0.3em] 41 | الموافق لـ17 أوت 2017 42 | %\Hijritoday\\[0.3em] 43 | %الموافق لـ\today 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Introduction_original.tex: -------------------------------------------------------------------------------- 1 | \chapter*{مقدّمة} 2 | 3 | \vspace{-0.6em} 4 | تحبّ تعلّم البرمجة لكن لا تعرف من أين تبدأ؟ هذه الدروس لتعليم لغة\textenglish{C} 5 | للمبتدئين قد جُعلت خصّيصًا من أجلك! 6 | 7 | \vspace{-0.1em} 8 | لغة \textenglish{C} 9 | هي لغة لا مفرّ منها، اُستلهمَت منها العديد من اللغات الأخرى. تمّ اختراعها في السبعينات وما زالت مستعملة لحدّ الآن في البرمجة النظامية وعالم الروبوتات. تعتبر لغة \textenglish{C} 10 | لغة معقّدة، لكن إن استطعت تعلّمها ستكوّن لك قاعدة برمجية صلبة! 11 | 12 | \vspace{-0.1em} 13 | في هذه الدروس، ستبدأ باكتشاف مبدأ عمل الذاكرة، والمتغيرات، والشروط والحلقات. ثم ستقوم باستعمال كلّ ما تعلّمته في إنشاء واجهات رسومية بالاستعانة بمكتبة 14 | \textenglish{SDL} 15 | (ألعاب فيديو، تسجيلات صوتية\dots). أخيرًا، ستتعلّم كيف تتعامل مع هياكل البيانات الأكثر شيوعًا من أجل تنظيم المعلومات في الذاكرة: قوائم متسلسلة، مكدّسات، طوابير، جداول تجزئة\dots 16 | 17 | \vspace{-0.1em} 18 | التحق بي في هذه الدروس من أجل اكتشاف البرمجة بلغة \textenglish{C}! 19 | 20 | \begin{figure}[H] 21 | \centering 22 | \includegraphics[height=0.4\textheight]{Introduction_original}\\ 23 | \small بعض الإنجازات الّتي سنقوم بها في هذا الكتاب 24 | \end{figure} 25 | 26 | \vfill 27 | \hfill\parbox{0.3\textwidth}{\centering \textenglish{Mathieu Nebra}\\[0.2em] 28 | مؤسس مشارك لموقع 29 | \href{http://openclassrooms.com/}{\textenglish{OpenClassrooms}} 30 | } 31 | -------------------------------------------------------------------------------- /Pictures/Chapter_I-1_Compilation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-1_Compilation.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-1_MetalSlug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-1_MetalSlug.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-1_Translation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-1_Translation.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_CodeBlocks-C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_CodeBlocks-C.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_CodeBlocks-New-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_CodeBlocks-New-project.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_CodeBlocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_CodeBlocks.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_CodeBlocks_Compiler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_CodeBlocks_Compiler.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_CodeBlocks_project-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_CodeBlocks_project-path.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Compile-toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Compile-toolbar.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-New-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-New-file.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-New-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-New-project.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-New-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-New-source.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-Parameters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-Parameters.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-Welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-Welcome.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp-main.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Visual-Cpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Visual-Cpp.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Xcode-C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Xcode-C.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Xcode-New-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Xcode-New-project.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-2_Xcode-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-2_Xcode-main.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_Console-Windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_Console-Windows.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_Console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_Console.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_Good-Morning-backslash-n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_Good-Morning-backslash-n.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_Good-Morning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_Good-Morning.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_HelloWorld-run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_HelloWorld-run.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_HelloWorld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_HelloWorld.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-3_Paint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-3_Paint.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-4_Computer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-4_Computer.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-4_RAM-Schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-4_RAM-Schema.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-4_RAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-4_RAM.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-7_Loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-7_Loop.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-9_function-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-9_function-io.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-9_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-9_main.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-9_triple-call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-9_triple-call.png -------------------------------------------------------------------------------- /Pictures/Chapter_I-9_triple-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_I-9_triple-io.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_array.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_array.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_array_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_array_overflow.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_array_patrice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_array_patrice.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_buffer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_buffer.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_buffer_rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_buffer_rest.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-10_string.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-10_string.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Compilation-Schema-Libraries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Compilation-Schema-Libraries.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Compilation-Schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Compilation-Schema.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Project-Add-File.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Project-Add-File.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Project-Sokoban-Folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Project-Sokoban-Folder.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Project-Sokoban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Project-Sokoban.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-1_Project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-1_Project.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-2_RAM-Schema-Pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-2_RAM-Schema-Pointer.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-2_RAM-Schema-Pointer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-2_RAM-Schema-Pointer2.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-2_RAM-Schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-2_RAM-Schema.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-3_Array-Adresses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-3_Array-Adresses.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-4_String-Concatenation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-4_String-Concatenation.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-4_String-Copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-4_String-Copy.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-4_String-Memory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-4_String-Memory.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-4_String-Memory2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-4_String-Memory2.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-4_String-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-4_String-Search.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-5_file-c-file-h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-5_file-c-file-h.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-6_Axis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-6_Axis.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-7_Files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-7_Files.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-7_test-A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-7_test-A.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-7_test-fprintf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-7_test-fprintf.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-7_test-string.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-7_test-string.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-8_RAM-Schema-char.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-8_RAM-Schema-char.png -------------------------------------------------------------------------------- /Pictures/Chapter_II-8_RAM-Schema-int.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_II-8_RAM-Schema-int.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_CodeBlocks-New-Project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_CodeBlocks-New-Project.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Game.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-DLL-copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-DLL-copy.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-DLL-past.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-DLL-past.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-Mac-Download-version.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-Mac-Download-version.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-Mac-Download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-Mac-Download.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-Project-Welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-Project-Welcome.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-Project-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-Project-path.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-Project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-Project.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-add.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-build-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-build-target.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-file-properties-advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-file-properties-advanced.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-file-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-file-properties.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-folder.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-h-copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-h-copy.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-h-past.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-h-past.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-keep-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-keep-open.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-mainc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-mainc.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-new-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-new-file.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-path-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-path-filled.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-path-select-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-path-select-2.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-path-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-path-select.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-path.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-project-unused-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-project-unused-files.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-remove-cpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-remove-cpp.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-rename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-rename.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-selection.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-test-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-test-project.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL-test-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL-test-window.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_SDL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_SDL.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_VisualCpp-Add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_VisualCpp-Add.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_VisualCpp-Assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_VisualCpp-Assistant.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_VisualCpp-project-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_VisualCpp-project-properties.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-SDL-build-setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-SDL-build-setting.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-SDL-framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-SDL-framework.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-SDL-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-SDL-project.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-SDL-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-SDL-target.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-drop-framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-drop-framework.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-1_Xcode-gcc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-1_Xcode-gcc.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Colors-paste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Colors-paste.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Colors.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Empty-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Empty-window.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-color-centered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-color-centered.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-color.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-coordinates.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-gradient-coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-gradient-coordinates.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-gradient.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-2_Window-title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-2_Window-title.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_CodeBlocks-Linker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_CodeBlocks-Linker.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Sapin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Sapin.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-0.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-128.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-190.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-190.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-255.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-Alpha-75.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor-transparent.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image-Zozor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image-Zozor.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-Image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-Image.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Window-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Window-icon.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Xcode-frameworks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Xcode-frameworks.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-3_Zozor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-3_Zozor.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Close.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Double-buffering-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Double-buffering-1.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Double-buffering-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Double-buffering-2.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Window-Zozor-moved-mouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Window-Zozor-moved-mouse.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Window-Zozor-moved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Window-Zozor-moved.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-4_Window-Zozor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-4_Window-Zozor.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Box.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Box2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Box2.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Editor.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Home.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Map.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-Sokoban-exe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-Sokoban-exe.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-Sokoban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-Sokoban.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-down.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-left.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-right.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Mario-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Mario-up.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Target.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-5_Wall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-5_Wall.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-6_Process-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-6_Process-0.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-6_Process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-6_Process.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Blended-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Blended-text.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Blended.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Blended.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Font1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Font1.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Font2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Font2.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Font3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Font3.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Italic-underlined-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Italic-underlined-text.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Shaded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Shaded.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Solid.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-7_Time-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-7_Time-text.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-8_Aim-misplaced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-8_Aim-misplaced.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-8_Aim-wellplaced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-8_Aim-wellplaced.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-8_Aim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-8_Aim.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-8_FindSounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-8_FindSounds.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-8_Window-aim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-8_Window-aim.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-9_Frequencies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-9_Frequencies.png -------------------------------------------------------------------------------- /Pictures/Chapter_III-9_Window-spectral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_III-9_Window-spectral.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_Array-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_Array-add.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_Array.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_Array.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_Linked-list-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_Linked-list-data.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_Linked-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_Linked-list.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-1-element.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-1-element.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-NULL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-NULL.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-new-linked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-new-linked.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-new.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-struct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-struct.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-1_List-to-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-1_List-to-delete.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Humans-queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Humans-queue.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Money-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Money-stack.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Queue.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Stack-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Stack-add.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Stack-history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Stack-history.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Stack-numbers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Stack-numbers.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Stack-remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Stack-remove.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-2_Stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-2_Stack.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-3_Array-indices-hash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-3_Array-indices-hash.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-3_Array-indices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-3_Array-indices.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-3_Hash-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-3_Hash-list.png -------------------------------------------------------------------------------- /Pictures/Chapter_IV-3_Student-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Chapter_IV-3_Student-list.png -------------------------------------------------------------------------------- /Pictures/FrontCover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/FrontCover.jpg -------------------------------------------------------------------------------- /Pictures/Introduction_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/Introduction_original.png -------------------------------------------------------------------------------- /Pictures/OpenClassrooms-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hamza5/Learn-to-program-with-C_AR/e293655c718c7dce8d495db342d9fb5dbc7806b5/Pictures/OpenClassrooms-logo.jpg -------------------------------------------------------------------------------- /Project_page.tex: -------------------------------------------------------------------------------- 1 | \clearpage 2 | \thispagestyle{empty} 3 | \oldsection*{\LARGE\color{section} 4 | تنزيل المشروع} 5 | 6 | {\large 7 | تمّت إنشاء هذا الكتاب بلغة التوصيف 8 | \LaTeX 9 | وترجمته بمترجم 10 | \XeLaTeX. 11 | يمكن الحصول على النص المصدريّ الخاصة به عن طريق استنساخ مستودع 12 | \textenglish{GitHub} 13 | الآتي: 14 | 15 | \url{https://github.com/Hamza5/Learn-to-program-with-C_AR} 16 | 17 | يوجد في هذه الصفحة أيضا رابط لتنزيل النسخة الرقميّة بصيغة 18 | \textenglish{PDF}، 19 | وشرح لطريقة الترجمة والاعتماديّات الواجب توفّرها، بالإضافة إلى النص المصدريّ الخاصة به. 20 | 21 | إذا كنت من مستخدمي 22 | \textenglish{GitHub}، 23 | يمكنك التبليغ عن الأخطاء الّتي قد تجدها في الكتاب عن طريق فتح 24 | \textenglish{issue} 25 | في هذا المستودع وكتابة تفاصيل الخطأ (الفصل، القسم، الفقرة، رقم الصفحة والتصحيح الموافق إن أمكن)؛ أو عن طريق استنساخ/\textenglish{fork} 26 | المستودع لإنشاء نسخة مطابقة كمستودع خاص بك، ثم إدخال التعديلات المرادة. بعد ذلك، يمكنك طلب دمج/\textenglish{pull request} 27 | مستودعك بالمستودع الأصلي. في حالة ما كان التعديل جيّدا، سأقوم بدمجه في المستودع. 28 | } 29 | 30 | \oldsection*{\LARGE\color{section} 31 | الترخيص 32 | } 33 | {\large 34 | محتوى هذا الكتاب مرخّص تحت بنود رخصة 35 | \textbf{المشاع الإبداعي، نسب المصنف - غير تجاري - الترخيص بالمثل، النسخة الثانية 36 | (\textenglish{CC-BY-NC-SA 2.0})}، 37 | تماما مثل ترخيص الدرس الأصلي المتوفّر في موقع 38 | \textenglish{OpenClassrooms}. 39 | 40 | \url{https://creativecommons.org/licenses/by-nc-sa/2.0/} 41 | 42 | هذا يعني أنّه بإمكانك الاستفادة من هذا العمل، نسخه وإعادة توزيعه بأيّة وسيلة أو صيغة، وكذلك تعديله واستخدامه في أعمال أخرى. كلّ هذا بشرط أن تشير إلى العمل الأصلي، تعطي رابطا إلى هذه الرخصة، وتدلّ على التعديلات إن قمت بذلك. بالإضافة إلى ذلك، لا يمكنك استخدام عملك للأغراض التجاريّة من دون إذن صاحب العمل، كما يجب عليك ترخيص عملك بنفس الرخصة من دون فرض أيّة قيود إضافيّة على مستخدمي عملك. 43 | 44 | \oldsection*{\LARGE\color{section} 45 | شُكر} 46 | {\large 47 | نتوجه بالشكر و التقدير لكل المساهمين في هذا المشروع، سواء كانت مساهمتهم عن طريق تصحيح الأخطاء الواردة في هذا الكتاب أو بالتبليغ عنها، أو حتى بالدعم المعنوي و رسائل التشجيع ! 48 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #
تعلّم البرمجة بلغة C
2 | 3 | ![الغلاف الأمامي](Pictures/FrontCover.jpg) 4 | 5 | ##
التنزيل
6 | 7 |
8 | 9 | يمكنكم تنزيل آخر نسخة من هذا الكتاب بصيغة PDF من صفحة الإصدارات. 10 | 11 |
12 | 13 | ##
عن المشروع
14 | 15 | 16 |
17 |
18 | هذا الكتاب هو ترجمة لـدرس تعلّم البرمجة بلغة C 19 | الخاص بموقع OpenClassrooms من الفرنسيّة إلى العربية. يمتاز هذا الدرس بكونه سهل الفهم على المبتدئين في مجال البرمجة، إذ أنّه لا يفترض وجود أيّة مكتسبات قبليّة في هذا المجال لدى القارئ. 20 |
21 | 22 |
23 | يحتوي الكتاب على معلومات مفصّلة بخصوص البرمجة بشكل عام ولغة C بشكل خاص، مدعّمة بكثير من المخطّطات التوضيحيّة، والأمثلة والتمارين المصحّحة. 24 |
25 | 26 |
27 | يتكوّن الكتاب من 31 فصلا موزّعة على 4 أجزاء. فصول الجزء الأوّل تحوّل القارئ من شخص لا علاقة له بالبرمجة إلى مبرمج مبتدئ قادر على استخدام أدوات البرمجة ومستوعب للمفاهيم الأساسيّة كأنواع البيانات، والمتغيّرات، والشروط، والحلقات التكراريّة والدوال. في الجزء الثاني، يتعلّم القارئ مفاهيم أكثر تقدّما في البرمجة، كالمؤشّرات، والجداول، والسلاسل المحرفيّة والهياكل بالإضافة إلى الحجز الحيّ للذاكرة والتعامل مع الملفّات. بعد ذلك، يتناول الجزء الثالث مبدأ استخدام المكتبات البرمجيّة مركّزا على استغلال مكتبة SDL لإنشاء النوافذ والرسم فيها ومكتبة FMOD لتشغيل الصوت واستعمالهما لإنشاء برامج وألعاب حقيقيّة. في الأخير، فصول الجزء الرابع تتناول مواضيع مكمّلة في لغة C تتمثّل في تقنيّات شائعة الاستخدام لتخزين البيانات، كالقوائم المتسلسلة، وجداول التجزئة، والمكدّسات والطوابير. 28 |
29 | 30 |
31 | لقد حرصنا على نقل كلّ الأفكار التي قدّمها الكاتب في الدرس الأصلي من بدايته إلى نهايته. كما بذلنا جهدنا في أن يكون النص بسيطا قدر الإمكان ومفهوما للقارئ العربي العادي. 32 |
33 | 34 |
35 | و في النهاية، لا يسعنا سوى أن نتطلّع بلهفة إلى تجريب برنامجك الخارق الّذي ستنئشئه بعد ختامك لهذا الكتاب! 36 |
37 |
38 | 39 | 40 | ####
فصول الكتاب
41 | 42 |
43 |
    44 |
  • تقديم
  • 45 |
  • مقدمة
  • 46 |
47 |
    48 |
  • أساسيّات البرمحة بلغة C 49 |
      50 |
    • قلت برمجة؟
    • 51 |
    • الحصول على الأدوات اللازمة
    • 52 |
    • برنامجك الأوّل
    • 53 |
    • عالم المتغيّرات
    • 54 |
    • حسابات سهلة
    • 55 |
    • الشروط
    • 56 |
    • الحلقات التكراريّة
    • 57 |
    • عمل تطبيقي: "أكثر أو أقل"، لعبتك الأولى
    • 58 |
    • الدوال
    • 59 |
    60 |
  • 61 |
  • تقنيات متقدّمة في لغة C 62 |
      63 |
    • البرمجة المجزأة
    • 64 |
    • المؤشّرات
    • 65 |
    • الجداول
    • 66 |
    • السلاسل المحرفيّة
    • 67 |
    • المعالج القبلي
    • 68 |
    • أنشئ أنواع متغيّرات خاصة بك
    • 69 |
    • قراءة الملفّات وكتابتها
    • 70 |
    • الحجز الحيّ للذاكرة
    • 71 |
    • عمل تطبيقي: لعبة Pendu
    • 72 |
    • إدخال نص بشكل أكثر أمانا
    • 73 |
    74 |
  • 75 |
  • إنشاء الألعاب ثنائية الأبعاد باستخدام SDL 76 |
      77 |
    • تثبيت SDL
    • 78 |
    • إنشاء نافذة ومساحات
    • 79 |
    • إظهار صور
    • 80 |
    • معالجة الأحداث
    • 81 |
    • عمل تطبيقي: Mario Sokoban
    • 82 |
    • تحكّم في الوقت
    • 83 |
    • كتابة نصوص باستخدام SDL_ttf
    • 84 |
    • تشغيل الصوت بـFMOD
    • 85 |
    • عمل تطبيقي: الإظهار الطيفيّ للصوت
    • 86 |
    87 |
  • 88 |
  • هياكل البيانات 89 |
      90 |
    • القوائم المتسلسلة
    • 91 |
    • المكدّسات والطوابير
    • 92 |
    • جداول التجزئة
    • 93 |
    94 |
  • 95 |
  • الخاتمة
  • 96 |
97 | 98 | 99 |
100 | 101 | ##
الترخيص
102 | 103 |
104 | نظرا لأن محتوى الدرس الأصلي مرخّص تحت 105 | ترخيص المشاع الإبداعي، نسب المصنف - غير تجاري - الترخيص بالمثل، النسخة الثانية (CC-BY-NC-SA 2.0) 106 | فإن المحتوى المترجم مرخّص بذات الرخصة. 107 |
108 | 109 | ##
البناء
110 | 111 |
112 | الملفات المصدرية في هذا المشروع مكتوبة بلغة LaTeX، لكن يجب ترجمتها بمترجم XeLaTex أو LuaLaTex لأنها تحتوي على محارف Unicode (هذا لأنها مكتوبة بالعربيّة)، ويفترض أنّ هذين المترجمين يكونان مرفقين في أي توزيعة TexLive أو MikTex. 113 |
114 | نحن نترجمها بالأمر التالي باستخدام مترجم XeLaTex: 115 |
116 | 117 | xelatex book.tex 118 | 119 |
120 | ينتج عن هذا الأمر ملف book.pdf يمثّل الكتاب، أما بقيّة الملفات فغير ضرورية ويمكن التخلّص منها. 121 |
122 | 123 | ####
الاعتماديّات
124 | 125 |
يجب أن تكون الحزم التالية متوفرة في توزيعتك لكي تتم عملية الترجمة بنجاح:
126 | 127 | * fontspec 128 | * tcolorbox 129 | * graphicx 130 | * hyperref 131 | * fancyhdr 132 | * polyglossia 133 | * geometry 134 | * listings 135 | * bidi 136 | * float 137 | * xcolor 138 | * tabu 139 | * booktabs 140 | * pdfpages 141 | 142 | ##
المساهمة
143 | 144 |
145 | إذا عثرت على أية أخطاء في هذا الكتاب، علمية كانت أو لغوية، أو أيّا كان نوعها، فيسرنا أن تقوم بإبلاغنا بها عن طريق فتح بلاغ علة/issue أو دمجها بطلب/pull request. 146 |
147 | -------------------------------------------------------------------------------- /Title_page.tex: -------------------------------------------------------------------------------- 1 | \thispagestyle{empty} 2 | \cleardoublepage 3 | \thispagestyle{empty} 4 | \begin{center} 5 | {\fontsize{0.7cm}{1.4cm}\selectfont\bfseries 6 | \textcolor{section}{\textenglish{Mathieu Nebra}} 7 | } 8 | 9 | \vspace{1cm} 10 | \textcolor{chapter}{\mdseries 11 | {\fontsize{2cm}{4cm}\selectfont 12 | تَعَلَّم البَرْمَجَة بلُغَة}\\ 13 | {\fontsize{3cm}{6cm}\selectfont 14 | \textenglish{C} 15 | } 16 | } 17 | 18 | \vspace{1cm} 19 | { 20 | \fontsize{0.85cm}{1cm}\selectfont 21 | الإصدار الثاني 22 | } 23 | \vfill 24 | 25 | { 26 | \fontsize{0.5cm}{1.5cm}\selectfont 27 | 28 | \begin{tabu} to 0.5\textwidth {>{\itshape}r r} 29 | تَرْجَمَة & عدن بلواضح\\ 30 | مُرَاجَعَة وإعْدَاد & حمزة عبّاد\\ 31 | تَصميم الغلاف & أحمد زبوشي\\ 32 | \end{tabu} 33 | } 34 | 35 | \vfill 36 | \includegraphics[height=0.2\textheight]{OpenClassrooms-logo} 37 | \end{center} 38 | -------------------------------------------------------------------------------- /book.tex: -------------------------------------------------------------------------------- 1 | \documentclass[10pt, a4paper]{book} 2 | \usepackage[svgnames,table,dvipsnames]{xcolor} % For color names 3 | \usepackage{fontspec} % font selecting commands 4 | \usepackage[breakable, skins]{tcolorbox} % For colored boxes 5 | \usepackage{graphicx} % For pictures 6 | \usepackage{polyglossia} % Babel alternative in XeLaTex 7 | \usepackage{fancyhdr} % For page headers 8 | \usepackage[top=2.5cm, bottom=2.5cm, left=3cm, right=2cm]{geometry} % To control page margins 9 | \usepackage{listings} % For source code 10 | \usepackage[breaklinks, 11 | colorlinks, 12 | linkcolor=Black, 13 | urlcolor=RedOrange, 14 | unicode=true, 15 | pdflang=ar, 16 | pdftitle={تعلّم البرمجة بلغة C}, 17 | pdfauthor={عدن بلواضح,حمزة عباد,أحمد زبوشي}, 18 | pdfdisplaydoctitle=true, 19 | pdfduplex=DuplexFlipLongEdge]{hyperref} % For hyperlinks and PDF metadata 20 | \usepackage{float} 21 | \usepackage{tabu,booktabs} 22 | \usepackage{pdfpages} 23 | \usepackage{bidi} 24 | 25 | % Font settings 26 | \defaultfontfeatures{Ligatures=TeX, Path=Fonts/, Extension=.ttf, Scale=0.8} 27 | \newfontfamily\arabicfont{amiri-}[ 28 | Script=Arabic, 29 | Scale=1, 30 | UprightFont=*regular, 31 | BoldFont=*bold, 32 | ItalicFont=*slanted, 33 | BoldItalicFont=*boldslanted 34 | ] % An arabic font 35 | \newfontfamily\englishfont{LiberationSans-}[ 36 | Script=Latin, 37 | UprightFont=*Regular, 38 | BoldFont=*Bold, 39 | ItalicFont=*Italic, 40 | BoldItalicFont=*BoldItalic 41 | ] % Font used for latin text in the document 42 | \newfontfamily\arabicfonttt{LiberationMono-}[ 43 | Script=Latin, 44 | UprightFont=*Regular, 45 | BoldFont=*Bold, 46 | ItalicFont=*Italic, 47 | BoldItalicFont=*BoldItalic 48 | ] % Monospace font, for displaying codes 49 | 50 | \renewcommand{\dots}{...\enskip} 51 | 52 | % Colors 53 | \colorlet{questionback}{white!80!black} 54 | \colorlet{questionframe}{white!85!black} 55 | \colorlet{questiontitle}{white!40!black} 56 | 57 | \colorlet{criticalback}{red!20} 58 | \colorlet{criticalframe}{red!10} 59 | \colorlet{criticaltitle}{red!80} 60 | 61 | \colorlet{warningback}{orange!20} 62 | \colorlet{warningframe}{orange!10} 63 | \colorlet{warningtitle}{orange!80} 64 | 65 | \colorlet{infoback}{cyan!20} 66 | \colorlet{infoframe}{cyan!10} 67 | \colorlet{infotitle}{cyan!80} 68 | 69 | \colorlet{chapter}{green!30!blue!80} 70 | \colorlet{section}{orange} 71 | 72 | % Language settings 73 | \setmainlanguage[locale=algeria]{arabic} 74 | \setotherlanguage{english} 75 | \addto\captionsarabic{ % Without this, changes won't take effect, because of Polyglossia 76 | \renewcommand{\partname}{الجزء} 77 | \renewcommand{\chaptername}{الفصل} 78 | \renewcommand{\contentsname}{جدول المحتويات} 79 | } 80 | 81 | % Boxes definitions 82 | \tcbset{arc=2pt, enhanced, 83 | attach boxed title to top right={yshift=-\tcboxedtitleheight/3*2, xshift=\tcboxedtitlewidth/5*2}, 84 | boxrule=0.5mm, fonttitle=\Large, boxed title style={circular arc, square, halign=center, valign=center}} 85 | 86 | \newtcolorbox{question}{colback=questionback, colframe=questionframe, title=؟, coltitle=questiontitle, 87 | boxed title style={colback=questionback}} % Used for question boxes 88 | 89 | \newtcolorbox{critical}{colback=criticalback, colframe=criticalframe, title=\textenglish{X}, coltitle=criticaltitle, 90 | boxed title style={colback=criticalback}} % Used for critical warning boxes 91 | 92 | \newtcolorbox{warning}{colback=warningback, colframe=warningframe, title=!, coltitle=warningtitle, fonttitle=\LARGE, 93 | boxed title style={colback=warningback}} % Used for warning boxes 94 | 95 | \newtcolorbox{information}{colback=infoback, colframe=infoframe, title=م, coltitle=infotitle, 96 | boxed title style={colback=infoback}} % Used for information boxes 97 | 98 | \newcommand\InlineCode[1]{\fcolorbox{LightGray}{Snow}{\ttfamily \LR{#1}}} 99 | 100 | % Titles settings (Make them orange or blue) 101 | \makeatletter 102 | \let\oldpart\part 103 | \newcommand{\@partstar}[1]{\cleardoublepage\phantomsection\addcontentsline{toc}{part}{#1}{\color{section}\oldpart*{#1}}} 104 | \newcommand{\@partnostar}[1]{{\color{section}\oldpart{#1}}} 105 | \renewcommand{\part}{\@ifstar{\@partstar}{\@partnostar}} 106 | \let\oldchapter\chapter 107 | \newcommand{\@chapterstar}[1]{\cleardoublepage\phantomsection\addcontentsline{toc}{chapter}{#1}{\color{chapter}\oldchapter*{#1}}\markboth{#1}{}} 108 | \newcommand{\@chapternostar}[1]{{\color{chapter}\oldchapter{#1}}} 109 | \renewcommand{\chapter}{\@ifstar{\@chapterstar}{\@chapternostar}} 110 | \let\oldsection\section 111 | \newcommand{\@sectionstar}[1]{\phantomsection\addcontentsline{toc}{section}{#1}{\color{section}\oldsection*{#1}}\markright{#1}} 112 | \newcommand{\@sectionnostar}[1]{{\color{section}\oldsection{#1}}} 113 | \renewcommand\section{\@ifstar{\@sectionstar}{\@sectionnostar}} 114 | \makeatother 115 | 116 | % Pictures settings 117 | \graphicspath{{Pictures/}} % Folder of pictures 118 | 119 | \newcommand\Picture[2][]{ % This command automatically centers the picture and fits its size to the page. It supports captions too. 120 | \begin{center} 121 | \includegraphics[max size={0.8\textwidth}{0.5\textheight}]{#2}\\ 122 | #1 123 | \end{center} 124 | } 125 | 126 | % Paragraphs settings 127 | \setlength{\parskip}{4mm plus 2mm minus 2mm} % Spacing between paragraphs (+/-) 128 | 129 | % Page header and footer settings 130 | \setlength{\headheight}{15pt} 131 | \pagestyle{fancy} 132 | \renewcommand{\chaptermark}[1]{ \markboth{{\chaptername~\thechapter.~#1}}{} } 133 | \renewcommand{\sectionmark}[1]{ \markright{\thesection.~#1} } 134 | \fancyhead{} 135 | \fancyhead[OR]{\rightmark} 136 | \fancyhead[EL]{\leftmark} 137 | \setlength{\footskip}{1.5cm} 138 | 139 | % Fixing the issues of the numbering 140 | \renewcommand{\thepart}{\Alph{part}} 141 | %\renewcommand{\thechapter}{\Alph{part}.\arabic{chapter}} 142 | \renewcommand{\thesection}{\arabic{section}.\arabic{chapter}} 143 | %\renewcommand{\thesection}{\Alph{part}.\arabic{section}.\arabic{chapter}} 144 | %\renewcommand{\thesubsection}{\Alph{part}.\arabic{subsection}.\arabic{section}.\arabic{chapter}} 145 | %\renewcommand{\thesubsubsection}{\Alph{part}.\arabic{subsubsection}.\arabic{subsection}.\arabic{section}.\arabic{chapter}} 146 | \setcounter{secnumdepth}{1} 147 | \setcounter{tocdepth}{1} 148 | 149 | % Global settings for code and console 150 | \lstset{frame=single, basicstyle=\ttfamily, breaklines=true, showlines, aboveskip=\parskip, extendedchars} 151 | 152 | % C source code 153 | \lstdefinestyle{C}{language=C, showstringspaces=false, numbers=left, escapechar=§, 154 | keywordstyle=\bfseries\color{RoyalBlue}, commentstyle=\itshape\color{Gray}, 155 | numberstyle=\color{Gray}, stringstyle=\color{Crimson}, 156 | directivestyle=\color{DarkOrange}, 157 | deletekeywords={return,if,else,switch,for,while,do,const,static,sizeof}, 158 | morekeywords={SDL_Surface,Uint32,SDL_Rect,SDL_Event,SDL_TimerID,SDL_NewTimerCallback,TTF_Font,SDL_Color, 159 | FMOD_SYSTEM,FMOD_RESULT,FMOD_SOUND,FMOD_CHANNEL,FMOD_CHANNELGROUP,FMOD_BOOL,FMOD_DSP_FFT_WINDOW,size_t}, 160 | morekeywords=[2]{return,if,else,switch,for,while,do,const,static,sizeof}, keywordstyle=[2]\bfseries\color{Magenta}, 161 | morekeywords=[3]{printf,scanf,fprintf,fscanf,fputc,fgetc,fputs,fgets,fopen,fclose,fseek,ftell,rewind,srand,rand, 162 | time,SDL_Delay,SDL_GetTicks,SDL_AddTimer,SDL_RemoveTimer,TTF_OpenFont,TTF_CloseFont,TTF_Init,TTF_GetError,TTF_Quit, 163 | malloc,free,SDL_CreateRGBSurface,SDL_FreeSurface,SDL_BlitSurface,SDL_LoadBMP,SDL_WM_SetIcon,IMG_Load,SDL_GetError, 164 | SDL_Init,SDL_Quit,SDL_SetVideoMode,SDL_WM_SetCaption,SDL_FillRect,SDL_Flip,SDL_MapRGB,SDL_SetAlpha,SDL_SetColorKey, 165 | SDL_PollEvent,SDL_WaitEvent,SDL_EnableKeyRepeat,SDL_ShowCursor,SDL_WarpMouse,TTF_RenderText_Blended, 166 | TTF_SetFontStyle,sprintf,TTF_RenderText_Shaded,FMOD_System_Create,FMOD_System_Init,FMOD_System_Close, 167 | FMOD_System_Release,FMOD_System_CreateSound,FMOD_System_PlaySound,FMOD_Sound_Release,FMOD_System_GetChannel, 168 | FMOD_System_GetMasterChannelGroup,FMOD_Sound_SetLoopCount,FMOD_Channel_GetPaused,FMOD_Channel_SetPaused, 169 | FMOD_Sound_Release,FMOD_ChannelGroup_GetPaused,FMOD_ChannelGroup_SetPaused,FMOD_Channel_GetSpectrum, 170 | SDL_LockSurface,SDL_UnlockSurface}, 171 | keywordstyle=[3]\color{RoyalBlue}, 172 | } 173 | \lstnewenvironment{Csource}{\lstset{style=C}\setLTR}{\unsetLTR} 174 | 175 | % Console 176 | \lstnewenvironment{Console}{\setLTR}{\unsetLTR} 177 | 178 | % Table settings 179 | \setlength{\tabulinesep}{2pt} 180 | \setlength{\arrayrulewidth}{2pt} 181 | \taburulecolor{White} 182 | \newenvironment{Table}[1]{ % Accepts 1 parameter which is the number of columns 183 | \taburowcolors[2] 2{LightGray!40 .. LightGray!80} 184 | \begin{center} 185 | \begin{tabu}{*{#1}{|r}|} 186 | \toprule 187 | \rowfont{\bfseries\color{White}} 188 | \rowcolor{OrangeRed} 189 | \everyrow{\hline} 190 | }{ 191 | \end{tabu} 192 | \end{center} 193 | } 194 | \newenvironment{Table*}[1]{ 195 | \taburowcolors[1] 2{LightGray!40 .. LightGray!80} 196 | \begin{center} 197 | \begin{tabu}{*{#1}{|r}|} 198 | \toprule 199 | \everyrow{\hline} 200 | }{ 201 | \end{tabu} 202 | \end{center} 203 | } 204 | 205 | % Footnote rule 206 | \renewcommand{\footnoterule}{\rule[5pt]{0.6\textwidth}{0.5pt}} 207 | 208 | \begin{document} 209 | \includepdf{FrontCover.pdf} 210 | \setcounter{page}{-2} 211 | \include{Title_page} 212 | \include{Project_page} 213 | \include{Introduction} 214 | \include{Introduction_original} 215 | \tableofcontents 216 | \part{أساسيّات البرمجة بلغة \textenglish{C}} 217 | \include{Chapter_I-1} 218 | \include{Chapter_I-2} 219 | \include{Chapter_I-3} 220 | \include{Chapter_I-4} 221 | \include{Chapter_I-5} 222 | \include{Chapter_I-6} 223 | \include{Chapter_I-7} 224 | \include{Chapter_I-8} 225 | \include{Chapter_I-9} 226 | \part{تقنيات متقدّمة في لغة \textenglish{C}} 227 | \include{Chapter_II-1} 228 | \include{Chapter_II-2} 229 | \include{Chapter_II-3} 230 | \include{Chapter_II-4} 231 | \include{Chapter_II-5} 232 | \include{Chapter_II-6} 233 | \include{Chapter_II-7} 234 | \include{Chapter_II-8} 235 | \include{Chapter_II-9} 236 | \include{Chapter_II-10} 237 | \part{إنشاء الألعاب ثنائية الأبعاد باستخدام \textenglish{SDL}} 238 | \include{Chapter_III-1} 239 | \include{Chapter_III-2} 240 | \include{Chapter_III-3} 241 | \include{Chapter_III-4} 242 | \include{Chapter_III-5} 243 | \include{Chapter_III-6} 244 | \include{Chapter_III-7} 245 | \include{Chapter_III-8} 246 | \include{Chapter_III-9} 247 | \part{هياكل البيانات} 248 | \include{Chapter_IV-1} 249 | \include{Chapter_IV-2} 250 | \include{Chapter_IV-3} 251 | \include{Conclusion} 252 | \includepdf{BackCover.pdf} 253 | \end{document} 254 | --------------------------------------------------------------------------------