ahmed.o.mohamed

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

6 ردود في هذا الموضوع

السلام عليكم

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

مثال:

post-219439-040207800 1348050804_thumb.p

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

تم تعديل بواسطه أحمد الشنقيطي
إضافة المثال للتوضيح.
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

#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;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

#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;
}

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

 *    *  *     * * **                ** 
* ** * ** * *
* * * ** * ** **
* ** * * * * * ***
* * * * * * *
* * * * *
* * ** * * * * * *
* * * ** * * * *
** * * * **
* * * * * * * *
* * * * *
* * * * *
* * * * **

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

#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[i]=' ';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[i];else cout<<endl;
return 0;
}

وهذا الخرج :

     * **         *
* * * * * *
* * * *** * *
* ** *** *
* * ** ** ***
* * ** *
* * ** ** *** *
** * ** *** **
** ** * *
** * ** ** **

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الأبعاد القياسية لشاشة الكونسول هي 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 [i] [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.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تم منح النقاط للمشاركات المفيدة.

يُغلق.

أراكم في الجزء الثاني من الحلقة الخامسة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .