עבור לתוכן

אלגוריתם לפתירת משוואה ריבועית (תודה לכולם!!!!!!!!)

Featured Replies

פורסם

זה הסקריפט (כן, אני יודע שזה לא יפתור משוואה שבה -b+4ac יהיה שלילי זה פשוט מסובך ואין לי ממש מושג איך לעשות את זה.)

// 4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

#include <stdio.h>
#include <math.h>

int main()
{
int a, b, c;
int delta;
printf("please enter A, B, C: ");
scanf("%d%d%d", &a, &b, &c);


if (a == 0 && b == 0 && c != 0)
{
printf("there is no solution!\n");
return 0;
}

else if (a == 0 && b == 0 && c == 0)
{
printf("infinite number of solutions\n");
return 0;
}

else if( a == 0)
{
printf("x = %.2lf\n", (double) -c / b);
return 0;
}

delta = b*b - 4*a*c;

if(delta > 0)
{
printf("x1 = %.2lf\n", (-b + sqrt(delta))/(2*a));
printf("x2 = %.2lf\n", (-b - sqrt(delta))/(2*a));
return 0;
}
else if(delta == 0)
{
printf("x = %.2lf\n", (double) -b/(2*a));
return 0;
}
return 0;
}

יש בעייה בפקודה scanf ואין לי מושג למה. warning C4996: 'scanf' was declared deprecated

ויש גם בעייה ב sqrt וגם אין לי מושג למה. הרי כללתי את math.h זה אמור לעבוד לא? error C2668: 'sqrt' : ambiguous call to overloaded function

בבקשה תעזרו... זה יעזור לי בשיעורי בית :lol: :lol: :lol:

תודה! :xyxthumbs:

פורסם

קודם תוריד את זה:

// 4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

מה הבעיה לבדוק את b^2-4ac קטן מ- 0? זה IF פשוט(בתוכנית שלך אתה פשוט צריך להוסיף else ב- IF האחרון.

הערה אחרונה: אתה לא צריך לרשום return 0 בכל תנאי. עדיף להשתמש בהרבה ELSEים והרבה IFים במקום(קוד יותר יפה).

פורסם
  • מחבר

זאת בעייה בגלל שb^2-4ac נמצא בשורש... ושורש של מספר שלילי זה מסובך... בכל מקרה, אתה יודע מה הטעויות בקוד?

פורסם

שורש של מספר שלילי מוגדר רק במספרים הקומפלקסים, לא בממשיים. לכן, אם זה קטן מ- 0 אתה יכול לטעון שאיין פתרון ממשי למשוואה(אך בטוח קיימים 2 פתרונות קומפלקסיים).

ניסית לבצע את השינויים שאמרתי?

פורסם
  • מחבר

אני יודע שאלו לא פיתרונות במיספרים ממשיים, לכן אני לא כולל אותם... נראה לי שאני אוסיף איזה שורה שאם זה קטן מ-0 אז לכתוב שאין פיתרון ממשי או משהו כזה.

לא בדיוק הבנתי איזה שינויים לעשות? אני כותב reaturn בכל תנאי כי אני רוצה שאחרי פתירת המשוואה זה למעשה יסגור את התוכנה. אבל לא הבנתי מה לעשות בקשר לIf ו else? :kopfpatsch:

תודה רבה! :yelclap:

פורסם

תגיד, למה אתה עובד עם מספרים שלמים?

נראה לי ש- sqrt נותן לך הודעת שגיאה כי הוא לא יודע אם להמיר את הפרמטר שאתה מעביר לו ל- float או ל- double.

scanf היא deprecated בקומפיילר של VC2005, כי היא "לא בטוחה" לשימוש (בהיבטי buffer overflow)

במקרה שלך אתה יכול להתעלם מההודעה (כי אתה לא קורא לתוך buffer).

אם אתה ממש רוצה, אז יש גרסא של הפונקציה שהיא כן בטוחה, אבל לא תתקמפל לך על רוב הקומפיילרים האחרים.

עוד דבר - אם השתמשת ב- wizard של VC כדי ליצור את הקובץ, אז הפונקציה הראשית שלך צריכה להיות זו שהוא יצר בשבילך

int _tmain(int argc, _TCHAR* argv[])

ולא int main()

פורסם
  • מחבר

תודה! שניתי את הפרמטרים a, b ,c ו- delta לdouble. עכשיו אני מקבל רק את ההודעה על scanf ועל sqrt וה-build log מראה שזה לא הצליח :pissed::bash: :bash: אין לי מושג למה?!!!

בבקשה תעזרו לי... אין לי מושג למה זה לא עובד...

עריכה: הנה הסקריפט:

// 4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"



int _tmain(int argc, _TCHAR* argv[])
{

double a, b, c;
double delta;
printf("please enter A, B, C: ");
scanf("%d%d%d", &a, &b, &c);

if (a == 0 && b == 0 && c != 0)
{
printf("there is no solution!\n");
return 0;
}

else if (a == 0 && b == 0 && c == 0)
{
printf("infinite number of solutions\n");
return 0;
}

else if( a == 0)
{
printf("x = %.2lf\n", (double) -c / b);
return 0;
}

delta = b*b - 4*a*c;

if(delta > 0)
{
printf("x1 = %.2lf\n", (-b + sqrt(delta))/(2*a));
printf("x2 = %.2lf\n", (-b - sqrt(delta))/(2*a));
return 0;
}
else if(delta == 0)
{
printf("x = %.2lf\n", (double) -b/(2*a));
return 0;
}
return 0;
}

#include <stdio.h>
#include <math.h>

הוא אומר שכל השגיעות הן ב math.h בגלל sqrt... :nixweiss:

עריכה חדשה:!!!

אני חושב שזה עובד!!

הסקריפט הנכון כולל הערות:

// 4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

#include <stdio.h>
#include <math.h>

int main()
{
int a, b, c;
int delta;
printf("please enter A, B, C: ");
scanf("%d%d%d", &a, &b, &c);

/*are they any solution?*/
if (a == 0 && b == 0 && c != 0)
{
printf("there is no solution!\n");
return 0;
}
/*find the number of solutions*/
else if (a == 0 && b == 0 && c == 0)
{
printf("infinite number of solutions\n");
return 0;
}
/*simple equasion?*/
else if( a == 0)
{
printf("x = %.2lf\n", (double) -c / b);
return 0;
}
/*find delta*/
delta = b*b - 4*a*c;
/*if delta is positive there two solutions*/
if(delta > 0)
{
printf("x1 = %.2lf\n", (-b + sqrt((double)delta))/(2*a));
printf("x2 = %.2lf\n", (-b - sqrt((double)delta))/(2*a));
return 0;
}
/*if delta is 0 there is one solution*/
else if(delta == 0)
{
printf("x = %.2lf\n", (double) -b/(2*a));
return 0;
}
return 0;
}

פורסם

יש לי רושם שכאשר יש לך פיתרון בודד ו- b לא מתחלק ב- 2a אתה תקבל תוצאה שגויה.

(יכול להיות שאני טועה, אני אף פעם לא זוכר אם חילוק נעשה לפני casting)

פורסם
  • מחבר

למה אתה חושב ככה? הרי זה double

עוד דבר, כשאני משנה את A B ו- C ל DOUBLE זה יוצר תקלה ואין לי מושג למה... :nixweiss: יש לך מושג מה יכול לגרום לזה?

אני צריך עוד לעבוד על הסקריפט... בסה"כ התחלתי ללמוד C לפני שלושה ימים וזאת השפה הראשונה שאני לומד.

casting = כינוס איברים?

תודה רבה על העזרה! :xyxthumbs:

פורסם

1) CASTING = שינוי סוג.

יש CASTINGמכוון, לדוגמא:

(double)d

או לא מכוון שאתה נותן לקומפיילר להניח שהוא אמור לבצע CASTING(אתה מקבל שגיאה על זה).

2) מה הבעיה שאתה מקבל?

3) הפתרון הראשון ששלחת לפני 2 הודעות הוא נכון. אתה צריך רק להעביר את הINCLUDE למעלה(של הSTDIO והMATH).

הפונ SQRT מוצהרת בספריה MATH. אתה חייב להצהיר עליה לפני שאתה משתמש בה.

פורסם
  • מחבר

1) תודה, שכחתי איך קוראים לזה.

2) כשאני משנה את הפרמטרים A, B ו-C לdouble זה יוצר שתי הזהרות חדשות: warning LNK4067: ambiguous entry point; selected 'mainCRTStartup

ואת הזהרה על scanf. (שאיך שהוא הצלחתי להעלים כשהפרמטרים היו int).

3) בקשר לinclude, שיניתי את זה כבר קודם, בפתרון השני...

תודה רבה!

פורסם

ambiguous entry point אומר שכנראה יש לך שתי פונקציות main איפשהו (כנראה הפונקציה main והפונקציה _tmain)

לצערי אני לא מספיק מכיר טוב את VC כדי לדעת מה בדיוק הפתרון.

חוץ מזה, שני דברים:

1. אם אתה רק מתחיל ללמוד C, אל תעבוד ב-Visual. תוריד קומפיילר מבוסס דוס (כגון Borland C) ותעבוד איתו. הסיבה לכך היא ש-Visual נועד לעבוד ב-C++ תחת סביבת Windows, וזה יכול לגרום להרבה צרות (מה גם שיש לו תקן משלו, שיש הבדלים בינו לבין התקן של C).

2. לא קוראים לזה סקריפט, קוראים לזה קוד. סתם הציק לי שאתה קורא לזה סקריפט :)

פורסם

האמת ש- VC2005 הוא כבר הרבה יותר סטנדרטי מאשר Borland C (וכולל תוספות ושינויים מלפני 10 שנים בערך)

Ambiguous זה בדיוק העניין שיש לך שתי פונקציות main. כמו שאמרתי קודם - תעתיק את התוכן של main לתוך tmain ותמחוק את main.

הסיבה שנראה לי שאתה לא מקבל פתרון בודד נכון היא שנראה לי שה- casting קורה אחרי הפעולות האריתמטיות.

תנסה לתת לו לפתור את

4x^2 - 4x +1

ותראה אם יוצא נכון.

פורסם
  • מחבר

ambiguous entry point אומר שכנראה יש לך שתי פונקציות main איפשהו (כנראה הפונקציה main והפונקציה _tmain)

לצערי אני לא מספיק מכיר טוב את VC כדי לדעת מה בדיוק הפתרון.

חוץ מזה, שני דברים:

1. אם אתה רק מתחיל ללמוד C, אל תעבוד ב-Visual. תוריד קומפיילר מבוסס דוס (כגון Borland C) ותעבוד איתו. הסיבה לכך היא ש-Visual נועד לעבוד ב-C++ תחת סביבת Windows, וזה יכול לגרום להרבה צרות (מה גם שיש לו תקן משלו, שיש הבדלים בינו לבין התקן של C).

2. לא קוראים לזה סקריפט, קוראים לזה קוד. סתם הציק לי שאתה קורא לזה סקריפט :)

מה שמוזר ב- ambigous entry poin זה שזה קרה רק אחרי ששיניתי את A, B, C ו- delta לדאבל במקום int. אבל זה בסדר עכשיו... :cool2:

1) הרבה יותר נוח לי לעבוד ב-VC... לא יודע, אולי אני יעבור לבורלנד.

2) :-X תודה!

אני ינסה את 4x^2 - 4x +1... תודה!

עכשיו יש רק בעייה אחת. שיניתי את הפרמטרים לדאבל אבל יש רק אזהרה על scanf. :bash: אין לי מושג למה זה עושה את זה... זה נעלם כאשר הפרמטרים הם int.

חוץ מהאזהרה הזו אין שום בעיות אז אני אשמח אם למישהו יש רעיון ;D

תודה רבה!! :xyxthumbs::yelclap:

פורסם

עשית %f?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים