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

ممكن مساعده في برنامج يحسب معادله رياضيه ؟

بدأه FunnyWolF في 18 أغسطس 2009 · 4 رد · 867 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

انا عندي كود يقوم بحساب المعادله الرياضيه التاليه

img4.png

والكود هو التالي


<pre>#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFFSIZE 50

int parse_args(int argc, char *argv[ ], int *np){
if ( (argc != 2) || ((*np = atoi (argv[1])) <= 0) ) {
fprintf (stderr, "Usage: %s nprocs\n", argv[0]);
return(-1); };
return(0);
}

int make_trivial_ring(){
int fd[2];
if (pipe (fd) == -1)
return(-1);
if ((dup2(fd[0], STDIN_FILENO) == -1) ||
(dup2(fd[1], STDOUT_FILENO) == -1))
return(-2);
if ((close(fd[0]) == -1) || (close(fd[1]) == -1))
return(-3);
return(0);
}

int add_new_node(int *pid){
int fd[2];
if (pipe(fd) == -1)
return(-1);
if ((*pid = fork()) == -1)
return(-2);
if(*pid > 0 && dup2(fd[1], STDOUT_FILENO) < 0)
return(-3);
if (*pid == 0 && dup2(fd[0], STDIN_FILENO) < 0)
return(-4);
if ((close(fd[0]) == -1) || (close(fd[1]) == -1))
return(-5);
return(0);
}
void get_integers(char buff[], long *first, long *second){
char* token = NULL;
if((first == NULL) || (second == NULL)) return;
if(read(STDIN_FILENO, buff, BUFFSIZE) > 0){
*first = atol((((token = strtok(buff," ")) == NULL) ? "0" : token));
*second = atol((((token = strtok(NULL," ")) == NULL) ? "0" : token));
} else {
*first = 0;
*second = 0;
}
}

void safe_sum(long first, long *second, long *third){
if((second == NULL) || third == NULL) return;
*third = first + *second;
if(*third < 0){
fprintf(stderr,
"Overflow detected: %ld + %ld != %ld\n",
first, *second, *third);
*third = 0;
*second = 0; };
}

int send_numbers(char buff[], long num1, long num2){
int bytes, len;
sprintf(buff, "%ld %ld", num1, num2);
len = strlen(buff) + 1;
if((bytes = write(STDOUT_FILENO, buff, len)) != len){
fprintf(stderr,
"Write of %d bytes failed, only sent %d bytes\n",
len, bytes);
return -1;
} else {
return bytes;
}
}

void report_sum(int i, long first, long old_second, long second, long third){
fprintf(stderr,
"\nProcess %d with PID %d and parent PID %d recieved %ld %ld and sent %ld %ld.\n",
i, (int)getpid(), (int)getppid(), first, old_second, second, third);
}

int main(int argc, char *argv[]){
int i;
int childpid;
int nprocs;
char buff[BUFFSIZE];
long first;
long second;
long third;
if(parse_args(argc,argv,&nprocs) < 0) exit(EXIT_FAILURE);
if(make_trivial_ring() < 0){
perror("Could not make trivial ring");
exit(EXIT_FAILURE); };
for (i = 1; i < nprocs; i++) {
if(add_new_node(&childpid) < 0){
perror("Could not add new node to ring");
exit(EXIT_FAILURE); };
if (childpid) break; };
{
/* ring process code */
long old_second;
if(i == 1){
/* mother of all processes */
send_numbers(buff, 1,1); }
/* all processes */
get_integers(buff, &first, &second);
old_second = second;
safe_sum(first,&second,&third);
if(i > 1){
send_numbers(buff, second, third);
report_sum( i, first, old_second, second, third); }
else {
fprintf(stderr,"\n\nfibonacci(%d) = %ld\n\n", nprocs, second); }
exit(EXIT_SUCCESS);
}
} /* end of main program here */

</pre>

طبعا الكود طويل جدا لأنو معمول بطريقة الفنكشن و و و .... وبرضو فيه احتماليات الخطا

لكن انا حاولت اعدل الكود السابق ليقوم بحساب المعادله التاليه

f(n) = 1, n=1,2,3

= f(n-1)*f(n-2)+f(n-3), n>3

وهذا شغلي الى الان لكن بدون نتيجه !!!!!!

	 
   #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <string.h>
   #define BUFFSIZE 50
   int parse_args(int argc,  char *argv[ ], int *np){
	 if ( (argc != 2) || ((*np = atoi (argv[1])) <= 0) ) {
	   fprintf (stderr, "Usage: %s nprocs\n", argv[0]);
	   return(-1); };
	 return(0); 
   }
   int make_trivial_ring(){   
	 int   fd[2];
	 if (pipe (fd) == -1) 
	   return(-1); 
	 if ((dup2(fd[0], STDIN_FILENO) == -1) ||
		 (dup2(fd[1], STDOUT_FILENO) == -1)) 
	   return(-2); 
	 if ((close(fd[0]) == -1) || (close(fd[1]) == -1))   
	   return(-3); 
	 return(0); 
   }
   int add_new_node(int *pid){
	 int fd[2];
	 if (pipe(fd) == -1) 
	   return(-1); 
	 if ((*pid = fork()) == -1)
	   return(-2); 
	 if(*pid > 0 && dup2(fd[1], STDOUT_FILENO) < 0)
	   return(-3); 
	 if (*pid == 0 && dup2(fd[0], STDIN_FILENO) < 0)
	   return(-4); 
	 if ((close(fd[0]) == -1) || (close(fd[1]) == -1)) 
	   return(-5);
	 return(0);
   }
   void get_integers(char buff[], long *first, long *second, long *fourth){
	 char* token = NULL;
	 if((first == NULL) || (second == NULL) || (fourth == NULL )) return;
	 if(read(STDIN_FILENO, buff, BUFFSIZE) > 0){
	   *first  = atol((((token = strtok(buff," ")) == NULL) ? "0" : token));
	   *second = atol((((token = strtok(NULL," ")) == NULL) ? "0" : token));
	   *fourth = atol((((token = strtok(NULL," ")) == NULL) ? "0" : token)); 
	 } else {
	   *first = 0;
	   *second = 0;
	   *fourth = 0;
	 }
   }
   void safe_sum(long first, long *second, long *third, long *fourth){
	 if((second == NULL) || third == NULL || fourth == NULL ) return;
	 *third = first * *second + *fourth;
	 if(*third < 0){
	   fprintf(stderr, 
			   "Overflow detected: %ld * %ld + %ld!= %ld\n",
			   first, *second, *fourth, *third);
	   *third   = 0;
	   *second  = 0;
	   *fourth = 0; };
   }
   int send_numbers(char buff[], long num1, long num2, long num3){
	 int bytes, len;
	 sprintf(buff, "%ld %ld %ld", num1, num2, num3);
	 len = strlen(buff) + 1;
	 if((bytes = write(STDOUT_FILENO, buff, len)) != len){
	   fprintf(stderr, 
			   "Write of %d bytes failed, only sent %d bytes\n",
			   len, bytes);
	   return -1; 
	 } else {
	   return bytes;
	 }
   }

   void report_sum(int i, long first, long old_second, long second, long third, long fourth){
	 fprintf(stderr,
			 "\nProcess %d with PID %d and parent PID %d recieved %ld %ld and sent %ld %ld %ld.\n",
			 i, (int)getpid(), (int)getppid(), first, old_second, second, third, fourth); 
   }
   int main(int argc,  char *argv[]){
	  int	i;
	  int	childpid;
	  int	nprocs;
	  char   buff[BUFFSIZE];
	  long   first;
	  long   second;
	  long   third;
	  long	  fourth;
	  if(parse_args(argc,argv,&nprocs) < 1) exit(EXIT_FAILURE); //I changed the zero to one
		 if(make_trivial_ring() < 1){							//I changed the zero to one
		perror("Could not make trivial ring");
		exit(EXIT_FAILURE); };
	  for (i = 1; i < nprocs;  i++) {
		if(add_new_node(&childpid) < 1){						//I changed the zero to one
		  perror("Could not add new node to ring");
		  exit(EXIT_FAILURE); };
		if (childpid) break; };
	  {
		/* ring process code  */	 
		long old_second;
		if(i == 1 /*|| i == 2 || i = 3 */   ){
		  /* mother of all processes */
		  send_numbers(buff, 1,1,1); }		//whats going on here ? 
		/* all processes	 */
		get_integers(buff, &first, &second, &fourth);
		old_second = second;
		safe_sum(first,&second,&third,&fourth);
		if(i > 3){									 //I changed the 1 to 3
			   send_numbers(buff, second, third, fourth);
		  report_sum( i, first, old_second, second, third, fourth); }
		else {
		  fprintf(stderr,"\n\nfibonacci(%d) = %ld\n\n", nprocs, second); }
		exit(EXIT_SUCCESS); 
	  }
   }	 /* end of main program here */

طبقا طريقة عمل البرنامج انك تكتب اسمو وبعدين مسافه وتحط قيمة الارجيومنت, مثال

>>> calculate 5

فأتمنى من اهل الخبره يساعدونا

وتحياتي للجميع

#2

هل هذا الكود يؤدي المطلوب؟.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. int fib( int number )
  6. {
  7.  
  8.  
  9.  
  10. return (number==0)?0:((number==1)?1: (fib( number - 1 ) + fib( number - 2 )));
  11. }
  12.  
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16. int h;
  17.  
  18.  
  19. h=atoi(argv[1]);
  20. printf("%d",fib(h));
  21.  
  22. return 0;
  23. }
  24.  
  25.  
  26.  
  27.  
  28.  

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 18 أغسطس 2009 في 17:13

tvquran_6.gif

#3

في الحل وضعت الدالة على التعريف هذا التعرف

عدل الدالة الي :

  1. int fib( int number )
  2. {
  3. return (number<2)?1:fib( number - 1 ) + fib( number - 2 );
  4. }
  5.  

حسب التعرف المعطى في السؤال

tvquran_6.gif

#4

البرنامج ما يأدي الغرض, لكن شاكر تعاونك

المعادله هذه لازم لحلها تستخدم ال Processes Ring او Token Rings لانو في حالة ادخلت رقم اكبر من ثلاثه راح يقوم بعمليات حسابيه كثيره

لكنها ما تبان في الاعداد ما بين الاربعه والثمانيه , لكن مابين الثمانيه واكبر .... تبدأ تحس بالعمليات الحسابيه اللي قاعده تصير

وعلى فكره .... السستم يعلق اذا كانت القيمه مابين التسعين واكبر

عشان كذا البرنامج طويــــــــــــــــــل وفيه رسايل خطأ وكل شي تفاديا لذلك

لكن حل المعادله لازم يكون بنفس الطريقه المرفقه

ومشكور على محاولاتك, بس كيف بالله عليك ..... مو برنامج يلحس المخ

خخخخخخخ

انا شغال احاول واتمنى احد كمان يجد طريقة ما

تحياتي لك

#5

هذا السؤال إن شاء الله يكون سهل وسوف أعمل لك بطريقة Recursion ( الاستدعاء الذاتي ) وارجوا من يجد فيه اي خطأ يقوم بالتعديل فيه

#include <stdio.h>
#include<conio.h>
int fib( int m )
{
   if (m<2)
	   return(1);
   else
		 return(fib(m-1) + fib(m-2));
}

void main()
{
clrscr();
int i,n;	
	printf(" Enter the number (n) : ");
	scanf("%d",&n);
	i=fib(n);
	printf(" The number =%d -----> The fibnacci =%d",n,i);
getch();
}

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…