معلومة

2.4: إدخال وإخراج الملف - علم الأحياء

2.4: إدخال وإخراج الملف - علم الأحياء


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

حتى الآن ، كانت جميع البيانات التي كنا نعمل معها "مشفرة" في برامجنا. ومع ذلك ، في الحياة الواقعية ، سنسعى للحصول على بيانات من ملفات خارجية.

يمكننا الوصول إلى البيانات الموجودة في ملف خارجي (ملف نصي ، عادة) باستخدام ملف مقبض الملف، نوع خاص من أنواع البيانات التي يمكننا الاتصال بها باستخدام مصدر خارجي. في أبسط أشكاله ، يعمل مقبض الملف لقراءة البيانات نوعًا ما مثل الأنبوب: يضع نظام التشغيل البيانات (عادةً سلاسل) في طرف واحد ، ونستخرج البيانات من الطرف الآخر ، عادةً سطر واحد في كل مرة. تعمل مقابض الملفات للكتابة إلى الملفات على نقل البيانات في الاتجاه المعاكس.

لاستخدام مقبض ملف في Python ، علينا إخبار المترجم الشفهي بأننا نريد استخدام بعض وظائف الإدخال / الإخراج عن طريق وضع الأمر الخاص أولاًاستيراد ioبالقرب من الجزء العلوي من برنامجنا. يستورد هذا الأمر ملفioالوحدة النمطية ، وإتاحة الوظائف الإضافية الموجودة داخلها. تستخدم هذه الوظائف أيضًا بناء جملة النقطة لتحديد الوحدة النمطية التي توجد فيها ، والتي تشبه بشكل مربك بنية النقاط التي تمت مناقشتها مسبقًا للطرق. لربط مقبض ملف يسمىخنقبالملف "filename.txt "، على سبيل المثال ، الأمر هوfhandle = io.open ("filename.txt"، "rU")، أينافتح()هي دالة في ملفioوحدة. الصيشير إلى أننا بصدد إنشاء معالجة ملف للقراءة فقط ، ويويتيح للمترجم معرفة أننا نريد تفسيرًا "عالميًا" للأسطر الجديدة ، للسماح بقراءة الملفات التي تم إنشاؤها على أنظمة Microsoft Windows أو أنظمة تشبه Unix.[1] نوع بيانات مقبض الملف له أسلوب يسمى.readline ()، والتي تُرجع السطر التالي المتاح من الأنبوب كسلسلة ؛ وبالتالي،line = fhandle.readline ()يستخرج سلسلة (سطر) من مقبض الملف ويعينها إلىخط.

دعنا ننشئ ملفًا صغيرًا يحتوي على ثلاثة أسطر يحتوي كل منها على معرف الجين وعلامة تبويب وقيمة محتوى GC المقابلة.

لنقم الآن بإنشاء برنامج يقرأ البيانات ويطبعها. عندما ننتهي من قراءة البيانات من ملف ، نحتاج إلى تشغيل مقبض الملف.أغلق()طريقة. استخدام.أغلق()يتسبب مقبض الملف في تنبيه نظام التشغيل إلى أننا انتهينا من قراءة البيانات من المقبض. في هذه المرحلة ، يكون نظام التشغيل حرًا في إزالة "الأنبوب" الخلفي وأي بيانات قد تكون موجودة فيه.

إذا لم يكن الملف موجودًا أو لم يكن البرنامج قابلاً للقراءة ، فستحصل على ملفIOErrorمشيرا إمالا يوجد ملف او مجلدأوتم رفض الإذنباسم الملف الذي حاولت فتحه.[2] نظرًا لوجود ملفنا ، يمكننا تنفيذ الكود بنجاح وفحص النتائج:

هناك بعض الأشياء التي يجب ملاحظتها هنا. أولا ، في كل مرة نتصل فيهاfhandle.readline ()، يقوم مقبض الملف بإرجاع سلسلة مختلفة: السلسلة التالية تنتظر إخراجها من الأنبوب. ثانيًا ، نرى أن الإخراج يحتوي على ثلاثة أسطر ، ولكن مفصولة بأسطر فارغة: هذا بسبب وجود أحرف "سطر جديد" بالفعل في الملف. لا نرى هذه الأحرف السطر الجديد ، ولكن يمكننا تمثيلها بأنفسنا إذا أردنا ، في سلسلة برمز التحكمن. وبالمثل ، تحتوي أحرف الجدولة على رمز تحكم مثل t. الملف في الواقع عبارة عن سلسلة تسلسلية واحدة ، والملف.readline ()تطلب الطريقة من مقبض الملف إعادة كل شيء إلى التالي بما في ذلكن.

في النهاية ، سبب الأسطر الفارغة في ناتجنا هو أنمطبعة()وظيفة ، من أجل راحتنا ، تُلحق أنإلى نهاية أي سلسلة نطبعها (وإلا فإن معظم مخرجاتنا ستكون جميعها على نفس السطر). وهكذا تتم طباعة كل سطر تمت قراءته من الملف باستخدام سطريننالشخصيات. سنتعلم كيفية الطباعة بدون سطر جديد إضافي لاحقًا ، عندما نتعلم كيفية كتابة البيانات إلى الملفات. في الوقت الحالي ، سنحل المشكلة عن طريق إزالة المسافات البيضاء البادئة والزائدة (المسافات وعلامات الجدولة والأسطر الجديدة) عن طريق مطالبة سلسلة بتشغيلها.قطاع()طريقة.

على الرغم من أننا نتصلاستيراد ioمرة أخرى ، من أجل الوضوح فقط: يحتاج البرنامج فقط إلى استيراد وحدة مرة واحدة (وعادة ما يتم جمعها بالقرب من الجزء العلوي من البرنامج). هذا هو الناتج المعدل:

إذا كنت تشعر بالمغامرة (ويجب عليك!) ، يمكنك المحاولة طريقة التسلسل، حيث يمكن إلحاق بناء الجملة النقطي للطرق طالما أن الطريقة السابقة أعادت النوع الصحيح.

لربط هذا بالمفاهيم السابقة ، بعد أن استخرجنا كل سطر وأزلنا المسافة البيضاء الزائدة ، يمكننا استخدام.split (" t")لتقسيم كل سطر إلى قائمة سلاسل. من هناك ، يمكننا استخدامتطفو()لتحويل العنصر الثاني من كل عنصر إلى نوع عائم ، وحساب متوسط ​​محتوى GC.

ما ورد أعلاه يطبع متوسط ​​محتوى GC للأسطر الثلاثة كـ0.523333333. (لأن.قطاع()يُرجع أيضًا سلسلة ، يمكن أن يكون لدينا المزيد من العمليات المتسلسلة ، كما هو الحال فيline1_list = fhandle.readline (). strip (). split (" t").)

نظرًا لأن مقابض الملفات تعمل مثل الأنبوب ، فإنها لا تسمح "بالوصول العشوائي" ؛ يمكننا الحصول على الجزء التالي من البيانات من نهاية الأنبوب ، ولكن هذا كل شيء.[3] قد يعتقد المرء أن الأمر مثلline5 = مقبض [4]سيعمل ، ولكن بدلاً من ذلك سينتج خطأ مثلTypeError: الكائن "_io.BufferedReader" ليس له سمة "__getitem__".

من ناحية أخرى ، مثل القوائم ، فإن مقابض الملفات قابلة للتكرار ، مما يعني أنه يمكننا استخدام حلقة for-loop للوصول إلى كل سطر بالترتيب. قد يبدو برنامج بسيط لقراءة سطور الملف وطباعتها واحدًا تلو الآخر (بدون سطور فارغة إضافية) كما يلي:

يحب.readline ()، باستخدام for-loop لاستخراج الخطوط من الأنبوب. لذا ، إذا اتصلت.readline ()مرتين على مقبض ملف مرفق بملف به 10 أسطر ، ثم قم بتشغيل حلقة for-loop على مقبض الملف هذا ، وسوف تتكرر for-loop على الأسطر الثمانية المتبقية. قد يكون هذا الاستدعاء مفيدًا إذا كنت تريد إزالة سطر العنوان من جدول نصي قبل معالجة الأسطر المتبقية بحلقة ، على سبيل المثال.

كتابة البيانات

تعمل كتابة البيانات إلى ملف بنفس الطريقة التي تعمل بها قراءة البيانات: نفتح مقبض ملف (والذي يعمل مرة أخرى كأنبوب) ، ثم نسمي طريقة على المقبض تسمى.اكتب()لكتابة سلاسل عليها. في هذه الحالة ، بدلاً من استخدام الامتداد"rU"المعلمة في الاتصالio.open ()، سوف نستخدم"w"للإشارة إلى أننا نريد الكتابة إلى الملف. كن حذرًا: عندما تفتح مقبض ملف للكتابة بهذه الطريقة ، فإنه يقوم بالكتابة فوق أي محتويات موجودة في الملف. إذا كنت تفضل إلحاق الملف ، فيمكنك بدلاً من ذلك استخدام"أ".[4]

على عكسمطبعة()وظيفة.اكتب()طريقة مقبض الملف لا تتضمن تلقائيًا حرف سطر جديد إضافي"ن". وبالتالي ، إذا كنت ترغب في كتابة أسطر متعددة إلى مقبض الملف ، فيجب عليك إضافتها بنفسك. هذا مثال يطبع الأرقام0عبر9إلى ملف ، واحد في كل سطر.

كما ذكرنا أعلاه ، يعمل مقبض الملف المفتوح للكتابة مثل الأنبوب الذي تم إعداده بواسطة نظام التشغيل. ومع ذلك ، عند الكتابة ، نضع البيانات في الأنبوب ، ويقوم نظام التشغيل بسحب البيانات من الجانب الآخر ، وكتابتها في الملف الموجود على القرص.

نظرًا لأن نظام التشغيل مشغول بمعالجة الطلبات المماثلة للعديد من البرامج على النظام ، فقد لا يتمكن من سحب البيانات من الأنبوب والكتابة إلى الملف الموجود على القرص على الفور. لذا ، من المهم أن نتذكر استدعاء.أغلق()الطريقة على مقبض الملف عندما ننتهي من كتابة البيانات ؛ هذا يخبر نظام التشغيل أن أي معلومات متبقية في الأنبوب يجب شطفها وحفظها على القرص ، وأنه يمكن تنظيف هيكل الأنبوب. إذا تعطل برنامجنا (أو كان سيُقتل) قبل إغلاق المقبض بشكل صحيح ، فقد لا تتم كتابة البيانات الموجودة في الأنبوب أبدًا.

حساب المتوسط

دعنا نضع العديد من المهارات التي تعلمناها حتى الآن موضع التنفيذ لحساب متوسط ه القيم من إخراج BLAST ، والذي تم تنسيقه كجدول نصي بسيط مع علامات تبويب تفصل بين الأعمدة. هذا هو الملف ، pz_blastx_yeast_top1.txt، يبدو فيأقل -S. على الرغم من أن القارئ يجب أن يأخذ كلمتنا في الاعتبار ، إلا أن العمود الحادي عشر من هذا الملف يحتوي على ه مثل القيم5e-14,2e-112، و1e-18.

عند حل مشكلة مثل هذه ، من الأفضل عادةً أن تكتب أولاً ، باللغة الإنجليزية البسيطة (أو لغتك غير البرمجية التي تختارها) ، إستراتيجية كنت تنوي استخدامها لحل المشكلة. ستكون الإستراتيجية هنا على النحو التالي: يتم تعريف متوسط ​​مجموعة من الأرقام على أنه مجموعها ، مقسومًا على عددهم. سنحتاج إلى الاحتفاظ بمتغيرين مهمين على الأقل ،Eval_sumوعداد. بعد فتح الملف بامتدادio.open ()، يمكننا المرور عبر الخطوط واستخراج كل منها ه القيمة. (سيتطلب ذلك تنظيف الخط بـ.قطاع()، وتقسيمها إلى قطع باستخدام.split (" t")، وأخيرًا تحويل ملف ه قيمة إلى عدد عشري بدلاً من استخدام السلسلة.) لكل سطر نراه ، يمكننا إضافة ه القيمة المستخرجة إلىEval_sumمتغير ، وسنضيف1الىعدادمتغير كذلك. في النهاية ، يمكننا الإبلاغ ببساطةEval_sum / عداد.

غالبًا ما يساعد على تحويل هذه الإستراتيجية إلى شيء ما بين اللغة الطبيعية والرمز ، يسمى كود مزيف، والتي يمكن أن تساعد بشكل كبير في تنظيم أفكارك ، خاصة بالنسبة للبرامج المعقدة:

استيراد ioopen fhandlecounter = 0sum_eval = 0.0 لكل سطر في fhandlelinestripped = line.strip () اقتحام قائمة السلاسل مع line_list = linestripped.split (" t") Eval كسلسلة في line_list في الفهرس 10 (العمود الحادي عشر) أضف عوامة (EVAL) إلى sum_eval وحفظها في sum_evaladd 1 للعد والحفظ في countmean = sum_eval مقسومًا على البصمة المضادة ("المتوسط ​​هو" + المتوسط)

مع رسم الكود الكاذب ، يمكننا كتابة الكود الفعلي لبرنامجنا. عند تنفيذه ، فإنه يطبع بشكل موثوقالمتوسط ​​هو: 1.37212611293e-08.

لاحظ أن كود Python الفعلي (بتنسيق blast_mean.py) يبدو كثيرًا مثل الرمز الزائف — وهذا أحد نقاط البيع التي يتم الاستشهاد بها كثيرًا في Python. (لهذا السبب ، سنتخطى أيضًا خطوة الترميز الزائف لمعظم الأمثلة في هذا الكتاب ، على الرغم من أنه يمكن أن يظل أسلوبًا قيمًا عند البرمجة بأي لغة.)

قد يبدو هذا قدرًا لا بأس به من العمل لحساب متوسط ​​بسيط ، ولكنه نتيجة لكتابة البرامج "من الصفر" ، وعلينا أن نبدأ من مكان ما! بالإضافة إلى ذلك ، فإن فائدة تعلم هذه التقنيات ستؤتي ثمارها على المدى الطويل عندما يتعلق الأمر بحل المشكلات الجديدة.

عملية البرمجة

على الرغم من أن عملية تصميم الإستراتيجية (والرمز الزائف) تبدو مملة ، إلا أنها موصى بها بشدة. كلما تقدمت في قدراتك ، ستصبح استراتيجياتك والرمز الزائف أكثر إيجازًا ومستوى أعلى ، لكن لا يجب عليك أبدًا تخطي خطوات التخطيط قبل الترميز. (من ناحية أخرى ، هناك أيضًا خطر الإفراط في التخطيط ، ولكن هذا غالبًا ما يؤثر على فرق المبرمجين الذين يعملون في مشاريع كبيرة).

هناك شيء آخر جدير بالملاحظة في هذه المرحلة: برامج مثل المذكورة أعلاه لا تتم كتابتها أبدًا تقريبًا من أعلى إلى أسفل في مجملها ، على الأقل ليس من دون الحاجة إلى تصحيح أخطاء كبير! قد تنسى أن نتيجة تقسيم السلسلة ينتج عنها قائمة من السلاسل ، مما يؤدي إلى حدوث خطأ في سطر مثلEVAL_sum = EVAL_sum + EVAL_strلأنEval_sumهو تعويم ، بينماEVAL_strعبارة عن سلسلة. بعد العثور على هذا الخطأ وإصلاحه ، قد تجد خطأ آخر إذا حاولت الطباعة باستخدام سطر مثلطباعة ("المتوسط ​​هو:" + يعني)، لأن الأنواع مرة أخرى لا تتطابق ولا يمكن ربطها. بعد كل هذا ، ربما تجد الوسيلة الناتجة بشكل غير متوقع عددًا كبيرًا ، مثل131.18، فقط لتكتشف أنه كان بسبب استخدامكEval_str = line_list [11]، متناسين أن فهارس القائمة تبدأ من0.

هناك استراتيجيتان لتجنب السلاسل الطويلة من الأخطاء المزعجة مثل هذه ، والأخطاء التي يصعب العثور عليها (وبالتالي أكثر خطورة) والتي تؤدي إلى إخراج غير صحيح ليس من الواضح أنه غير صحيح. تتمثل الإستراتيجية الأولى في كتابة بضعة أسطر فقط في كل مرة ، واختبار الأسطر المضافة حديثًا باستخداممطبعة()التصريحات التي تكشف ما إذا كانوا يفعلون ما يفترض بهم. في المثال أعلاه ، يمكنك كتابة بضعة أسطر والقيام ببعض الطباعة للتأكد من أنه يمكنك فتح مقبض الملف بنجاح والقراءة منه (إذا كان الملف كبيرًا ، فقم بإنشاء إصدار أصغر للاختبار). ثم اكتب حلقة for-loop بسيطة وقم ببعض الطباعة للتأكد من أنه يمكنك بنجاح تنفيذ حلقة فوق سطور الملف وتقسيمها إلى قوائم سلاسل. تابع عن طريق ملء بعض التعليمات البرمجية في الحلقة ، ثم قم بالطباعة والاختبار مرة أخرى للتأكد من أن الكود يقوم بما تعتقده. وهكذا عبر التطوير التكراري.

تتمثل الإستراتيجية الثانية ، لتجنب الأخطاء الأكثر خطورة التي لا تتضح على الفور ، في اختبار برامجك وتطويرها باستخدام ملفات صغيرة يمكنك من خلالها حساب الإجابة يدويًا (أو بعض العمليات الموثوقة الأخرى). عندما تعلم من الاختبار أن برنامجك أو حتى أجزاء فقط من برنامجك تنتج المخرجات المقصودة ، فمن غير المرجح أن تتسلل الأخطاء المخفية عبر الشقوق. ينتج بعض الأشخاص عدة مدخلات صغيرة تمثل مجموعة متنوعة من مواقف الإدخال المختلفة ، ويقومون بإجراء الاختبارات ، ويقارنون المخرجات بالنتائج المتوقعة بطريقة آلية. يُعرف هذا باسم "اختبار الوحدة" ، وهو ممارسة شائعة في تطوير البرامج الاحترافية.

أخيرًا ، تذكر أن كل مبرمجة ، بغض النظر عن مستوى خبرتها ، تشعر بالإحباط من وقت لآخر! هذا أمر طبيعي تمامًا ، والاستراتيجية الجيدة عند حدوث ذلك هي القيام بنزهة قصيرة ، أو حتى أخذ قسط من الراحة لليوم ، والاستمرار في العودة مرة أخرى في اليوم التالي. يجد البعض أنهم يبرمجون بكفاءة في الصباح ، والبعض الآخر في وقت متأخر من الليل. مهما فعلت، تجنب إغراء البرمجة عن طريق التجربة والخطأ، التغيير والتبديل في الشفرة دون تفكير على أمل أن ينتج عنه الإخراج الذي تريده. حتى إذا نجحت بهذه الطريقة (وهو ما نادرًا ما يحدث) ، فمن المحتمل أن تنتج تعليمات برمجية تحتوي على أخطاء خبيثة ، وقد لا تتمكن من قراءتها حتى في غضون أيام قليلة.

تمارين

  1. اكتب برنامج Python لحساب نموذج الانحراف المعياري لـ ه القيم الموجودة في الملف pz_blastx_yeast_top1.txt. للتذكير ، يُعرَّف الانحراف المعياري للعينة على أنه الجذر التربيعي لمجموع تربيع الفروق من المتوسط ​​، مقسومًا على عدد القيم مطروحًا منه 1:

    لتحقيق ذلك ، ستحتاج إلى إجراء تمريرين على البيانات: أحدهما كما في المثال لحساب المتوسط ​​والآخر لحساب مجموع الفروق التربيعية. هذا يعني أنك ستحتاج إلى الوصول إلى ه قيم مرتين. بدلاً من إغلاق ملف البيانات وإعادة فتحه ، يجب إنشاء قائمة فارغة في البداية يمكنك إلحاق كل منها ه القيمة (في أول مرورك على البيانات) لاستخدامها لاحقًا.

    لحساب الجذر التربيعي لعدد عشري ، ستحتاج إلى استيراد ملفالرياضياتوحدة عن طريق الاتصالاستيراد الرياضياتبالقرب من الجزء العلوي من برنامجك. ثمmath.sqrt ()ستعيد الدالة الجذر التربيعي لعائم ؛ على سبيل المثال،math.sqrt (3.0)سيعود الطفو1.7320508.

  2. لوقائمةهي قائمة ، إذنb_list = معكوس (a_list)يخلق "listreverseiterator"مما يسمح للمرء بالالتفاف على العناصر بحلقة for في ترتيب عكسي. باستخدام هذه المعلومات ، اكتب برنامجًا يسمىreverse_blast.pyالذي يقرأ محتويات pz_blastx_yeast_top1.txt ويكتب الأسطر بترتيب عكسي لملف يسمىpz_blastx_yeast_top1_reversed.txt.
  3. أ كوين (بعد المنطق والفيلسوف دبليو في كواين) هو برنامج غير فارغ يقوم بطباعة كود المصدر الخاص به بالضبط. استخدم الioوحدة ومقابض ملف لكتابة خرير يسمىquine.py. (لا يُسمح لبرامج Quine من الناحية الفنية بفتح الملفات. هل يمكنك كتابة برنامج يطبع كود المصدر الخاص به دون استخدامioوحدة؟)


لقد واجهنا طريقتين لكتابة القيم حتى الآن: عبارات التعبير ووظيفة الطباعة (). (هناك طريقة ثالثة وهي استخدام طريقة write () لكائنات الملف ، حيث يمكن الإشارة إلى ملف الإخراج القياسي كـ sys.stdout. راجع مرجع المكتبة للحصول على مزيد من المعلومات حول هذا.)

ستحتاج غالبًا إلى مزيد من التحكم في تنسيق الإخراج بدلاً من مجرد طباعة قيم مفصولة بمسافات. هناك عدة طرق لتنسيق الإخراج.

لاستخدام القيم الحرفية للسلسلة المنسقة ، ابدأ سلسلة بـ f أو F قبل علامة الاقتباس الافتتاحية أو علامة الاقتباس الثلاثية. داخل هذه السلسلة ، يمكنك كتابة تعبير Python بين الأحرف <و> التي يمكن أن تشير إلى المتغيرات أو القيم الحرفية.

تتطلب طريقة str.format () من السلاسل مزيدًا من الجهد اليدوي. ستظل تستخدم <و> لتحديد مكان استبدال المتغير ويمكن أن تقدم توجيهات تنسيق مفصلة ، ولكنك ستحتاج أيضًا إلى تقديم المعلومات المطلوب تنسيقها.

أخيرًا ، يمكنك القيام بكل السلسلة التي تتعامل مع نفسك باستخدام عمليات تشريح السلسلة والتسلسل لإنشاء أي تخطيط يمكنك تخيله. يحتوي نوع السلسلة على بعض الطرق التي تؤدي عمليات مفيدة لحشو السلاسل لعرض عمود معين.

عندما لا تحتاج إلى إخراج خيالي ولكنك ترغب فقط في عرض سريع لبعض المتغيرات لأغراض التصحيح ، يمكنك تحويل أي قيمة إلى سلسلة مع وظائف repr () أو str ().

تهدف وظيفة str () إلى إرجاع تمثيلات للقيم التي يمكن للبشر قراءتها إلى حد ما ، بينما يُقصد من repr () إنشاء تمثيلات يمكن أن يقرأها المفسر (أو ستفرض خطأ نحويًا إذا لم يكن هناك بناء جملة مكافئ). بالنسبة للكائنات التي ليس لها تمثيل معين للاستهلاك البشري ، فإن str () ستعيد نفس القيمة مثل repr (). العديد من القيم ، مثل الأرقام أو الهياكل مثل القوائم والقواميس ، لها نفس التمثيل باستخدام أي وظيفة. السلاسل ، على وجه الخصوص ، لها تمثيلان متميزان.

تحتوي وحدة السلسلة على فئة قالب تقدم طريقة أخرى لاستبدال القيم في سلاسل ، باستخدام عناصر نائبة مثل $ x واستبدالها بقيم من قاموس ، ولكنها توفر تحكمًا أقل بكثير في التنسيق.

7.1.1. سلسلة حرفية منسقة¶

تتيح لك القيم الحرفية للسلسلة المنسقة (وتسمى أيضًا سلاسل f للاختصار) تضمين قيمة تعبيرات Python داخل سلسلة عن طريق إضافة بادئة إلى السلسلة بـ f أو F وكتابة التعبيرات كـ .

يمكن أن يتبع محدد التنسيق الاختياري التعبير. يتيح ذلك قدرًا أكبر من التحكم في كيفية تنسيق القيمة. يقوم المثال التالي بتقريب pi إلى ثلاثة أماكن بعد العلامة العشرية:

سيؤدي تمرير عدد صحيح بعد ":" إلى عرض هذا الحقل على أقل عدد ممكن من الأحرف. هذا مفيد لجعل الأعمدة تصطف.

يمكن استخدام مُعدِّلات أخرى لتحويل القيمة قبل تنسيقها. يطبق '! a' ascii () ، و '! s' يطبق str () ، و '! r' يطبق repr ():

للحصول على مرجع حول مواصفات التنسيق هذه ، راجع الدليل المرجعي للغة المصغرة لمواصفات التنسيق.

7.1.2. طريقة تنسيق السلسلة ()

يبدو الاستخدام الأساسي للطريقة str.format () كما يلي:

يتم استبدال الأقواس والأحرف الموجودة داخلها (تسمى حقول التنسيق) بالكائنات التي تم تمريرها في طريقة str.format (). يمكن استخدام رقم بين قوسين للإشارة إلى موضع الكائن الذي تم تمريره في طريقة str.format ().

إذا تم استخدام وسيطات الكلمات الأساسية في طريقة str.format () ، فيتم الإشارة إلى قيمها باستخدام اسم الوسيطة.

يمكن الجمع بين الوسيطات الموضعية والكلمات الأساسية بشكل تعسفي:

إذا كانت لديك سلسلة تنسيق طويلة حقًا لا تريد تقسيمها ، فسيكون من الجيد أن تتمكن من الإشارة إلى المتغيرات المراد تنسيقها بالاسم بدلاً من الموضع. يمكن القيام بذلك ببساطة عن طريق تمرير الدكت واستخدام الأقواس المربعة "[]" للوصول إلى المفاتيح.

يمكن القيام بذلك أيضًا عن طريق تمرير الجدول كوسائط للكلمات الرئيسية مع الترميز "**".

هذا مفيد بشكل خاص مع الوظيفة المضمنة vars () ، والتي تُرجع قاموسًا يحتوي على جميع المتغيرات المحلية.

على سبيل المثال ، تُنتج الأسطر التالية مجموعة من الأعمدة المحاذاة بشكل مرتب تعطي الأعداد الصحيحة ومربعاتها ومكعباتها:

للحصول على نظرة عامة كاملة عن تنسيق السلسلة باستخدام str.format () ، راجع تنسيق بناء جملة السلسلة.

7.1.3. تنسيق السلسلة اليدوي¶

إليك نفس جدول المربعات والمكعبات المنسقة يدويًا:

(لاحظ أنه تمت إضافة مسافة واحدة بين كل عمود بالطريقة التي تعمل بها print (): فهي تضيف دائمًا مسافات بين وسيطاتها.)

تقوم طريقة str.rjust () لكائنات السلسلة بضبط سلسلة في حقل بعرض معين عن طريق حشوها بمسافات على اليسار. هناك طرق مماثلة str.ljust () و str.center (). هذه الطرق لا تكتب أي شيء ، لكنها ترجع فقط سلسلة نصية جديدة. إذا كانت سلسلة الإدخال طويلة جدًا ، فلن يقوموا باقتطاعها ، لكنهم يعيدونها دون تغيير ، سيؤدي ذلك إلى إفساد تخطيط العمود الخاص بك ولكن هذا عادةً ما يكون أفضل من البديل ، والذي قد يكون كاذبًا بشأن القيمة. (إذا كنت تريد الاقتطاع حقًا ، يمكنك دائمًا إضافة عملية شريحة ، كما في x.ljust (n) [: n].)

هناك طريقة أخرى ، str.zfill () ، والتي تبطن سلسلة رقمية على اليسار بأصفار. يتعرف على علامات زائد وناقص:

7.1.4. تنسيق السلسلة القديم¶

يمكن أيضًا استخدام عامل التشغيل٪ (modulo) لتنسيق السلسلة. بالنظر إلى قيم "السلسلة"٪ ، يتم استبدال مثيلات٪ في السلسلة بصفر أو أكثر من عناصر القيم. تُعرف هذه العملية عمومًا باسم الاستيفاء الخيطي. على سبيل المثال:

يمكن العثور على مزيد من المعلومات في قسم تنسيق السلسلة بنمط printf.


خلفية

أدى ظهور تقنيات الإنتاجية العالية للتحليل المتوازي لمجموعات كبيرة من الجينات والبروتينات إلى تحدي المعلوماتية الحيوية ذات الاحتياجات التحليلية المتنوعة لاستغلال وتفسير الحجم الكبير من البيانات المنتجة [1] تتوفر العديد من حزم البرامج التجارية والمجانية لمساعدة المراحل المختلفة لتوليد وتحليل بيانات الجينوميات والبروتيوميات من الحصول على البيانات من خلال المعالجة والتكامل وتفسير البيانات النهائية [2]. عادةً ما تتقارب النتائج في قائمة واحدة من الجينات أو البروتينات التي لوحظ أنها تشترك في سمة مشتركة مثل التنظيم التفاضلي ونمط التعبير والتوطين الخلوي.

لتقييم الجدة العلمية للنتائج التي تم الحصول عليها - على سبيل المثال قائمة الجينات التي يتم التعبير عنها بشكل مختلف في سرطان الكبد - يمكن استخدام عدد من أدوات التنقيب عن النصوص المتاحة للجمهور ، مثل PubMatrix [3] أو MedMiner [4] لاستكشاف الأدبيات العلمية بطريقة منهجية.

PubMatrix هي أداة قائمة على الويب للتعدين النصي في خدمة البحث عن الأدب NCBI PubMed [5] ، وإيجاد ارتباطات بين اسم جيني واحد أو أكثر وقائمة بالكلمات المفتاحية ذات الصلة بمجال البحث مثل "السرطان" ، "الكبد" ، " الإفراط في التعبير. يشير التواجد المشترك لاسم الجين مع كلمات رئيسية محددة إلى اتصال محتمل يمكن استكشافه بشكل أكبر.

حتى الآن ، لا توجد أدوات برمجية مكافئة متاحة للجمهور لمساعدة الباحثين في تقييم حداثة النتائج من وجهة نظر الملكية الفكرية (IP) ، وبالتالي فإن إجراء دراسة تفصيلية للعديد من براءات الاختراع المتعلقة بكل جين أو بروتين في القائمة أمر ضروري بشكل عام. نظرًا للعدد الكبير من براءات الاختراع المرتبطة عادةً بالجينات والبروتينات وكمية المعلومات الواردة في كل إدخال براءة اختراع ، يعد هذا نشاطًا مرهقًا ويستغرق وقتًا طويلاً ويجب أن يقوم به متخصصون متخصصون في براءات الاختراع. تهدف PatentMatrix إلى تسهيل نظرة عامة أولية على براءات الاختراع من خلال تطبيق نهج يشبه PubMatrix على قاعدة بيانات تسلسل براءات الاختراع الخاصة بـ GENESEQ ™ (المقدمة من Derwent Thomson Scientific [6]. يتم الوصول إلى إدخالات براءات الاختراع من خلال نظام استرجاع التسلسل (SRS ، المقدم من Biowisdom [ 7]) وتم فحصها بحثًا عن وجود كلمات رئيسية محددة بواسطة المستخدم. وبهذه الطريقة يمكن تحديد الروابط بين الجينات / البروتينات الموصوفة في براءات الاختراع وسياق البحث المحدد كما هو محدد بواسطة الكلمات الرئيسية المحددة بواسطة المستخدم. ويستخلص البرنامج أيضًا من كل إدخال GENESEQ ™ هي المعلومات الأساسية لتقييم أولي لحالة IP للجينات / البروتين. يتم تقديم المستخدم بمخرجات "قياسية" و "مجمعة" توفر على التوالي نظرة عامة مفصلة وأكثر إيجازًا - مجمعة حسب الجين - من نتائج تحليل براءات الاختراع.


2.4: إدخال وإخراج الملف - علم الأحياء

قبل أن نصف المزيد حول معالجة SMOKE ، نحتاج أولاً إلى شرح أنواع الملفات التي ستواجهها في هذه الوثائق. يستخدم SMOKE بشكل أساسي نوعين من تنسيقات الملفات: ملفات ASCII وملفات I / O API. بالإضافة إلى ذلك ، فإن تنسيق ملف الإخراج لنموذج جودة الهواء المستند إلى UAM هو تنسيق ملف ثنائي Fortran. الفصل 8، ملفات الإدخال SMOKE، الفصل 9، ملفات SMOKE المتوسطة، والفصل العاشر ، ملفات إخراج SMOKE وصف جميع ملفات الإدخال والمتوسطة والمخرجات ، بما في ذلك تنسيق الملف لكل منها. ملفات الإدخال هي ملفات تتم قراءتها بواسطة برنامج SMOKE أساسي واحد على الأقل (مدرج في الفصل 6 ، برامج SMOKE الأساسية) ، ولكن لم تتم كتابتها بواسطة برنامج أساسي. الملفات الوسيطة هي ملفات يكتبها برنامج أساسي ويقرأها برنامج أساسي آخر على الأقل. ملفات الإخراج هي ملفات يتم إخراجها بواسطة برنامج SMOKE الأساسي ولكن لا يقرأها أي منهم ، وتشمل هذه الملفات التقارير وملفات السجل والملفات الجاهزة للنموذج ليتم إدخالها في نموذج جودة الهواء. (استثناء: ملف وسيط واحد [مستخدم بواسطة برنامج أساسي] هو أيضًا ملف إخراج [مستخدم بواسطة AQM]: ملف STACK_GROUPS ، الموضح في القسم 9.3.2 ، & # 8220 STACK_GROUPS & # 8221.) في هذا القسم ، وصف ملفات ASCII و I / O API بشكل أكبر ، ثم قدم معلومات حول طريقتين لتنسيق ملفات الإخراج الجاهزة للنموذج التي تنتجها SMOKE (نهج CMAQ / Models-3 والنهج القائم على UAM).

ملفات الإدخال SMOKE & # 8217s هي في الأساس ملفات ASCII ، على الرغم من استخدام عدد قليل من ملفات واجهة برمجة تطبيقات الإدخال / الإخراج. الملفات الوسيطة في SMOKE هي في الأساس ملفات I / O API ، على الرغم من وجود العديد من ملفات ACSII المهمة أيضًا. ملفات الإخراج من SMOKE هي في الأساس ملفات I / O API وملفات Fortran الثنائية لملفات الانبعاثات الجاهزة للنماذج ، وملفات ASCII للتقارير والسجلات.

2.5.1. ملفات ASCII

ملفات ASCII هي ببساطة الملفات النصية التي يعرفها معظم مستخدمي الكمبيوتر. يأتي إدخال ملفات ASCII بواسطة SMOKE في بنيتين: عمود محدد و قائمة موجهة .

2.5.1.1. ملفات ASCII الخاصة بالعمود

في الملفات الخاصة بالأعمدة ، يجب أن تظهر الحقول الموجودة في الملفات في أعمدة معينة في الملف. يمثل كل حرف في سطر عمودًا واحدًا. تمثل الأسطر أدناه ملف بيانات ASCII خاص بالعمود:

توجد الأحرف TEST في الأعمدة من 1 إلى 4 من الملف والأرقام 1 و 2 و 3 في الأعمدة 6 و 8 و 10 على التوالي:

2.5.1.2. ملفات ASCII الموجهة بقائمة

في الملفات الموجهة بالقائمة ، لا يعد تحديد المواقع الدقيق للحقول على سطر أمرًا مهمًا ، ولكن ترتيب الحقول في هذا السطر أمر بالغ الأهمية. يجب أن تكون الحقول محددة (مفصولة) بأحرف خاصة تسمى المحددات في SMOKE ، والمحددات الصالحة هي المساحات , الفواصل ، أو فاصلة منقوطة . إذا حدث أن يحتوي حقل معين على أي من هذه المحددات بداخله ، فيجب أن يكون هذا الحقل محاطًا بعلامات اقتباس مفردة أو مزدوجة في ملف الإدخال.


2.4: إدخال وإخراج الملف - علم الأحياء

Fأو لسبب لا يمكن فهمه ، فإن Java لم تجعل من السهل قراءة البيانات التي كتبها مستخدم البرنامج. لقد رأيت بالفعل أنه يمكن عرض الإخراج للمستخدم باستخدام روتين System.out.print. هذا الروتين الفرعي هو جزء من كائن محدد مسبقًا يسمى System.out. الغرض من هذا الكائن هو تحديدًا عرض الإخراج للمستخدم. يوجد كائن مطابق يسمى System.in موجود لقراءة إدخال البيانات من قبل المستخدم ، ولكنه يوفر فقط تسهيلات إدخال بدائية للغاية ، ويتطلب بعض مهارات برمجة Java المتقدمة لاستخدامه بفعالية.

يجعل Java 5.0 أخيرًا الإدخال أسهل قليلاً مع فئة الماسح الضوئي الجديدة. ومع ذلك ، فإنه يتطلب بعض المعرفة بالبرمجة الموجهة للكائنات لاستخدام هذه الفئة ، لذلك فهي ليست مناسبة للاستخدام هنا في بداية هذه الدورة. (علاوة على ذلك ، في رأيي ، لا يزال Scanner لا يصح الأمور تمامًا).

هناك بعض العذر لعدم الاهتمام بالمدخلات ، حيث أن Java تهدف بشكل أساسي إلى كتابة برامج لواجهات المستخدم الرسومية ، وهذه البرامج لها أسلوبها الخاص في الإدخال / الإخراج ، والذي يكون نفذت في جافا. ومع ذلك ، هناك حاجة إلى دعم أساسي للإدخال / الإخراج في البرامج القديمة الطراز بخلاف واجهة المستخدم الرسومية. لحسن الحظ ، من الممكن أن يمتد Java عن طريق إنشاء فئات جديدة توفر إجراءات فرعية غير متوفرة في الجزء القياسي من اللغة. بمجرد توفر فئة جديدة ، يمكن استخدام الإجراءات الفرعية التي تحتوي عليها بنفس الطريقة تمامًا مثل الإجراءات المضمنة.

على طول هذه الأسطر ، قمت بكتابة فصل دراسي يسمى TextIO يحدد الإجراءات الفرعية لقراءة القيم التي كتبها مستخدم برنامج لا يحتوي على واجهة مستخدم رسومية. تتيح الإجراءات الفرعية في هذا الفصل إمكانية الحصول على مدخلات من كائن الإدخال القياسي ، System.in ، دون معرفة الجوانب المتقدمة لجافا اللازمة لاستخدام الماسح أو لاستخدام System.in مباشرة. يحتوي TextIO أيضًا على مجموعة من الإجراءات الفرعية للإخراج. تشبه الإجراءات الفرعية للمخرجات تلك المتوفرة في System.out ، لكنها توفر بعض الميزات الإضافية. يمكنك استخدام أي مجموعة من الإجراءات الفرعية للمخرجات التي تفضلها ، ويمكنك حتى مزجها في نفس البرنامج.

لاستخدام فئة TextIO ، يجب عليك التأكد من أن الفصل متاح لبرنامجك. ما يعنيه هذا يعتمد على بيئة برمجة Java التي تستخدمها. بشكل عام ، عليك فقط إضافة ملف شفرة المصدر ، TextIO.java ، إلى نفس الدليل الذي يحتوي على برنامجك الرئيسي. راجع القسم 2.6 للحصول على مزيد من المعلومات حول كيفية استخدام TextIO.

2.4.1 أول مثال لإدخال النص

إجراءات الإدخال في فئة TextIO هي وظائف عضو ثابتة. (تم تقديم وظائف الأعضاء الثابتة في القسم السابق.) لنفترض أنك تريد أن يقرأ برنامجك عددًا صحيحًا كتبه المستخدم. تحتوي فئة TextIO على دالة عضو ثابتة تسمى getlnInt يمكنك استخدامها لهذا الغرض. نظرًا لوجود هذه الوظيفة في فئة TextIO ، يجب عليك الإشارة إليها في برنامجك باسم TextIO.getlnInt. لا تحتوي الوظيفة على معلمات ، لذا فإن الاستدعاء الكامل للدالة يأخذ شكل "TextIO.getlnInt ()". يمثل استدعاء الوظيفة هذا القيمة int التي يكتبها المستخدم ، وعليك أن تفعل شيئًا بالقيمة التي تم إرجاعها ، مثل إسنادها إلى متغير. على سبيل المثال ، إذا كان userInput متغيرًا من النوع int (تم إنشاؤه باستخدام بيان تصريح "int userInput") ، فيمكنك استخدام جملة الإسناد

عندما ينفذ الكمبيوتر هذه العبارة ، سينتظر المستخدم لكتابة قيمة عدد صحيح. سيتم إرجاع القيمة المكتوبة بواسطة الوظيفة ، وسيتم تخزينها في المتغير userInput. إليك برنامج كامل يستخدم TextIO.getlnInt لقراءة رقم كتبه المستخدم ثم يقوم بطباعة مربع الرقم الذي يكتبه المستخدم:

عند تشغيل هذا البرنامج ، سيعرض الرسالة "الرجاء كتابة رقم:" وسيتوقف مؤقتًا حتى تكتب ردًا ، بما في ذلك حرف إرجاع بعد الرقم. هذا هو التطبيق الصغير الذي يحاكي البرنامج. (ملحوظة: إذا لم يستجب التطبيق الصغير لكتابتك ، فقد تضطر إلى النقر فوقه لتنشيطه. في بعض المتصفحات ، قد تحتاج أيضًا إلى ترك مؤشر الماوس داخل التطبيق الصغير حتى يتعرف على كتابتك.)

2.4.2 إخراج النص

تحتوي فئة TextIO على إجراءات فرعية ثابتة للأعضاء TextIO.put و TextIO.putln يمكن استخدامها بنفس طريقة System.out.print و System.out.println. على سبيل المثال ، على الرغم من عدم وجود ميزة معينة للقيام بذلك في هذه الحالة ، يمكنك استبدال السطرين

بالنسبة للفصول القليلة التالية ، سأستخدم TextIO للإدخال في جميع الأمثلة الخاصة بي ، وسأستخدمها غالبًا للإخراج. ضع في اعتبارك أنه لا يمكن استخدام TextIO في برنامج إلا إذا كان متاحًا لهذا البرنامج. لم يتم تضمينه في Java بالطريقة التي تكون بها فئة النظام.

لنلق نظرة عن كثب على روتين الإخراج المدمج System.out.print و System.out.println. يمكن استخدام كل من هذه الإجراءات الفرعية بمعامل واحد ، حيث يمكن أن تكون المعلمة قيمة لأي من الأنواع الأولية بايت ، أو قصير ، أو int ، أو طويل ، أو عائم ، أو مزدوج ، أو شار ، أو منطقي. يمكن أن تكون المعلمة أيضًا سلسلة ، أو قيمة تنتمي إلى نوع التعداد ، أو في الواقع أي كائن. بمعنى ، يمكنك قول "System.out.print (x)" أو "System.out.println (x)" ، حيث x هو أي تعبير قيمته من أي نوع على الإطلاق. يمكن أن يكون التعبير ثابتًا أو متغيرًا أو حتى شيئًا أكثر تعقيدًا مثل 2 * مسافة * الوقت. الآن ، في الواقع ، تشتمل فئة النظام في الواقع على العديد من الإجراءات الفرعية المختلفة للتعامل مع أنواع مختلفة من المعلمات. يوجد System.out.print واحد لطباعة قيم من النوع مزدوج ، وواحد لقيم النوع int ، وآخر للقيم التي هي كائنات ، وما إلى ذلك. يمكن أن يكون لهذه الإجراءات الفرعية نفس الاسم حيث يمكن للكمبيوتر معرفة أي واحد تقصده في بيان استدعاء روتين فرعي معين ، اعتمادًا على نوع المعلمة التي توفرها. يسمى وجود العديد من الإجراءات الفرعية التي تحمل نفس الاسم والتي تختلف في أنواع معلماتها التحميل الزائد. لا تسمح العديد من لغات البرمجة بالتحميل الزائد ، ولكنه شائع في برامج Java.

يتمثل الاختلاف بين System.out.print و System.out.println في أن إصدار println يُخرج حرف إرجاع بعد أن يُخرج قيمة المعلمة المحددة. هناك إصدار من System.out.println لا يحتوي على معلمات. ينتج هذا الإصدار ببساطة حرف إرجاع ، ولا شيء غير ذلك. يبدو بيان استدعاء روتين فرعي لهذا الإصدار من البرنامج مثل "System.out.println ()" ، بأقواس فارغة. لاحظ أن "System.out.println (x)" يكافئ تمامًا "System.out.print (x) System.out.println ()" يأتي حرف إرجاع بعد، بعدما قيمة x. (لا يوجد إصدار من System.out.print بدون معلمات. هل ترى لماذا؟)

كما ذكر أعلاه ، يمكن استخدام الإجراءين الفرعيين TextIO.put و TextIO.putln كبدائل لـ System.out.print و System.out.println. تعمل وظائف TextIO تمامًا بنفس طريقة وظائف النظام ، باستثناء أنه ، كما سنرى أدناه ، يمكن أيضًا استخدام TextIO للكتابة إلى وجهات أخرى.

2.4.3 وظائف إدخال TextIO

تعد فئة TextIO أكثر تنوعًا في عمل الإخراج من System.out. ومع ذلك ، فإن المدخلات التي نحتاج إليها حقًا.

باستخدام TextIO ، يتم الإدخال باستخدام الوظائف. على سبيل المثال ، TextIO.getlnInt () ، الذي تمت مناقشته أعلاه ، يجعل المستخدم يكتب قيمة من النوع int ويعيد قيمة الإدخال هذه بحيث يمكنك استخدامها في برنامجك. يتضمن TextIO العديد من الوظائف لقراءة أنواع مختلفة من قيم الإدخال. فيما يلي أمثلة على تلك التي من المرجح أن تستخدمها:

لكي تكون هذه العبارات قانونية ، يجب التصريح عن المتغيرات الموجودة على الجانب الأيسر من كل عبارة تخصيص بالفعل ويجب أن تكون من نفس النوع الذي يتم إرجاعه بواسطة الوظيفة على الجانب الأيمن. لاحظ بعناية أن هذه الوظائف لا تحتوي على معلمات. القيم التي يتم إرجاعها تأتي من خارج البرنامج ، يكتبها المستخدم أثناء تشغيل البرنامج. من أجل "التقاط" تلك البيانات بحيث يمكنك استخدامها في برنامجك ، يجب عليك تعيين القيمة المرجعة للدالة إلى متغير. ستتمكن بعد ذلك من الإشارة إلى قيمة إدخال المستخدم باستخدام اسم المتغير.

عند استدعاء إحدى هذه الوظائف ، فإنك تضمن أنها ستعيد قيمة قانونية من النوع الصحيح. إذا قام المستخدم بكتابة قيمة غير قانونية كمدخلات - على سبيل المثال ، إذا طلبت int وكان المستخدم يكتب بحرف غير رقمي أو رقم خارج النطاق القانوني للقيم التي يمكن تخزينها في متغير من النوع int - سيطلب الكمبيوتر من المستخدم إعادة إدخال القيمة ، ولن يرى برنامجك أبدًا القيمة الأولى غير القانونية التي أدخلها المستخدم. بالنسبة لـ TextIO.getlnBoolean () ، يُسمح للمستخدم بكتابة أي مما يلي: صحيح ، خطأ ، t ، f ، نعم ، لا ، y ، n ، 1 ، أو 0. علاوة على ذلك ، يمكنهم استخدام إما الأحرف الكبيرة أو الصغيرة حروف. في أي حال ، يتم تفسير مدخلات المستخدم على أنها قيمة صواب / خطأ. من الملائم استخدام TextIO.getlnBoolean () لقراءة استجابة المستخدم لسؤال نعم / لا.

ستلاحظ وجود وظيفتي إدخال ترجعان السلاسل النصية. الأول ، getlnWord () ، يُرجع سلسلة تتكون من أحرف غير فارغة فقط. عندما يتم استدعاؤه ، فإنه يتخطى أي مسافات ويعود أول السطر الذي كتبه المستخدم. ثم يقرأ الأحرف غير الفارغة حتى يصل إلى المسافة التالية أو حرف العودة. تقوم بإرجاع سلسلة تتكون من جميع الأحرف غير الفارغة التي قرأتها. دالة الإدخال الثانية ، getln () ، تقوم ببساطة بإرجاع سلسلة تتكون من جميع الأحرف التي يكتبها المستخدم ، بما في ذلك المسافات ، حتى حرف الإرجاع التالي. يحصل على سطر كامل من إدخال النص. لا يتم إرجاع حرف إرجاع نفسه كجزء من سلسلة الإدخال ، ولكن يتم قراءته والتخلص منه بواسطة الكمبيوتر. لاحظ أن السلسلة التي تعيدها هذه الوظيفة قد تكون السلسلة الفارغة ، "" ، والتي لا تحتوي على أحرف على الإطلاق. ستحصل على قيمة الإرجاع هذه إذا ضغط المستخدم ببساطة على رجوع ، دون كتابة أي شيء آخر أولاً.

جميع وظائف الإدخال الأخرى المدرجة - getlnInt () ، و getlnDouble () ، و getlnBoolean () ، و getlnChar () - تتصرف مثل getWord () في أنها ستتخطى أي فراغات وعودة إلى أول سطر في الإدخال قبل قراءة أي قيمة.

علاوة على ذلك ، إذا كتب المستخدم أحرفًا إضافية على السطر بعد قيمة الإدخال ، سيتم تجاهل جميع الأحرف الإضافية ، جنبًا إلى جنب مع حرف الإرجاع في نهاية السطر. إذا كان البرنامج ينفذ وظيفة إدخال أخرى ، فسيتعين على المستخدم كتابة سطر إدخال آخر. قد لا يبدو تجاهل أي من مدخلات المستخدم فكرة جيدة ، ولكن اتضح أنه أكثر الأشياء أمانًا للقيام بها في معظم البرامج.في بعض الأحيان ، ومع ذلك ، قد ترغب في قراءة أكثر من قيمة واحدة من نفس سطر الإدخال. يوفر TextIO وظائف الإدخال البديلة التالية للسماح لك بالقيام بذلك:

تبدأ أسماء هذه الوظائف بـ "get" بدلاً من "getln". "Getln" هي اختصار لـ "get line" ويجب أن تذكرك بأن الوظائف التي تبدأ أسماؤها بـ "getln" ستحصل على سطر كامل من البيانات. ستقرأ الوظيفة التي لا تحتوي على "ln" قيمة الإدخال بنفس الطريقة ، ولكنها ستحفظ بعد ذلك باقي سطر الإدخال في جزء كبير من الذاكرة الداخلية يسمى مخزن الإدخال المؤقت. في المرة التالية التي يريد فيها الكمبيوتر قراءة قيمة إدخال ، سيبحث في مخزن الإدخال المؤقت قبل مطالبة المستخدم بالإدخال. يسمح هذا للكمبيوتر بقراءة عدة قيم من سطر واحد من مدخلات المستخدم. بالمعنى الدقيق للكلمة ، فإن الكمبيوتر يقرأ بالفعل فقط من المخزن المؤقت للإدخال. في المرة الأولى التي يحاول فيها البرنامج قراءة المدخلات من المستخدم ، سينتظر الكمبيوتر بينما يكتب المستخدم في سطر إدخال كامل. يقوم TextIO بتخزين هذا السطر في مخزن الإدخال المؤقت حتى تتم قراءة البيانات الموجودة على السطر أو تجاهلها (بواسطة إحدى وظائف "getln"). يحصل المستخدم على الكتابة فقط عندما يكون المخزن المؤقت فارغًا.

من الواضح أن دلالات المدخلات أكثر تعقيدًا من دلالات المخرجات! لحسن الحظ ، بالنسبة لغالبية التطبيقات ، يكون الأمر واضحًا جدًا في الممارسة. ما عليك سوى اتباع التفاصيل إذا كنت تريد أن تفعل شيئًا خياليًا. على وجه الخصوص ، أنا بقوة ننصحك باستخدام إصدارات "getln" من إجراءات الإدخال ، بدلاً من إصدارات "get" ، إلا إذا كنت تريد حقًا قراءة عدة عناصر من نفس سطر الإدخال ، وذلك على وجه التحديد لأن دلالات إصدارات "getln" أبسط بكثير .

لاحظ ، بالمناسبة ، أنه على الرغم من أن وظائف إدخال TextIO ستتخطى المسافات الفارغة السابقة وأسطوانة الإرجاع أثناء البحث عن المدخلات ، فإنها سوف ليس تخطي الشخصيات الأخرى. على سبيل المثال ، إذا حاولت قراءة عدد صحيحين وكتب المستخدم "2،3" ، فسوف يقرأ الكمبيوتر الرقم الأول بشكل صحيح ، ولكن عندما يحاول قراءة الرقم الثاني ، سيرى الفاصلة. سيعتبر هذا خطأ وسيجبر المستخدم على إعادة كتابة الرقم. إذا كنت تريد إدخال عدة أرقام من سطر واحد ، فعليك التأكد من أن المستخدم يعرف كيف يفصل بينها بمسافات وليس بفواصل. بدلاً من ذلك ، إذا كنت تريد طلب فاصلة بين الأرقام ، فاستخدم getChar () لقراءة الفاصلة قبل قراءة الرقم الثاني.

هناك وظيفة أخرى لإدخال الأحرف ، TextIO.getAnyChar () ، لا تتخطى الفراغات السابقة أو أحرف الإرجاع. إنه ببساطة يقرأ ويعيد الحرف التالي الذي كتبه المستخدم ، حتى لو كان فارغًا أو حرف إرجاع. إذا قام المستخدم بكتابة حرف إرجاع ، فإن الحرف الذي تم إرجاعه بواسطة getAnyChar () هو حرف تغذية الأسطر الخاص ' n'. هناك أيضًا وظيفة ، TextIO.peek () ، تتيح لك النظر إلى الحرف التالي في الإدخال دون قراءته فعليًا. بعد "إلقاء نظرة خاطفة" على الحرف التالي ، سيظل موجودًا عندما تقرأ العنصر التالي من الإدخال. يسمح لك هذا بالنظر إلى الأمام ومعرفة ما سيحدث في الإدخال ، بحيث يمكنك اتخاذ إجراءات مختلفة بناءً على ما هو موجود.

توفر فئة TextIO عددًا من الوظائف الأخرى. لمعرفة المزيد عنها ، يمكنك إلقاء نظرة على التعليقات في ملف التعليمات البرمجية المصدر ، TextIO.java.

(قد تتساءل عن سبب وجود نوعين فقط من إجراءات الإخراج ، وهما print و println ، اللذان يمكنهما إخراج قيم البيانات من أي نوع ، بينما يوجد روتين إدخال منفصل لكل نوع من أنواع البيانات. كما هو مذكور أعلاه ، يوجد في الواقع العديد من print و println إجراءات روتينية ، واحدة لكل نوع بيانات. يمكن للكمبيوتر التمييز بينها بناءً على نوع المعلمة التي توفرها. ومع ذلك ، لا تحتوي إجراءات الإدخال على معلمات ، لذلك لا يمكن تمييز إجراءات الإدخال المختلفة إلا من خلال وجود أسماء مختلفة. )

باستخدام TextIO للإدخال والإخراج ، يمكننا الآن تحسين البرنامج من القسم 2.2 لحساب قيمة الاستثمار. يمكننا الحصول على نوع المستخدم في القيمة الأولية للاستثمار وسعر الفائدة. والنتيجة هي برنامج أكثر فائدة - لسبب واحد ، من المنطقي تشغيله أكثر من مرة!

جرب تطبيق صغير مكافئ هنا. (إذا لم يستجب التطبيق الصغير لكتابتك ، فقد تضطر إلى النقر فوقه لتنشيطه.)

بالمناسبة ، لا تستخدم التطبيقات الصغيرة الموجودة في هذه الصفحة TextIO نفسها بالفعل. فئة TextIO هي فقط للاستخدام في البرامج ، وليس التطبيقات الصغيرة. بالنسبة للتطبيقات الصغيرة ، قمت بكتابة فئة منفصلة توفر إمكانات إدخال / إخراج مماثلة في برنامج واجهة المستخدم الرسومية. تذكر أن التطبيقات الصغيرة فقط المحاكاة من البرامج.

2.4.4 الإخراج المنسق

إذا قمت بتشغيل مثال Interest2 السابق ، فربما لاحظت أن الإجابة لا تُكتب دائمًا بالتنسيق الذي يستخدم عادةً للمبالغ بالدولار. بشكل عام ، تتم كتابة المبالغ بالدولار برقمين بعد الفاصلة العشرية. لكن يمكن أن يكون ناتج البرنامج رقمًا مثل 1050.0 أو 43.575. سيكون من الأفضل لو تم طباعة هذه الأرقام على أنها 1050.00 و 43.58.

قدم Java 5.0 إمكانية إخراج منسقة تجعل التحكم في تنسيق أرقام الإخراج أسهل بكثير مما كان عليه في السابق. يتوفر الكثير من خيارات التنسيق. سأغطي فقط بعضًا من أبسط الاحتمالات والأكثر استخدامًا هنا.

يمكنك استخدام الوظيفة System.out.printf لإنتاج إخراج منسق. (يتم نسخ الاسم "printf" ، الذي يعني "تنسيق الطباعة" ، من لغات البرمجة C و C ++ ، والتي تتمتع دائمًا بقدرات تنسيق مماثلة). يأخذ System.out.printf معلمتين أو أكثر. المعلمة الأولى هي سلسلة تحدد تنسيق الإخراج. تسمى هذه المعلمة سلسلة التنسيق. تحدد المعلمات المتبقية القيم التي سيتم إخراجها. إليك عبارة ستطبع رقمًا بالتنسيق المناسب لمبلغ بالدولار ، حيث يكون المبلغ متغيرًا من النوع double:

يمكن لـ TextIO أيضًا القيام بإخراج منسق. وظيفة TextIO.putf لها نفس وظيفة System.out.printf. باستخدام TextIO ، سيكون المثال أعلاه: TextIO.printf ("٪ 1.2" ، المبلغ) ويمكنك أن تقول TextIO.putln ("٪ 1.2f" ، أساسي) بدلاً من TextIO.putln (أساسي) في برنامج Interest2 للحصول على الإخراج بالتنسيق الصحيح.

يتم تحديد تنسيق الإخراج لقيمة بواسطة محدد التنسيق. تحتوي سلسلة التنسيق (في الحالات البسيطة التي أغطيها هنا) على محدد تنسيق واحد لكل من القيم التي سيتم إخراجها. بعض محددات التنسيق النموذجية هي٪ d و٪ 12d و٪ 10s و٪ 1.2f و٪ 15.8e و٪ 1.8g. يبدأ كل محدد تنسيق بعلامة النسبة المئوية (٪) وينتهي بحرف ، ربما ببعض معلومات التنسيق الإضافية بينهما. تحدد الرسالة نوع المخرجات التي سيتم إنتاجها. على سبيل المثال ، في٪ d و٪ 12d ، يحدد الحرف "d" أنه يجب كتابة عدد صحيح. يحدد "12" في٪ 12d الحد الأدنى لعدد المسافات التي يجب استخدامها للإخراج. إذا كان العدد الصحيح الذي يتم إخراجه يستغرق أقل من 12 مسافة ، تتم إضافة مسافات فارغة إضافية أمام العدد الصحيح ليصل الإجمالي إلى 12. نقول أن الناتج "مبرر لليمين في حقل طوله 12." لا يتم فرض القيمة على 12 مسافة إذا كانت القيمة تحتوي على أكثر من 12 رقمًا ، ستتم طباعة جميع الأرقام بدون مسافات إضافية. يعني المحدد٪ d أن نفس٪ 1d عبارة عن عدد صحيح ستتم طباعته باستخدام العديد من المسافات حسب الضرورة. (بالمناسبة ، يشير الحرف "d" إلى الأرقام "العشرية" (الأساس 10). يمكنك استخدام "x" لإخراج قيمة عدد صحيح في شكل سداسي عشري.)

يمكن استخدام الحرف "s" في نهاية محدد التنسيق مع أي نوع من القيم. هذا يعني أنه يجب إخراج القيمة بتنسيقها الافتراضي ، تمامًا كما لو كانت في الإخراج غير المنسق. يمكن إضافة رقم مثل "10" في٪ 10s لتحديد (الحد الأدنى) لعدد الأحرف. يرمز الحرف "s" إلى "سلسلة" ، مما يعني أنه يتم تحويل القيمة إلى قيمة سلسلة بالطريقة المعتادة.

تعد محددات التنسيق لقيم النوع المزدوج أكثر تعقيدًا. يتم استخدام "f" ، كما في٪ 1.2f ، لإخراج رقم في شكل "الفاصلة العائمة" ، أي بأرقام بعد الفاصلة العشرية. في٪ 1.2f ، يحدد "2" عدد الأرقام المراد استخدامها بعد الفاصلة العشرية. يحدد "1" العدد (الأدنى) من الأحرف لإخراجها ، مما يعني بشكل فعال أنه يجب استخدام العديد من الأحرف حسب الضرورة. وبالمثل ، فإن٪ 12.3f سيحدد تنسيق فاصلة عائمة بثلاثة أرقام بعد الفاصلة العشرية ، مضبوطًا لليمين في حقل طوله 12.

يجب كتابة الأرقام الكبيرة والصغيرة جدًا بالتنسيق الأسي ، مثل 6.00221415e23 ، والتي تمثل "6.00221415 مضروبة في 10 مرفوعة إلى القوة 23." يحدد محدد التنسيق مثل٪ 15.8e إخراجًا في شكل أسي ، مع تحديد "8" عدد الأرقام التي يجب استخدامها بعد العلامة العشرية. إذا كنت تستخدم "g" بدلاً من "e" ، فسيكون الإخراج في شكل نقطة عائمة للقيم الصغيرة وفي شكل أسي للقيم الكبيرة. في٪ 1.8g ، يعطي الرقم 8 العدد الإجمالي للأرقام في الإجابة ، بما في ذلك كل من الأرقام قبل الفاصلة العشرية والأرقام التي تلي الفاصلة العشرية.

بالإضافة إلى محددات التنسيق ، يمكن أن تتضمن سلسلة التنسيق في جملة printf أحرفًا أخرى. يتم فقط نسخ هذه الأحرف الإضافية إلى الإخراج. يمكن أن تكون هذه طريقة مناسبة لإدراج القيم في منتصف سلسلة الإخراج. على سبيل المثال ، إذا كانت x و y متغيرين من النوع int ، فيمكنك القول

عندما يتم تنفيذ هذه العبارة ، يتم استبدال قيمة x لأول٪ d في السلسلة ، وقيمة y للثاني٪ d ، وقيمة التعبير x * y للثالث ، لذلك سيكون الناتج شيئًا مثل "حاصل ضرب 17 و 42 هو 714" (لم يتم تضمين علامات الاقتباس في الإخراج!).

2.4.5 مقدمة إلى ملف I / O

System.out يرسل مخرجاته إلى وجهة الإخراج المعروفة باسم "الإخراج القياسي". لكن الإخراج القياسي هو مجرد وجهة إخراج محتملة واحدة. على سبيل المثال ، يمكن كتابة البيانات في ملف مخزن على القرص الصلب للمستخدم. وميزة ذلك بالطبع هي أن البيانات يتم حفظها في الملف حتى بعد انتهاء البرنامج ، ويمكن للمستخدم طباعة الملف وإرساله بالبريد الإلكتروني إلى شخص آخر وتحريره ببرنامج آخر وهكذا.

TextIO لديه القدرة على كتابة البيانات إلى الملفات وقراءة البيانات من الملفات. عند كتابة الإخراج باستخدام طريقة put أو putln أو putf في TextIO ، يتم إرسال الإخراج إلى وجهة الإخراج الحالية. بشكل افتراضي ، تكون وجهة الإخراج الحالية هي الإخراج القياسي. ومع ذلك ، يحتوي TextIO على بعض الإجراءات الفرعية التي يمكن استخدامها لتغيير وجهة الإخراج الحالية. للكتابة إلى ملف يسمى "result.txt" ، على سبيل المثال ، يمكنك استخدام العبارة:

بعد تنفيذ هذا البيان ، سيتم إرسال أي إخراج من عبارات إخراج TextIO إلى الملف المسمى "result.txt" بدلاً من الإخراج القياسي. يجب إنشاء الملف في نفس الدليل الذي يحتوي على البرنامج. لاحظ أنه في حالة وجود ملف يحمل نفس الاسم بالفعل ، فسيتم مسح محتوياته السابقة! في كثير من الحالات ، تريد السماح للمستخدم بتحديد الملف الذي سيتم استخدامه للإخراج. البيان

سيفتح مربع حوار نموذجي لاختيار ملف واجهة المستخدم الرسومية حيث يمكن للمستخدم تحديد ملف الإخراج. إذا كنت تريد العودة إلى إرسال الإخراج إلى الإخراج القياسي ، فيمكنك القول

يمكنك أيضًا تحديد مصدر الإدخال لوظائف "get" المتنوعة الخاصة بـ TextIO. مصدر الإدخال الافتراضي هو الإدخال القياسي. يمكنك استخدام العبارة TextIO.readFile ("data.txt") للقراءة من ملف باسم "data.txt" بدلاً من ذلك ، أو يمكنك السماح للمستخدم بتحديد ملف الإدخال بقول TextIO.readUserSelectedFile () ، ويمكنك الانتقال العودة إلى القراءة من الإدخال القياسي باستخدام TextIO.readStandardInput ().

عندما يقرأ برنامجك من الإدخال القياسي ، يحصل المستخدم على فرصة لتصحيح أي أخطاء في الإدخال. هذا غير ممكن عندما يقرأ البرنامج من ملف. إذا تم العثور على بيانات غير قانونية عندما يحاول أحد البرامج القراءة من ملف ، يحدث خطأ يؤدي إلى تعطل البرنامج. (لاحقًا ، سنرى أنه من الممكن "اكتشاف" مثل هذه الأخطاء والتعافي منها.) يمكن أن تحدث الأخطاء أيضًا ، وإن كان نادرًا ، عند الكتابة إلى الملفات.

يتطلب الفهم الكامل لإدخال / إخراج الملف في Java معرفة البرمجة الموجهة للكائنات. سنعود إلى الموضوع لاحقًا ، في الفصل 11. تعد إمكانيات الإدخال / الإخراج للملف في TextIO بدائية إلى حد ما بالمقارنة. ومع ذلك ، فهي كافية للعديد من التطبيقات ، وستسمح لك بالحصول على بعض الخبرة مع الملفات عاجلاً وليس آجلاً.


4.3.1.5. انتاج¶

يتعامل هذا القسم من ملف الإدخال FAST الأساسي مع ما يمكن إخراجه من محاكاة FAST ، باستثناء إخراج التصور الخطي والمضمون في الأقسام التالية.

طباعة بيانات الملخص إلى "& ltRootName & gt.sum" [T / F]

عند التعيين على "True" ، سينشئ FAST ملفًا باسم "& ltRootName & gt.sum". يحتوي ملف الملخص هذا على رقم إصدار جميع الوحدات المستخدمة ، والخطوات الزمنية لكل وحدة ، ومعلومات حول القنوات التي تتم كتابتها في ملف (ملفات) إخراج مسيرة الوقت. إذا كانت SumPrint "خطأ" ، فلن يتم إنشاء ملف ملخص.

مقدار الوقت بين رسائل حالة الشاشة

أثناء محاكاة FAST ، يقوم البرنامج بطباعة رسالة مثل هذه: يحدد SttsTime مدى تكرار تحديث هذه الرسالة. على سبيل المثال ، إذا كان SttsTime ثانيتين ، فسترى هذه الرسالة محدثة كل ثانيتين من وقت المحاكاة.

مقدار الوقت بين إنشاء ملفات نقاط التحقق لإعادة التشغيل المحتملة

يحدد هذا الإدخال مدى تكرار كتابة ملفات نقاط التحقق. تُستخدم ملفات Checkpoint لإمكانية إعادة التشغيل ، نوصي بأن تقوم عمليات المحاكاة القصيرة بتعيين ChkptTime ليكون أكبر من وقت المحاكاة ، TMax. لمزيد من المعلومات حول ملفات نقاط التحقق وإمكانية إعادة التشغيل في FAST ، راجع القسمين "Checkpoint Files (إعادة تشغيل القدرة)" و "إعادة التشغيل: البدء FAST من ملف نقاط التحقق" في هذا المستند. يتم تجاهل ChkptTime في واجهة FAST-Simulink ، ويجب أن يكون أكبر من TMax عند استخدام واجهة FAST-OrcaFlex (CompMooring = 4).

الخطوة الزمنية للمخرجات المجدولة

هذه هي الخطوة الزمنية للبيانات في ملفات الإخراج المجدولة (مسيرة الوقت). يجب أن يكون DT_Out عددًا صحيحًا مضاعفًا لـ DT. بدلاً من ذلك ، يمكن إدخال DT_Out كسلسلة "افتراضي" ، والتي ستعمل على تعيين DT_Out = DT.

حان الوقت لبدء الإخراج المجدول

هذه هي الخطوة الزمنية التي يجب الوصول إليها قبل أن يبدأ FAST في كتابة البيانات في ملفات الإخراج المجدولة (المسيرة الزمنية). لاحظ أن ملفات الإخراج قد لا تبدأ فعليًا عند TStart بالثواني إذا لم يكن TStart عددًا صحيحًا مضاعفًا لـ DT_Out.

تنسيق الإخراج المجدول [1 أو 2 أو 3]

استخدام محددات الجدولة في ملف الإخراج النصي المجدول؟ [T / F]

عندما يكون OutFileFmt = 1 أو 3 ، فإن ضبط TabDelim على "True" سيضع علامات تبويب بين الأعمدة في ملف الإخراج النصي المجدول (مسيرة الوقت). خلاف ذلك ، ستفصل المسافات بين الأعمدة في ملف الإخراج النصي الجدولي. إذا كان OutFileFmt = 2 ، فلن يكون لـ TabDelim أي تأثير.

التنسيق المستخدم لإخراج نص جدولي ، باستثناء قناة الوقت [-]

عندما OutFileFmt = 1 أو 3 ، سيستخدم FAST OutFmt لتنسيق القنوات المطبوعة في ملف الإخراج النصي المجدول. يجب أن ينتج عن OutFmt حقل يتكون من 10 أحرف (يبلغ طول رؤوس القنوات 10 أحرف ، ويفترض برنامج المعالجة اللاحقة لـ NWTC أحيانًا 10 أحرف). تتم طباعة قناة الوقت باستخدام تنسيق "F10.4". نحدد عادةً OutFmt ليكون "ES10.3E2". إذا كان OutFileFmt = 2 ، فلن يكون لـ OutFmt أي تأثير.

(*) يشير هذا إلى نوع ملفات الإخراج الجدولية (المسيرة الزمنية) التي سيتم إنشاؤها. إذا كانت قيمة OutFileFmt تساوي 1 ، فسيتم كتابة ملف نصي فقط. إذا كانت قيمة OutFileFmt تساوي 2 ، فستتم كتابة ملف ثنائي فقط. إذا كانت قيمة OutFileFmt تساوي 3 ، فستتم كتابة كل من الملفات النصية والملفات الثنائية. تكتب الملفات النصية سطرًا إلى الملف في كل خطوة زمنية للإخراج. يمكن أن يجعل هذا المحاكاة تعمل بشكل أبطأ ، ولكن يمكن أن يكون مفيدًا لتصحيح الأخطاء ، خاصة إذا لم يتم تشغيل المحاكاة حتى اكتمالها أو إذا كنت تريد إلقاء نظرة على بعض النتائج قبل انتهاء المحاكاة بالكامل. تتم كتابة الملفات الثنائية بالكامل في نهاية المحاكاة. إذا تم طلب الكثير من قنوات الإخراج لمحاكاة طويلة ، فقد يستغرق ذلك قدرًا معتدلًا من الذاكرة. ومع ذلك ، فإنها تميل إلى العمل بشكل أسرع وتشغل الملفات الناتجة مساحة أقل بكثير. تحتوي الملفات الثنائية على بيانات إخراج أكثر دقة من الملفات النصية ، والتي يتم تقييدها بواسطة محدد تنسيق الإخراج المختار - راجع OutFmt أدناه. نوصي باستخدام الملفات النصية لتصحيح الأخطاء والملفات الثنائية لأعمال الإنتاج. يتم تضمين برنامج نصي MATLAB لقراءة ملفات الإخراج الثنائية FAST في مستودع OpenFAST Matlab Toolbox. يتم توزيع كود Python لقراءة ملفات الإخراج السريع باستخدام OpenFAST في الوحدة النمطية fast_io لإطار اختبار الانحدار. يمكن لمعالجات ما بعد NREL Crunch و MCrunch أيضًا قراءة هذه الملفات الثنائية.


2.2. أنماط النمذجة¶

في Verilog ، يمكن تصميم النموذج بأربع طرق كما هو موضح في هذا القسم. تم تصميم المقارنة ثنائية البت بأنماط مختلفة والتي تولد الناتج "1" إذا كانت الأرقام متساوية ، وإلا يتم تعيين الإخراج على "0".

2.2.1. بيانات التخصيص المستمر¶

في أسلوب النمذجة هذا ، يتم تحديد العلاقة بين المدخلات والمخرجات باستخدام تخصيصات الإشارة. يتم استخدام الكلمة الرئيسية "تعيين" لهذا الغرض. بعبارة أخرى ، نحن لا نحدد بنية التصميم صراحةً ، فنحن فقط نحدد العلاقات بين الإشارات ، ويتم إنشاء الهيكل ضمنيًا أثناء عملية التوليف.

تفسير القائمة 2.1:

القائمة 2.1 هي مثال لتصميم "عبارات التخصيص المستمر" ، حيث ترد العلاقة بين المدخلات والمخرجات في السطر 8. في فيريلوج ، تُستخدم علامة "& amp" لـ "و" العملية (السطر 8) ، و "//" هي تستخدم للتعليقات (السطر 1). يظهر الشكل "والبوابة (أي عرض RTL)" الذي تم إنشاؤه بواسطة القائمة 2.1 في الشكل 2.1.

ملحوظة

لمشاهدة العرض من اليمين إلى اليسار للتصميم ، انتقل إلى Tools- & gtNetlist Viewers- & gtRTL viewer

لاحظ أنه في السطرين 4 و 5 ، يتم استخدام الكلمة الرئيسية "wire" وهي "نوع البيانات". بالنسبة إلى عبارات التخصيص المستمرة ، يتم استخدام الكلمة الرئيسية "wire" بينما يتم استخدام الكلمة الرئيسية "reg" لبيان التعيين الإجرائي. علاوة على ذلك ، لا يمكن تعريف منافذ الإدخال على أنها "reg". لاحظ أن هذه الكلمات الرئيسية غير قابلة للتبديل وأن الاختلافات بين "أنواع البيانات" تمت مناقشتها في القسم 2.2.4. علاوة على ذلك ، المزيد من المشغلين على سبيل المثال تمت مناقشة "و" و "لا" و "ناند" وما إلى ذلك في الفصل 3.

يمكن كتابة القائمة 2.1 على أنها قائمة 2.2 ، حيث يحتوي تعريف الوحدة النمطية على اسم المنافذ فقط (السطر 3) ويتم تحديد أنواع المنافذ خارج الوحدة النمطية (الأسطر 5-6).

2.2.2. المقارنات باستخدام عبارات التخصيص المستمر¶

في هذا القسم ، يتم عرض مثالين آخرين على عبارات التخصيص المستمر ، أيمقارنات "1 بت" و "2 بت" والتي تُستخدم لتوضيح الاختلافات بين أنماط النمذجة المختلفة في البرنامج التعليمي. يوضح الشكل 2.2 والشكل 2.3 جداول الحقيقة لمقارنات "1 بت" و "2 بت". كما يوحي الاسم ، يقارن المقارنة بين القيمتين ويعين الناتج "مكافئ" إلى 1 ، عندما تكون قيمتا الإدخال متساويتين وإلا يتم تعيين "مكافئ" على صفر. يتم عرض التعبيرات المنطقية المقابلة أدناه ،

يتم تنفيذ تعبيرين أعلاه باستخدام verilog في القائمة 2.3 والقائمة 2.4 ، والتي تم شرحها أدناه.

تفسير القائمة 2.3:

يقوم الإصدار 2.3 بتنفيذ مقارنة 1 بت بناءً على (2.1). يتم تعريف إشارتين وسيطتين في السطر 8. يتم تعريف هاتين الإشارتين (s0 و s1) لتخزين قيم x’y ’و xy على التوالي. يتم تعيين القيم لهذه الإشارات في السطر 10 و 11. في فيريلوج ، يتم تنفيذ عمليات "لا" و "أو" باستخدام "

علامتي "و" | "كما هو موضح في السطر 10 و 12 على التوالي. أخيرًا (2.1) ينفذ عملية "أو" على هاتين الإشارتين ، والتي تتم في السطر 12. عندما نقوم بتجميع هذا الرمز باستخدام "برنامج Quartus" ، فإنه يقوم بتنفيذ الكود في تصميم الأجهزة كما هو موضح في الشكل 2.4.

تظهر عملية التجميع لإنشاء التصميم في الملحق 17. أيضًا ، يمكننا التحقق من علاقات المدخلات والمخرجات لهذا التصميم باستخدام Modelsim ، والتي تمت مناقشتها أيضًا باختصار في الملحق 17.

لاحظ أن العبارات الموجودة في "عبارات التخصيص المستمر" و "النمذجة الهيكلية" (الموضحة في القسم 2.2.3) هي العبارات المتزامنة ، أي يتم تنفيذ هذه العبارات بالتوازي. بمعنى آخر ، لا يؤثر ترتيب العبارات على سلوك الدائرة ، على سبيل المثال. إذا قمنا بتبادل الأسطر 10 و 11 و 12 في القائمة 2.3 ، فسنحصل مرة أخرى على الشكل 2.4 كتطبيق.

من ناحية أخرى ، يتم تنفيذ العبارات الموجودة في "بيانات التخصيص الإجرائية" (الموضحة في القسم 2.2.4) بالتتابع وأي تغييرات في ترتيب البيانات ستغير سلوك الدائرة.

تفسير : numref: الشكل 2.4

يتم إنشاء الشكل 2.4 بواسطة برنامج Quartus وفقًا لرمز verilog الموضح في القائمة 2.3. هنا ، s0 هي البوابة "و" ذات المدخلات المقلوبة x و y ، والتي يتم إنشاؤها وفقًا للخط 10 في القائمة 2.3. وبالمثل ، يتم إنشاء بوابة s1 "و" وفقًا للخط 11. وأخيرًا يتم تطبيق ناتج هاتين البوابتين على "أو" بوابة (تسمى "مكافئ") والتي تم تحديدها في السطر 12 من القائمة 2.3.

تفسير قائمة 2.4

هذه القائمة تنفذ المعادلة (2.2). هنا ، نستخدم إدخال بتتين ، لذلك يتم استخدام "السلك [1: 0]" في السطر 4. "1: 0" يعين 1 كـ MSB (بت الأكثر أهمية) و 0 كـ LSB (بتة الأقل أهمية) أي a [1] و b [1] هما MSB ، في حين أن [0] و b [0] هما LSB. نظرًا لأننا نحتاج إلى تخزين أربع إشارات (الأسطر 10-13) ، فإن "s" يتم تعريفها على أنها متجه 4 بت في السطر 8. باقي العمل هو نفس القائمة 2.3. يظهر تنفيذ هذه القائمة في الشكل 2.5.

2.2.3. النمذجة الهيكلية¶

في القسم السابق ، قمنا بتصميم مقارنة 2 بت على أساس المعادلة (2.2). علاوة على ذلك ، يمكننا تصميم مقارنة 2 بت باستخدام مقارنة 1 بت أيضًا ، مع الخطوات التالية ،

  • قارن أولاً كل بت من أرقام 2 بت باستخدام مقارنة 1 بت ، أي قارن [0] مع b [0] و [1] مع b [1] باستخدام مقارن 1 بت (كما هو موضح في الشكل 2.3).
  • إذا كانت كلتا القيمتين متساويتين ، فقم بتعيين الناتج "مكافئ" على 1 ، وإلا اضبطه على صفر.

تُعرف هذه الطريقة باسم النمذجة "الهيكلية" ، حيث نستخدم التصميمات المحددة مسبقًا لإنشاء تصميمات جديدة (بدلاً من تنفيذ التعبير "المنطقي"). هذه الطريقة مفيدة جدًا ، لأن معظم الأنظمة الكبيرة تتكون من وحدات تصميم صغيرة متنوعة. أيضًا ، من السهل إنشاء ومحاكاة وفحص الوحدات الصغيرة المختلفة بدلاً من نظام واحد كبير. قائمة 2.5 هي مثال على التصميمات الهيكلية ، حيث يتم استخدام مقارنة 1 بت لإنشاء مقارنة 2 بت.

تفسير قائمة 2.5

في هذه القائمة ، تحدد الأسطر 4-5 منفذي الإدخال بحجم 2 بت ومنفذ إخراج 1 بت. ثم يتم تحديد إشارتين (السطر 8) لتخزين مخرجات مقارنين من 1 بت ، كما هو موضح أدناه.

"eq_bit0" و "eq_bit1" في السطرين 10 و 11 هما اسمان للمقارن 1 بت ، واللذان يستخدمان في هذا التصميم. يمكننا رؤية هذه الأسماء في التصميم الناتج ، والذي يظهر في القائمة 2.5.

بعد ذلك ، "المقارنة 1 بت" في السطرين 10 و 11 هو اسم المقارنة 1 بت (المحدد في القائمة 2.3). مع هذا الإعلان ، أي المقارنة 1 بت ، فإننا نطلق على تصميم مقارنة 1 بت للتصميم الحالي.

ثم ، تعيين البيانات على سبيل المثال .x (a [0]) في السطور 10 و 11 ، يقوم بتعيين القيم لمنفذ الإدخال والإخراج لمقارن 1 بت. على سبيل المثال ، في السطر 10 ، يتم تعيين منافذ الإدخال لمقارن 1 بت ، أي x و y ، قيم [0] و b [0] على التوالي من هذا التصميم ويتم تخزين الإخراج y للمقارن 1 بت في إشارة s0. علاوة على ذلك ، في السطر 13 ، إذا كانت الإشارات s0 و s1 هي 1 ، فسيتم تعيين "eq" على 1 باستخدام "و" gate ، وإلا فسيتم ضبطه على 0. يظهر التصميم النهائي الذي تم إنشاؤه بواسطة برنامج Quartus للقائمة 2.5 في الشكل 2.6. .

تفسير الشكل 2.6

في هذا الشكل ، a [1..0] و b [1..0] هما بتات الإدخال بينما "eq" هو بت الإخراج. توضح الخطوط السميكة بعد [1..0] و b [1..0] أن هناك أكثر من 1 بت على سبيل المثال في هذه الحالة ، تحتوي هذه الخطوط على بتين. يتم تغيير هذه الخطوط السميكة إلى خطوط رفيعة قبل الانتقال إلى المقارنات مما يشير إلى إرسال 1 بت فقط كمدخل للمقارن.

في "المقارنة 1 بت: eq_bit0" ، "المقارنة 1 بت" هو اسم الوحدة المحددة للمقارن 1 بت (قائمة 2.3) بينما "eq_bit0" هو اسم هذه الوحدة المحددة في السطر 10 من القائمة 2.5. أخيرًا ، يتم إرسال نواتج المقارنة ذات 1 بت إلى البوابة "و" وفقًا للسطر 13 في القائمة 2.5.

ومن ثم ، من هذا الشكل ، يمكننا أن نرى أنه يمكن تصميم المقارنة ذات 2 بت باستخدام مقارنين من 1 بت.

2.2.4. بيانات التكليف الإجرائية

في عبارات التخصيص الإجرائية ، يتم استخدام الكلمة الأساسية "دائمًا" ويتم تنفيذ جميع العبارات الموجودة داخل العبارة دائمًا بالتسلسل. يمكن استخدام عبارات شرطية وحلقة مختلفة داخل كتلة العملية كما هو موضح في القائمة 2.6. علاوة على ذلك ، تكون الكتل دائمًا عبارة عن كتل متزامنة ، أي إذا كان التصميم يحتوي على العديد من الكتل دائمًا (انظر القائمة 2.7) ، فسيتم تنفيذ جميع الكتل دائمًا بشكل متوازٍ.

تفسير القائمة 2.6:

يتم الإعلان عن الكتلة "دائمًا" في السطر 8 ، والتي تبدأ وتنتهي عند السطر 9 و 14 على التوالي. لذلك سيتم تنفيذ جميع العبارات بين السطر 9 إلى 14 بالتتابع وسيقوم Quartus Software بإنشاء التصميم بناءً على تسلسل البيانات. ستؤدي أي تغييرات في التسلسل إلى تصميم مختلف.

لاحظ أنه تم التصريح عن منفذ الإخراج "eq" على أنه ريج في السطر 5. إذا قمنا بتعيين قيمة للإشارة داخل الكتلة "دائمًا" ، فيجب إعلان هذه الإشارة على أنها "reg" على سبيل المثال يتم تعيين قيمة "eq" في السطر 11 و 13 ، والتي تكون داخل الكتلة "دائمًا" ومن ثم يتم إعلان "eq" على أنها reg.

تأخذ الكلمة الرئيسية "دائمًا" وسيطين في السطر 8 (المعروف باسم "قائمة الحساسية") ، مما يشير إلى أنه سيتم تنفيذ كتلة العملية إذا وفقط إذا كانت هناك بعض التغييرات في "أ" و "ب". يتم استخدام "& # 64" بعد "دائمًا" لتحديد قائمة الحساسية. في السطر 10-13 ، يتم الإعلان عن عبارة "if" التي تحدد قيمة "eq" إلى 1 إذا كانت كلتا البتتين متساويتين (السطر 10-11) ، وإلا فسيتم تعيين "eq" على 0 (السطر 12-13 ). يوضح الشكل 2.7 التصميم الذي تم إنشاؤه بواسطة Quartus Software لهذه القائمة. يعد "==" في السطر 10 أحد عوامل تشغيل الحالة بينما يعتبر & amp & amp ؛ عامل التشغيل المنطقي ، والذي تمت مناقشته بالتفصيل في الفصل 3.


القسم 33. رموز الأوامر EFTNT و EFTAD و EFTOF للتحويل الإلكتروني للأموال

التحويل اليدوي

غرض

(1) يقوم هذا بإرسال IRM 2.4.33 المنقح وإدخال IDRS الطرفية ورموز الأوامر EFTNT و EFTAD و EFTOF لتحويل الأموال الإلكتروني.

التغييرات المادية

(1) سيتطلب رمز الأمر EFTNT الآن إدخال رقم البنك ورقم الحساب المصرفي مرتين على شاشة الإدخال. إذا كان الحقلين غير متساويين ، فسيتم إرجاع خطأ.

التأثير على المستندات الأخرى

جمهور

تاريخ النفاذ

تيرينس في ميلهولاند
الرئيس التنفيذي للتكنولوجيا

معلومات عامة عن رموز أوامر تحويل الأموال الإلكتروني

يحتوي هذا القسم على تعليمات للوصول إلى واستخدام رموز الأوامر (CC) EFTNT و EFTAD و EFTOF. يتم استخدام رموز الأوامر هذه من قبل أفراد التحصيل في الحرم الجامعي لإنشاء أو مراجعة أو تحديث أو تخطي تحويلات الأموال الإلكترونية (EFT) لاتفاقيات أقساط الخصم المباشر (DDIA).

كود الأمر EFTNT

يتم استخدام رمز الأمر EFTNT لإدخال معلومات بنك DDIA EFT الجديد. أو تصحيح المعلومات المصرفية الموجودة.

كود الأمر EFTNT مع محدد فارغ

يجب الوصول إلى رمز الأمر EFTNT فقط باستخدام رمز الأمر IAGRE أو IAORG أو IAREV. هذا هو الشرط الأساسي للوصول إلى رمز الأمر EFTNT لإدخال معلومات بنكية جديدة أو تغيير موجودة. الشكل التوضيحي 2.4.33 - 3. كود الأمر EFTNT مع المحدد F هو شرط أساسي لإدخال كود الأمر EFTNT مع محدد فارغ.

استجابات إخراج المحطة الطرفية لـ EFTNT:

يشير "الطلب مكتمل" ، المعروض على سطر الشاشة 24 ، إلى عدم حدوث أي ظروف خطأ في قبول إدخال المعلومات المصرفية من CC IAORG أو IAPND أو IAREV.

تشير عبارة "PLEASE CORRECT INVALID DATA" ، المعروضة على سطر الشاشة 24 ، إلى أن حقل الإدخال لم يتم تنسيقه بشكل صحيح أو أنه يحتوي على قيمة غير صحيحة. سيتم تمييز الحقل غير الصحيح بعلامة النجمة (*).

"تحديث تم تحويل الحساب غير مسموح به" ، المعروض على سطر الشاشة 24 يشير إلى أنه تم نقل الحساب إلى مركز خدمة آخر.

"PAYMNT PRESENT ON EFT ACCNT-CHECK CC EFTAD" ، المعروض على سطر الشاشة 24 يشير إلى أن هناك طلب دفع ليتم استخراجه اليوم. لا يمكن معالجة الملاحظة المسبقة في حالة وجود طلب دفع.

كود الأمر EFTNT مع المحدد F

يستخدم رمز الأمر EFTNT مع محدد F فقط لتحديث أو تصحيح المعلومات المصرفية الحالية. لاستخدام رمز الأمر هذا ، يجب إدخاله بعد الوصول إلى IAGRE أو IAORG أو IAREV (انظر IRM 2.4.30) . هذه هي المتطلبات الأساسية CC لاستخدام EFTNT مع المحدد F. الشكل التوضيحي 2.4.33-1

انظر الشكل 2-4.33-2 لتنسيق المعلومات المصرفية

استجابات إخراج المحطة الطرفية لـ EFTNT مع المحدد F:

"طلب مرفوض / غير صحيح" ، المعروض على سطر الشاشة 24 يشير إلى أن CC EFTNT مع المحدد F لم يسبقه CC IAGRE أو IAORG أو IAREV.

"ACCOUNT NOT EFT INSTALLMENT STATUS" ، المعروض على سطر الشاشة 24 يشير إلى أن إدخال CC IAGRE أو IAORG أو IAREV السابق لم يحتوي على مؤشر التحويل الإلكتروني.

يشير "الطلب مكتمل" ، المعروض على سطر الشاشة 24 ، إلى عدم حدوث أي ظروف خطأ في قبول إدخال المعلومات المصرفية من CC IAORG أو IAPND أو IAREV.

تشير عبارة "PLEASE CORRECT INVALID DATA" ، المعروضة على سطر الشاشة 24 ، إلى أن حقل الإدخال لم يتم تنسيقه بشكل صحيح أو أنه يحتوي على قيمة غير صحيحة. سيتم تمييز الحقل غير الصحيح بعلامة النجمة (*).

كود الأمر EFTAD

يتم استخدام رمز الأمر هذا مع محدد فارغ للحصول على المعلومات المصرفية وبيانات الدفع لرقم تعريف دافع محدد. الشكل التوضيحي 2.4.33-4.

استجابات إخراج المحطة الطرفية لـ CC EFTAD

راجع الشكل التوضيحي 2.4.33-5 للحصول على معلومات البنك وتنسيق بيانات الدفع.

يشير "INVALID TIN" ، المعروض على سطر الشاشة 24 ، إلى أن رقم تعريف الإدخال (TIN) لم يتم تنسيقه بشكل صحيح أو يحتوي على قيمة غير صالحة.

"ACCOUNT NOT ON FILE" ، المعروض على سطر الشاشة 24 يشير إلى أن إدخال TIN غير موجود في ملف تحويل الأموال الإلكتروني.

تشير عبارة "PAYT REJECTED BY ACH BANK" ، المعروضة على سطر الشاشة 9 ، إلى أن طلب التحويل الإلكتروني تمت معالجته بواسطة البنك وإعادته لعدم الدفع.

كود الأمر EFTAD مع المحدد D

يتم استخدام رمز الأمر هذا مع التعريف D ورمز مركز خدمة صالح مكون من رقمين (07،08،09،17،18،19،28،29،49 و 89) للحصول على معلومات الإيداع وبيانات الدفع لتاريخ إيداع محدد. الشكل التوضيحي 2.4.33-6.

استجابات إخراج المحطة الطرفية:

راجع الشكل التوضيحي 2.4.33-7 للحصول على معلومات الإيداع وتنسيق بيانات الدفع.

يشير "تاريخ غير صالح" ، المعروض على سطر الشاشة 24 إلى أن تاريخ الإدخال لم يتم تنسيقه بشكل صحيح أو يحتوي على قيمة غير صالحة.

تشير عبارة "لا توجد بيانات متاحة لـ ALN XX" ، المعروضة على سطر الشاشة 24 ، إلى أن التاريخ المطلوب لـ ALN المحدد ليس تاريخ إيداع فعليًا (عطلة نهاية الأسبوع أو عطلة) أو أن التاريخ المطلوب لم تتم معالجته بعد.

يجب عليك إدخال رمز حرم صالح معروض على سطر الشاشة 24 يشير إلى ضرورة إدخال رمز حرم جامعي صالح من رقمين لمعرفة تواريخ الإيداع لهذا الحرم الجامعي

كود الأمر EFTAD مع المحدد Z

سيتم استخدام كود الأمر هذا مع التعريف Z برمز مركز خدمة صالح مكون من رقمين (07،08،09،17،18،19،28،29،49 و 89) للحصول على تواريخ الإيداع التي هي 10 أيام قبل و 5 أيام بعد التاريخ الحالي في ملف تحويل الأموال الإلكتروني. الشكل التوضيحي 2.4.33 - 8.

استجابات إخراج المحطة الطرفية:

انظر الشكل التوضيحي 2.4.33-9 لتنسيق تواريخ الإيداع.

تشير عبارة "لا توجد بيانات متاحة لـ ALN XX" ، المعروضة على سطر الشاشة 24 ، إلى عدم وجود تواريخ إيداع في EFTF.

"لم يتم الإرسال" ، المعروض على الشاشة يشير إلى أن تاريخ الإيداع موجود في صندوق تحويل الأموال الإلكتروني ولكن لم يتم استخراجه بعد للإرسال إلى بنك غرفة المقاصة.

تشير عبارة "SENT TO BANK" المعروضة على الشاشة إلى أن تاريخ الإيداع موجود في EFTF وأن الملاحظات المسبقة وطلبات الدفع المرتبطة بتاريخ الإيداع هذا قد تم استخراجها لإرسالها إلى بنك غرفة المقاصة.

يجب عليك إدخال رمز حرم صالح معروض على سطر الشاشة 24 يشير إلى ضرورة إدخال رمز حرم جامعي صالح من رقمين لمعرفة النطاق المطلوب لتواريخ الإيداع لهذا الحرم الجامعي

محدد غير صالح

تشير استجابة إخراج المحطة الطرفية "INVALID DEFINER" ، المعروضة على سطر الشاشة 24 ، إلى أن المُحدد لم يكن فارغًا ، أو "D" ، أو "Z".

كود الأمر EFTOF

يتم استخدام رمز الأمر هذا لإيقاف طلب تحويل الأموال الإلكتروني إلى البنك لمدة محددة من رقم التعريف الضريبي وتاريخ القسط. يتم استخدام هذا الطلب فقط عندما يتم تحديث ملف تحويل الأموال الإلكتروني لتضمين تاريخ قسط الإدخال. أيضًا ، يجب أن يسبق الطلب تحويل طلب دفع التحويل الإلكتروني إلى بنك Clearing House. الشكل التوضيحي 2.4.33 - 10.

استجابات مخرجات المحطة الطرفية: الشكل التوضيحي 2.4.33-11.

يشير "الطلب مكتمل" ، المعروض على سطر الشاشة 13 ، إلى أنه تمت معالجة طلب إيقاف الدفع بنظام التحويل الإلكتروني.

يشير "INVALID TIN" ، المعروض على سطر الشاشة 13 ، إلى أن رقم تعريف الإدخال (TIN) لم يتم تنسيقه بشكل صحيح أو يحتوي على قيمة غير صالحة.

يشير "تاريخ غير صالح" ، المعروض على سطر الشاشة 13 ، إلى أن تاريخ الطلب غير منسق بشكل صحيح أو يحتوي على قيمة غير صالحة.

تشير عبارة "EFT DATA NOT AVAILABLE" ، المعروضة على سطر الشاشة 13 ، إلى أن إدخال TIN غير موجود في ملف تحويل الأموال الإلكتروني.

يشير "تاريخ التثبيت الخاطئ" ، المعروض على سطر الشاشة 13 ، إلى أن التاريخ المطلوب ليس هو تاريخ القسط الصحيح لإدخال رقم التعريف الضريبي (TIN) أو أن ملف تحويل الأموال الإلكتروني لم يتم تحديثه ليشمل التاريخ المطلوب.

يشير "طلب الدفع المرسل إلى البنك" ، المعروض على سطر الشاشة 13 ، إلى أن طلب التحويل الإلكتروني قد تم إنشاؤه للبنك لمعالجته.

يشير "طلب الدفع المرفوض من قبل البنك" ، المعروض على سطر الشاشة 13 ، إلى أن طلب التحويل الإلكتروني تمت معالجته من قبل البنك وإعادته لعدم الدفع.

يشير "طلب الدفع تم إيقافه مسبقًا" ، المعروض على سطر الشاشة 13 ، إلى أن CC EFTOF قد تم إدخاله مسبقًا لإدخال رقم التعريف الضريبي وتاريخ القسط.

يشير "تحديث تم تحويل الحساب غير مسموح به" ، المعروض على السطر 13 من الشاشة ، إلى أن الحساب قد تم نقله إلى مركز خدمة آخر.

تشير عبارة "INVALID DEFINER" ، المعروضة على سطر الشاشة 13 ، إلى أن المُحدد لم يكن فارغًا.

تشير عبارة "طلب الدفع المرفوض ، معلومات المذكرة المسبقة" ، المعروضة على سطر الشاشة 13 ، إلى أن البنك قد رفض الإشعار المسبق.

يجب عليك إدخال رمز حرم صالح يتم عرضه على سطر الشاشة 24 يشير إلى ضرورة إدخال رمز حرم جامعي صالح مكون من رقمين حيث يوجد الحساب. (07،08،09،17،18،19،28،29،49 و 89)


تعريض المرشحات كخدمة HTTP

يمكن استخدام المرشحات لمعالجة المحتوى الناشئ من العميل بالإضافة إلى معالجة المحتوى الناشئ على الخادم باستخدام وحدة mod_reflector.

يقبل mod_reflector طلبات POST من العملاء ، ويعكس نص طلب المحتوى الذي تم استلامه في طلب POST مرة أخرى في الاستجابة ، ويمر عبر مكدس مرشح الإخراج في طريق العودة إلى العميل.

يمكن استخدام هذه التقنية كبديل لخدمة الويب التي تعمل داخل مكدس خادم التطبيق ، حيث يوفر عامل تصفية الإخراج التحويل المطلوب في نص الطلب. على سبيل المثال ، يمكن استخدام الوحدة النمطية mod_deflate لتوفير خدمة ضغط عامة ، أو قد يتم تحويل مرشح تحويل الصورة إلى خدمة تحويل الصورة.


الإدخال / الإخراج الأساسي

قدمت أمثلة البرامج في الأقسام السابقة تفاعلًا ضئيلًا مع المستخدم ، إن وجد على الإطلاق. لقد قاموا ببساطة بطباعة قيم بسيطة على الشاشة ، لكن المكتبة القياسية توفر العديد من الطرق الإضافية للتفاعل مع المستخدم عبر ميزات الإدخال / الإخراج. سيقدم هذا القسم مقدمة قصيرة لبعض أكثرها فائدة.

يستخدم C ++ تجريدًا مناسبًا يسمى تيارات لإجراء عمليات الإدخال والإخراج في وسائط متسلسلة مثل الشاشة أو لوحة المفاتيح أو ملف. A هو الكيان حيث يمكن للبرنامج إما إدراج أو استخراج الأحرف من /. ليست هناك حاجة لمعرفة تفاصيل الوسائط المرتبطة بالدفق أو أي من مواصفاته الداخلية. كل ما نحتاج إلى معرفته هو أن التدفقات هي مصدر / وجهة للأحرف ، وأن هذه الأحرف يتم تقديمها / قبولها بالتسلسل (أي واحدًا تلو الآخر).

تحدد المكتبة القياسية عددًا قليلاً من كائنات الدفق التي يمكن استخدامها للوصول إلى ما يعتبر المصادر والوجهات القياسية للشخصيات حسب البيئة التي يعمل بها البرنامج:

مجرىوصف
سين تيار الإدخال القياسي
كوت تيار الإخراج القياسي
سير خطأ معياري (إخراج) تيار
تسد تسجيل قياسي (إخراج) تيار

سنرى بمزيد من التفصيل فقط cout و cin (الإخراج القياسي وتدفق الإدخال) cerr و clog هما أيضًا تدفقات إخراج ، لذلك يعملان بشكل أساسي مثل cout ، مع الاختلاف الوحيد هو أنهما يحددان التدفقات لأغراض محددة: رسائل الخطأ والتسجيل الذي ، في كثير من الحالات ، في معظم إعدادات البيئة ، يفعلون في الواقع نفس الشيء بالضبط: يطبعون على الشاشة ، على الرغم من أنه يمكن أيضًا إعادة توجيههم بشكل فردي.

الإخراج القياسي (كوت)

في معظم بيئات البرامج ، يكون الإخراج القياسي افتراضيًا هو الشاشة ، ويكون كائن دفق C ++ المحدد للوصول إليه هو cout.

لعمليات الإخراج المنسقة ، يتم استخدام cout مع ملف عامل الإدراج، والتي تكتب كـ & lt & lt (أي علامتين "أقل من").

يُدخل عامل التشغيل & lt & lt البيانات التي تتبعها في الدفق الذي يسبقها. في الأمثلة أعلاه ، أدرجت جملة Output للسلسلة الحرفية ، والرقم 120 ، وقيمة المتغير x في تيار الإخراج القياسي cout. لاحظ أن الجملة في العبارة الأولى محاطة بعلامات اقتباس مزدوجة (") لأنها سلسلة حرفية ، بينما في الجملة الأخيرة ، لا تكون x. الاقتباس المزدوج هو ما يصنع الفارق عند وضع النص بينهما ، تتم طباعة النص حرفيًا عندما لا يتم ذلك ، يتم تفسير النص على أنه معرف متغير ، ويتم طباعة قيمته بدلاً من ذلك. على سبيل المثال ، هاتان الجملتان لهما نتائج مختلفة تمامًا:

يمكن ربط عمليات الإدراج المتعددة (& lt & lt) في جملة واحدة:

هذه العبارة الأخيرة ستطبع النص هذه عبارة C ++ واحدة. يُعد تسلسل الإدخالات مفيدًا بشكل خاص لخلط القيم الحرفية والمتغيرات في بيان واحد:

بافتراض أن متغير العمر يحتوي على القيمة 24 وأن متغير الرمز البريدي يحتوي على 90064 ، فإن ناتج البيان السابق سيكون:

عمري 24 عامًا ورمزي البريدي هو 90064
ما لا يفعله cout تلقائيًا هو إضافة فواصل أسطر في النهاية ، ما لم يُطلب منك القيام بذلك. على سبيل المثال ، خذ العبارتين التاليتين اللتين تم إدخالهما في cout:
cout & lt & lt "هذه جملة".
cout & lt & lt "هذه جملة أخرى."

سيكون الإخراج في سطر واحد ، دون أي فواصل بين الأسطر. شيء مثل:

هذه جملة هذه جملة اخرى
لإدخال فاصل أسطر ، يجب إدخال حرف سطر جديد في الموضع المحدد الذي يجب كسر السطر فيه. في C ++ ، يمكن تحديد حرف سطر جديد على أنه n (على سبيل المثال ، حرف الخط المائل العكسي متبوعًا بحرف صغير n). على سبيل المثال:

ينتج عن هذا الناتج التالي:

الجملة الأولى.
الجملة الثانية.
الجملة الثالثة.

بدلاً من ذلك ، يمكن أيضًا استخدام معالج endl لكسر الخطوط. على سبيل المثال:

الجملة الأولى.
الجملة الثانية.

يُنتج معالج endl حرف سطر جديد ، تمامًا كما يفعل إدخال " n" ولكن له أيضًا سلوكًا إضافيًا: يتم مسح المخزن المؤقت للدفق (إن وجد) ، مما يعني أن الإخراج مطلوب كتابته فعليًا إلى الجهاز ، إذا لم يكن بالفعل. هذا يؤثر بشكل رئيسي مخزنة بالكامل التيارات ، و cout (بشكل عام) ليس ملف مخزنة بالكامل مجرى. ومع ذلك ، من الجيد عمومًا استخدام endl فقط عندما يكون مسح التدفق ميزة و " n" عندما لا يكون كذلك. ضع في اعتبارك أن عملية التنظيف تتسبب في زيادة معينة ، وقد تؤدي إلى تأخير في بعض الأجهزة.

الإدخال القياسي (سين)

في معظم بيئات البرامج ، يكون الإدخال القياسي افتراضيًا هو لوحة المفاتيح ، ويكون كائن دفق C ++ المحدد للوصول إليه هو cin.

لعمليات الإدخال المنسقة ، يتم استخدام cin مع عامل الاستخراج ، والذي تتم كتابته كـ & gt & gt (أي علامتين "أكبر من"). ثم يتبع هذا العامل المتغير حيث يتم تخزين البيانات المستخرجة. على سبيل المثال:

التعليمة الأولى تعلن عن متغير من النوع int يسمى العمر ، والثاني يستخرج من cin قيمة ليتم تخزينها فيه. هذه العملية تجعل البرنامج ينتظر الإدخال من cin بشكل عام ، وهذا يعني أن البرنامج سينتظر حتى يقوم المستخدم بإدخال بعض التسلسل باستخدام لوحة المفاتيح. في هذه الحالة ، لاحظ أن الأحرف التي يتم إدخالها باستخدام لوحة المفاتيح تنتقل إلى البرنامج فقط عند الضغط على مفتاح ENTER (أو RETURN). بمجرد الوصول إلى العبارة مع عملية الاستخراج على cin ، سينتظر البرنامج ما دامت الحاجة إليه حتى يتم إدخال بعض المدخلات.

تستخدم عملية الاستخراج في cin نوع المتغير بعد عامل التشغيل & gt & gt لتحديد كيفية تفسيره للأحرف المقروءة من الإدخال إذا كان عددًا صحيحًا ، والصيغة المتوقعة هي سلسلة من الأرقام ، إذا كانت السلسلة عبارة عن سلسلة من الأحرف ، إلخ. .

كما ترى ، يبدو أن الاستخراج من السينما يجعل مهمة الحصول على المدخلات من المدخلات القياسية بسيطة ومباشرة. لكن هذه الطريقة لها أيضًا عيب كبير. ماذا يحدث في المثال أعلاه إذا أدخل المستخدم شيئًا آخر لا يمكن تفسيره على أنه عدد صحيح؟ حسنًا ، في هذه الحالة ، فشلت عملية الاستخراج. وهذا ، افتراضيًا ، يتيح للبرنامج الاستمرار دون تعيين قيمة للمتغير i ، مما ينتج عنه نتائج غير محددة إذا تم استخدام قيمة i لاحقًا.

هذا هو سلوك برنامج سيء للغاية. من المتوقع أن تتصرف معظم البرامج بطريقة متوقعة بغض النظر عن نوع المستخدم ، والتعامل مع القيم غير الصالحة بشكل مناسب. يجب أن تعتمد البرامج البسيطة جدًا فقط على القيم المستخرجة مباشرة من السينما دون مزيد من التحقق. بعد ذلك بقليل سنرى كيف سلاسل يمكن استخدامها للتحكم بشكل أفضل في مدخلات المستخدم.
يمكن أيضًا ربط عمليات الاستخراج بالسينما لطلب أكثر من مرجع واحد في بيان واحد:

في كلتا الحالتين ، من المتوقع أن يقدم المستخدم قيمتين ، واحدة للمتغير أ والأخرى للمتغير ب. يتم استخدام أي نوع من المسافات للفصل بين عمليتي إدخال متتاليتين وقد يكون ذلك إما مسافة أو علامة تبويب أو حرف سطر جديد.

السينما والخيوط

يمكن استخدام عامل الاستخراج في cin للحصول على سلاسل من الأحرف بنفس الطريقة كما هو الحال مع أنواع البيانات الأساسية:

ومع ذلك ، يعتبر الاستخراج السينمائي دائمًا المسافات (المسافات البيضاء ، وعلامات الجدولة ، والسطر الجديد.) بمثابة إنهاء للقيمة التي يتم استخراجها ، وبالتالي فإن استخراج سلسلة يعني دائمًا استخراج كلمة واحدة ، وليس عبارة أو جملة كاملة.

للحصول على سطر كامل من cin ، توجد وظيفة ، تسمى getline ، تأخذ الدفق (cin) كوسيطة أولى ، ومتغير السلسلة باعتباره ثانيًا. على سبيل المثال:

لاحظ كيف استخدمنا نفس معرف السلسلة (mystr) في كلا الاستدعاءين إلى getline. ما يفعله البرنامج في المكالمة الثانية هو ببساطة استبدال المحتوى السابق بالمحتوى الجديد الذي تم تقديمه.

السلوك القياسي الذي يتوقعه معظم المستخدمين من برنامج وحدة التحكم هو أنه في كل مرة يستفسر فيها البرنامج من المستخدم عن الإدخال ، يقوم المستخدم بتقديم الحقل ، ثم يضغط على ENTER (أو RETURN). بمعنى أنه من المتوقع أن تحدث المدخلات بشكل عام من حيث الخطوط الموجودة في برامج وحدة التحكم ، ويمكن تحقيق ذلك باستخدام getline للحصول على مدخلات من المستخدم. لذلك ، ما لم يكن لديك سبب قوي لعدم القيام بذلك ، يجب عليك دائمًا استخدام getline للحصول على مدخلات في برامج وحدة التحكم الخاصة بك بدلاً من الاستخراج من cin.

سلسلة

يعرّف العنوان القياسي & ltsstream & gt نوعًا يسمى تيار السلسلة الذي يسمح بمعاملة سلسلة كتيار ، وبالتالي السماح بعمليات الاستخراج أو الإدراج من / إلى السلاسل بنفس الطريقة التي يتم إجراؤها في cin و cout. هذه الميزة مفيدة للغاية لتحويل السلاسل إلى قيم رقمية والعكس صحيح. على سبيل المثال ، لاستخراج عدد صحيح من سلسلة نصية ، يمكننا كتابة:

هذا يعلن عن سلسلة تمت تهيئتها بقيمة "1204" ، ومتغير من النوع int. بعد ذلك ، يستخدم السطر الثالث هذا المتغير للاستخراج من سلسلة نصية تم إنشاؤها من السلسلة. يخزن هذا الجزء من الكود القيمة العددية 1204 في المتغير المسمى myint.

في هذا المثال ، نحصل على قيم رقمية من ملف المدخلات القياسية بشكل غير مباشر: بدلاً من استخراج القيم الرقمية مباشرة من cin ، نحصل على خطوط منه في كائن سلسلة (mystr) ، ثم نستخرج القيم من هذه السلسلة إلى متغيري السعر والكمية. بمجرد أن تصبح هذه قيمًا عددية ، يمكن إجراء عمليات حسابية عليها ، مثل ضربها للحصول على سعر إجمالي.


شاهد الفيديو: الدورة الخلوية والانقسام الخيطي - بيولوجيا الخلية (شهر نوفمبر 2022).