11

مسألة برمجية للتدريب !

  • Rashadoo

لديك عدد n من flash drives ولديك ملف حجمه size , قم بكتابة برنامج يقرأ عدد الفلاشات التي تملكها , ثم يقرأ حجم الملف , ثم يقرأ حجم كل فلاشة , ويجد اقل عدد ممكن من الفلاشات التي اذا دمجتها اتسعت للملف 0.o

مثال :

ادخل عدد فلاشات 3

ادخل حجم الملف : 6

ادخل حجم الفلاشة الاولى : 2

ادخل حجم الفلاشة الثانية : 3

ادخل حجم الفلاشة الثالثة : 2

الخرج سيكون 3


مثال ثاني :

ادخل عدد فلاشات 4

ادخل حجم الملف : 10

ادخل حجم الفلاشة الاولى : 8

ادخل حجم الفلاشة الثانية : 2

ادخل حجم الفلاشة الثالثة : 2

ادخل حجم الفلاشة الرابعة: 3

الخرج سيكون 2


مثال أخير :

ادخل عدد الفلاشات 2

حجم الملف : 5

الاولى : 1

الثانية : 5

الخرج : 1


على اعتبار انه دائما الفلاشات بتقوم بإتساع الملف

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

على استعجال، هذا هو الحل بلغة السي:

#include<stdio.h>
#include<stdlib.h>
#define numflash "عدد الفلاشات: "
#define filesize "حجم الملف: "
#define flashsize "حجم الفلاش الـ %i: "
#define matlob "عدد الفلاشات المطلوب: %i\n"

int main (void){
    printf(numflash);
    int sizefi=0,numfl=0,mysize=0;
    scanf("%i",&numfl);
    int *psizefl=calloc(numfl,sizeof(int)),*psizefl2=calloc(numfl,sizeof(int));
    printf(filesize);
    scanf("%i",&sizefi);
    for(int i=1;i<=numfl;i++){
        printf(flashsize,i);
        scanf("%i",&psizefl[i-1]);
    }
    for(int i=0;i<numfl;i++){
        int pig=0,npig=0;
        for(int j=0;j<numfl;j++){
            if(pig<psizefl[j]){
                pig=psizefl[j];
                npig=j;
            }
        }
        psizefl2[i]=psizefl[npig];
        psizefl[npig]=0;
    }
    for(int i=0;i<numfl;i++){
        if ((mysize+=psizefl2[i])>=sizefi){
            printf(matlob,i+1);
            break;
        }
    }
    free(psizefl);
    free(psizefl2);
    return 0;
}

الحل صحيح , يبدو انك لم تجرب الكود حتى O.o لانه لا يمكن ان تعرف int داخل حلقة for في هذه اللغة , او اعتقد ان الكومبايلر خاصتي لا يقرأها

mujahid أضف ردا

لقد جربتها، وقد عملت عندي.

يبدوا أنك لم تحدد للمترجم أن البرنامج حسب معايير سي99. فظني أن المترجم رفض حلقة for من أصلها، وليس المتغير داخلها.

Binwa أضف ردا

البرنامج بلغة ال C# .. ولأني لا اعلم داله الترتيب التنازلي للعناصر .. فطلبت من المستخدم ادخال العناصر تنازليا .

رجاء اخبروني برأيكم

class Program
{
    static void Main(string[] args)
    {
        int NumOfDrives, SizeOfFile;
        List<int> SizeOfDrives = new List<int>();


        Console.WriteLine("Enter The Size Of File :");
        SizeOfFile = int.Parse(Console.ReadLine());
        Console.WriteLine("Enter The Number Of Drives :");
        NumOfDrives = int.Parse(Console.ReadLine());
        Console.WriteLine("**Pliz Enter Sizes in Descending Order**");

        for (int i = 1; i <= NumOfDrives; i++)
        {
        Console.WriteLine("Enter The Drives Size Num "+i+" :" );
        int x = int.Parse(Console.ReadLine());
        SizeOfDrives.Add(x);
        SizeOfDrives.Sum();
        if (SizeOfFile <= SizeOfDrives.Sum())
        {
        Console.WriteLine("---------------------------------");
        Console.WriteLine("The Number Of Drives To Use: " + i);
        break;
        }
        }

        if (SizeOfFile >= SizeOfDrives.Sum())
        {
        Console.WriteLine("---------------------------------");
        Console.WriteLine("The Drives Size Not Enough !");
        }

        Console.ReadKey();
    }
}

}

لا يمكنني تجريبها لا مالك كومبايلر سي شارب , اتمنى ان تكون صحيحة , المهم انك حاولت

انا جربتها يا اخي ع امثلتك و اشتغل البرنامج جيدا :)

تطبيق على المثال الثاني ب الجافا سكربت 

جرب باقي الامثلة . .

الحل خاطئ D:

تخيل المثال الآتي لتعرف السبب :

عدد الفلاشات 4

حجم الملف 10

الفلاشة الاولى : 8 ==> container = 8

الثانية : 1 ==> container = 9

الثالثة : 1 ==> container = 10

هنا سيتوقف ال loop والخرج 3

لكن الفلاشة الرابعة : 9

اي انه يجب ان يكون الخرج 2 فقط , جرب على كودك وستكتشف هذا الخطأ

لقد عدلت الكود

جرب هل هو صحيح الآن ؟؟

هل تقصد تحويل الخوارزمية أعلاه إلى برنامج فعلي يقرأ سعة محركات الأقراص تلقائيا ثم يواصل باقي العمل، أم مجرد إدخال من قبل المستخدم؟

ادخال من قبل المستخدم

مسألة بسيطة جداً

حالي يعمل جيداً على الأمثلة التي قدمتها

cenrak أضف ردا

بالبايثون، البرنامج يعرض أقل عدد مطلوب لحفظ الملف، و أحد المتغيرات يحوي جميع الاحتمالات، solutions

size = 10      # حجم الملف
flash = [2,2,3,8]      # مصفوفة فيها مساحات الأقراص، لا يهم الترتيب

def traverse(l, sum, f):
    if sum >= size and f not in solutions:
        solutions.append(f)
        return
    if l:
        _tmp = l[0] + sum
        traverse(l[1:], _tmp, f + [l[0]])
        traverse(l[1:], sum, f)
        del l[0]

solutions = list()
traverse(flash, 0, [])
m = min([len(x) for x in solutions])
print("Needed drives: {drives}".format(drives=m))

للتجربة:

لغة ++C:

int n_fd=0, s_f=0, n_fd_n=0;
vector<int> sizes_drivers;


cout << "Enter flash drivers number: ";
cin >> n_fd;
cout << "Enter file size: ";
cin >> s_f;
for(int i=0,x=0;i++<n_fd;){
    cout << "Enter size for flash driver number[" << i << "]: ";
    cin >> x;
    sizes_drivers.push_back(x);
}
for(int i=0,x=0;i++<n_fd;){
    x+=sizes_drivers[i];
    if(x>=s_f){
        n_fd_n = i+1;
        break;
    }
}
cout << "You need " << n_fd_n << " flash drivers." << endl;

هذا الحل يتأثر خرجه، حسب ترتيب دخل أحجام الذواكر.

بسيطة سطرين.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    int n_fd=0, s_f=0, n_fd_n=0;
    vector<int> sizes_drivers;

    cout << "Enter flash drivers number: ";
    cin >> n_fd;
    cout << "Enter file size: ";
    cin >> s_f;
    for(int i=0,x=0;i++<n_fd;){
        cout << "Enter size for flash driver number[" << i << "]: ";
        cin >> x;
        sizes_drivers.push_back(x);
    }

    sort(sizes_drivers.begin(),sizes_drivers.end());

    for(int i=0,x=0;i++<n_fd;){
        x+=sizes_drivers[i];
        if(x>=s_f){
            n_fd_n = i+1;
            break;
        }
    }
    cout << "You need " << n_fd_n << " flash drivers." << endl;

    return 0;
}

بايثون 3

nbf=int(input("number of flash : "))
size=int(input("size of file : "))
t=[]
for i in range(nbf):
t=t+[int(input("size of flash N°"+str(i+1)+" "))]
t.sort()
t.reverse()

Stop=0
count=0
while(Stop<size):
    Stop+=t[count]
    count+=1;
print("number of flash needed : "+str(count))
AhmedSalahAssar أضف ردا

بالــ JavaScript


var flNumber = 0, fSize=0, flSize=[];

function printResult() {
   flSize.sort(function(a,b){return b-a});
   var total=0,flCount=0;
   while (total < fSize) {
     if (flCount < flSize.length) {
     total += parseInt(flSize[flCount]);
     flCount++;
     }else {
       break;
     }
   }
   if (total > fSize) {
     numResult.innerHTML = "أنت تحتاج عدد " + flCount + " من الفلاشات" ;
   }else {
      numResult.innerHTML = "لن تكفيك هذه الفلاشات . حجم الملف كبير" ;
   }
}

كما يقوم بأخبارك إذا لم تكفي الفلاشات