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

urgent please

مغلق
بدأه نواسي في 28 أبريل 2005 · 5 رد · 695 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

alsalam alikum everyone,

i have this extra credit assignment On Fortran and i a not good at Fortran at all so can anybody please write a simple program in fortran to run the subroutine that i have below , as soon as u can guys i am in hurry:

// i Need a main program calling this subroutine

c A * B = C

> c matrix A and B must be of same length

> c element in matrix C = (element in row of A * element in

> column of B)+ sum

>

> c NColInBnC = # of columns in matrix B and C

> c NRowsInAnC = # of rows in A and C

> c NColInAnNRowsInB = # of columns in A and rows in B

>

> subroutine MultiMatAB (A,B,NColInBnC,NRowsInAnC,

> NColInAnNRowsInB)

> integer x,y,z,NColInBnC, NColInAnNRowsInB,

> NColInAnNRowsInB real*8 A(*,*),B(*,*),C(*,*)

>

> c The routine itself

> do z=1, NColInBnC

> do x=1, NRowsInAnC

> C(x,z) = 0.0

> do y=1, NColInAnNRowsInB

> C(x,z) = C(x,z) + A(x,y)*B(y,z)

> end do

> end do

> end do

> return

> end

#2
اقتباس
i a not good at Fortran at all so can anybody please write a simple program in fortran to run the subroutine that i have below , as soon as u can guys i am in hurry

sorry, we don't do homework for people!!! if you have some questions or need some help then we're more than happy to help you. but we won't do your homework for you.

#3

thank you for your fast response , ok can you lead me how to begin doing this program i mean like a c i could write

main(){

// call the function directly

}

but i can't made it in fortran becuase i never program in fortran

#4

انا نفسي لا أعرف الكثير عن fortran, و حتى لست متأكدا من طريقة استدعاء function من ملف مكتوب بلغة أخرى, و لكن بشكل عام:

اكتب تصريح الفنكشن بلغة السي (التصريح فقط)

مثلا, اعتقد في هذه الحالة فالفنكش هو:

int MultiMatAB (int, int, int, int);

التصريح هو فقط لاخبار الكومبايلر ان هذا الفنكشن موجود في ملف آخر (او حتى في هذا الملف), المهم ان يعرف الكومبايلر ان هذا الفنكشن موجود في مكان ما ليسمح لك باستخدامه.

و الان تستخدم الفنكشن بشكل عادي كأنه مكتوب بالسي.

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

الان نحتاج ان نربط ملفي السي و الفورتران ببعضهما البعض .. كيف نفعل ذلك؟

اظن اننا لا يمكننا فعل ذلك مباشرة لانهما مكتوبتين بلغتين مختلفتين .. و لكن:

اي كومبايلر في الدنيا لما يحول برنامج السي مثلا الى برنامج حقيقية, فإنه يحوله اولا الى ملف .o و هو مشابه للبرنامج الحقيقي لكنه يحتاج لعملية ربط. مثلا لو كان لدينا عدة ملفات سي كلها تابع لمشروع واحد, فإن الكومبايلر يقوم اولا بتحويل كل ملف الى ملف .o ثم يقوم بربط هذه الملفات مع بعضها لينتج الملف النهائي exe.

الكومبايلر يفعل هذه الخطوات بشكل اوتوماتيكي,

ما علينا فعله هنا هو منعه من عمل ذلك: علينا اخباره ان يحول الملف الى ملف .o فقط ..

نعمل هذه الخطوة في ملف الفورتران و ملف السي, ثم بعد ذلك نقوم باستخدام linker لربط ملفات الـ .o و تحويلها الى ملف .exe

كيف نفعل ذلك؟ يعتمد هذا على الكومبايلر المستخدم, و ركن اظن ان الطريقة متشاهبة في معظم الكومبايلرات.

اظن ان الطريقة بشكل عام هي هكذا:

لتحويل ملف السي الى .o نقوم باستدعاء الكوبمايلر على الملف و نضع الخيار -c و طبعا سيكون علينا استخدام سطر الاوامر و كتابة الاوامر يدويا.

مثلا:

>gcc main.c -c

لست متأكدا من مدى صحة هذا الأمر, لكن حسب ما أظن فانه سيقوم بترجمة الملف main.c الى main.o

نقوم بعمل نفس الخطوة على ملف الفورتران .. طبعا لا اعرف اي كومبايلر للفورتران ولا شي, و لكن لنفرض ان اسم الملف هو mat.fortran و ان الكومبايلر اسمه gfc او شي من هذا القبيل ..

>gfc mat.fortran -c

و سنحصل على mat.o

الان نحتاج الى ربط هذين الملفين .. أعتقد ان اي كومبايلر يستطيع القيام بهذه العملية لانه ملفات .o مكتوبة بلغة الآلة, يعني لا يهم اي كومبايلر نستخدم (و هذا هو ظني فقط, لست متأكدا من صحته)

اظن ان كل ما علينا القيام به هو استدعاء الكومبايلر و اعطاءه ملفات .o كبارامترات ..

>gcc main.o mat.o

و نستطيع تحديد اسم معين للملف الناتج عن طريق الخيار -o

>gcc main.o mat.o -o program.exe

قد تكون لدي اخطاء في بعض التفاصيل (مثل تفاصيل استخدام الكومبايلر) لكن حسب ما أظن فان الخطوات بشكل عام صحيحة.

و الله أعلم

#5

لسلام عليكم

هذا الشكل العام لبرنامج بالفورتران

PROGRAM prog_name

      EXTERNAL function_name
     
      REAL      !---|
                !   |----> variable declaration
      INTEGER   !---|
      
     !---------|
     !---------|------> programe body
     !---------|
  
      END PROGRAM


      FUNCTION function_name(arg1,arg2,.....)
      .
   .
   .
   
      END function_name

      SUBROUTINE sub_name (arg1,arg2,.....)
   .
   .
   .
   
      END SUBROUTINE
END PROGRAM

وأنظر إلى البرنامج في هذا الرابط

/index.php?showtopic=64114

تم تعديل هذه المشاركة بواسطة the smart programmer في 28 أبريل 2005 في 13:54

#6

i wrote this after multiple try can you lead me with my mistakes

PROGRAM assignment

      EXTERNAL MultiMatAB
     
      real  NCollnBnC,NRowsInAnC;                   
      Float A,B;  
      
      Printf(“enter NcollnBnC,NRowsInAnC”,& NCollnBnC,&NRowsInAnC );
      Printf(“Enter A,B”,&A,&B);
      Scanf(%2d%2d%2f%2f,& NcollnBnC,& NRowsInAnC,&A,&B);
    Subroutine.MultiMatAB (A,B,NColInBnC,NRowsInAnC); 
  
      Printf(A,B,NCollnBnC,NRowsInAnC);
       
      END PROGRAM


      c A * B = C
 c matrix A and B must be of same length >
 c element in matrix C = (element in row of A * element in >
 column of  > + sum
>
 c NColInBnC = # of columns in matrix B and C >
 c NRowsInAnC = # of rows in A and C >
 c NColInAnNRowsInB = # of columns in A and rows in B >
>
 ,subroutine MultiMatAB (A,B,NColInBnC,NRowsInAnC >
 )NColInAnNRowsInB >
 ,integer x,y,z,NColInBnC, NColInAnNRowsInB >
 (*,*)NColInAnNRowsInB real*8 A(*,*),B(*,*),C >
>
 c The routine itself >
 do z=1, NColInBnC >
     do x=1, NRowsInAnC >
             C(x,z) = 0.0 >
         do y=1, NColInAnNRowsInB >
 )                  C(x,z) = C(x,z) + A(x,y)*B(y,z >
         end do >
     end do >
 end do >
 return >

   
      END SUBROUTINE
END assignment

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

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