الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في C/CPP - الحلقة الخامسة, الجزء الأول

مغلق
بدأه Snack3r في 19 سبتمبر 2012 · 5 رد · 1,603 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

الحلقة الثالثة - الجزء الرابع.

الحلقة الثالثة - الجزء الخامس و الأخير.

الحلقة الرابعة - الجزء الأول.

الحلقة الرابعة - الجزء الثاني.

الحلقة الرابعة - الجزء الثالث.

الحلقة الرابعة - الجزء الرابع.

الحلقة الرابعة - الجزء الخامس.

الحلقة الرابعة - الجزء السادس.

الحلقة الرابعة - الجزء السابع.

الحلقة الرابعة - الجزء الثامن.

الحلقة الرابعة - الجزء التاسع.

الحلقة الرابعة - الجزء العاشر.

الحلقة الرابعة - الجزء الحادي عشر.

الحلقة الرابعة - الجزء الثاني عشر.

الحلقة الرابعة - الجزء الثالث عشر.

الحلقة الرابعة - الجزء الرابع عشر.

الحلقة الرابعة - الجزء الخامس عشر.

الحلقة الرابعة - الجزء السادس عشر.

الحلقة الرابعة - الجزء السابع عشر.

الحلقة الرابعة - الجزء الثامن عشر.

الحلقة الرابعة - الجزء التاسع عشر.

الحلقة الرابعة - الجزء العشرون و الأخير.

مرحبا بكم إخوتي الكرام في الجزء الأول من الحلقة الخامسة من سلسلة اختبر قدراتك, قمتُ بتقسيم الحلقة الخامسة إلى عدة أجزاء, مُرتبة حسب الصعوبة.

أجزاء هذه الحلقة ستكون خاصة بمتفرقات C/C++.

الإختبار الخامس (الجزء الأول) :

اكتب برنامج يُظهر بشكل عشوائي عددا معينا من النجوم, داخل مساحة مربع.

المستخدم هو من يحدد عدد النجوم, بالإضافة إلى طول و عرض المربع.

يجب أن يتحقق البرنامج من أن الطول و العرض ملائمين لأبعاد شاشة الــ Console. أيضا, يجب تفادي وجود عدة نجوم متناظرة.

مثال:

post-219439-040207800 1348050804_thumb.p

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

المرفقات
testCode.png

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 19 سبتمبر 2012 في 13:33 — السبب: إضافة المثال للتوضيح.

#2

سأضع الحل التقليدي لكي أستبعده من النقاش :

#include<time.h>
#include<stdio.h>
#include<windows.h>

int main() {
    char etoile = '*';
    HANDLE stdh = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD p;
    srand(time(NULL));
    for (int i = 1; i < 25; i++) {
        p.X = rand() % 20;
        p.Y = rand() % 10;
        SetConsoleCursorPosition(stdh, p);
        printf("%c ", etoile);
    }
    getchar();
    return 0;
}
#3

أرى أنك لم تقم بالتحقق من حجم النافذة ...

وأنا لم أقم بالتحقق ...والحل بسيط كما أرى ... إليك محاولتي ...

#include<iostream>
using namespace std;
#include<cstdlib>
main()
{
int a,b,c;
cin>>a>>b>>c;
for(int i=0;i<a;i++)
{
	for(int j=0;j<b;j++)
		if(rand()%5==1&&c)
			{
				c--;
				cout<<'*';
			}
		else cout<<' ';
	cout<<endl;
}
return 0;
}

وهذا الخرج لأحدى المحاولات:

 *    *  *     * * **                ** 
  *        ** *   **    * *             
  *    *    *   **       *     ** **    
  *  **    *  * *    *          *   *** 
    *        * *   * *     *         *  
*     *        *             *         *
    *   *  **    * *   *       *     * *
*      * *      **    * *  *        *   
**  *   *  *            **              
     * *       *        *   * *    * *  
      *          *   *          *  *    
*  *      *          *   *              
   *            * * *    **
#4

وهذا حل آخر ... (بدون تأكد من حجم الشاشة أيضاً )

#include<iostream>
using namespace std;
#include<cstdlib>
main()
{
int a,b,c;
cin>>a>>b>>c;
char *Screen=new char[a*b+1];
for(int i=0;i<a*b;i++)Screen=' ';Screen[a*b]=0;
while(c--)
	Screen[b*(rand()%a)+rand()%b]='*';
for(int i=0;i<a*b;i++)if(i%b!=0)cout<<Screen;else cout<<endl;
return 0;
}

وهذا الخرج :

     * **         *
 *     * *    * * *
  * * * ***    * * 
     *   **   *** *
*  *  **     ** ***
    * * **  *      
* * ** ** ***    * 
**  *  ** *** **   
   **  ** *   *    
** *  **   **  **
#5

السلام عليكم

الأبعاد القياسية لشاشة الكونسول هي 80x25 و بالتالي يمكننا تعريف الأبعاد كثوابت ماكرو و التعديل عليها لاحقاً إن لزم الأمر.

محاولتي : ( الكود مشروح بالتعليقات )

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* pour memset */
#include <time.h>
#define NY 25 /* nombre total de lignes de l'écran */
#define NX 80 /* nombre total de colonnes de l'écran */

int main() {
    int aleat(int); /* prototype fonction tirage aléatoire */
    int ny, /* nombre de lignes du rect. considéré */
            nx, /* nombre de col. du rect. considéré */
            ix, /* colonne courante */
            iy, /* ligne courante */
            nb_points, /* nombre de points à tirer */
            i, j;

    char ecran [NX] [NY]; /* image de l'écran */
    const char blanc = ' ', /* caractère de remplissage */
            point = '*'; /* représentation d'un point */

    /* entrée des dimensions du rectangle considéré ......
     * et du nombre de points souhaités */
    do {
        printf("combien de lignes : ");
        scanf("%d", &ny);
    } while (ny <= 0 || ny >= NY);
    do {
        printf("combien de colonnes : ");
        scanf("%d", &nx);
    } while (nx <= 0 || nx >= NX);
    do {
        printf("combien de points : ");
        scanf("%d", &nb_points);
    } while (nb_points > nx * ny || nb_points < 1);

    /* remplissage aléatoire du tableau image d'écran */
    memset(ecran, blanc, NX * NY);
    for (i = 1; i <= nb_points; i++) {
        do {
            ix = aleat(nx - 1);
            iy = aleat(ny - 1);
        } while (ecran [ix] [iy] != blanc);
        ecran [ix] [iy] = point;
    }

    /* affichage du tableau image d'écran */
    for (j = 0; j < ny; j++) {
        for (i = 0; i < nx; i++)putchar(ecran  [j]);
        printf("\n");
    }

    return 0;
}
/*******************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0,n] */

/*******************************************************/
int aleat(int n) {
    int i;
    static int prem = 1; /* drapeau premier appel */
    time_t date; /* pour l'argument de time */
    /* initialisation générateur au premier appel */
    if (prem) {
        srand(time(&date));
        prem = 0;
    }
    /* génération nombre aléatoire */
    i = rand() / (RAND_MAX + 1.) * (n + 1);
    return (i);
}

المُخرجات :

post-219439-020365300 1348173165_thumb.p

اقتباس
أرى أنك لم تقم بالتحقق من حجم النافذة ...

الحل التقليدي وضعته كمثال فقط, الفكرة الأساسية منه هي طريقة العرض باستخدام الدالة SetConsoleCursorPosition.

المرفقات
testCode.png
1

هذا الموضوع مغلق.

مواضيع مشابهة