אלגוריתם לפתירת משוואה ריבועית (תודה לכולם!!!!!!!!) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


bykeking

Recommended Posts

זה הסקריפט (כן, אני יודע שזה לא יפתור משוואה שבה -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ים במקום(קוד יותר יפה).

קישור לתוכן
שתף באתרים אחרים

שורש של מספר שלילי מוגדר רק במספרים הקומפלקסים, לא בממשיים. לכן, אם זה קטן מ- 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;
}

קישור לתוכן
שתף באתרים אחרים

למה אתה חושב ככה? הרי זה 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++ תחת סביבת , וזה יכול לגרום להרבה צרות (מה גם שיש לו תקן משלו, שיש הבדלים בינו לבין התקן של 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++ תחת סביבת , וזה יכול לגרום להרבה צרות (מה גם שיש לו תקן משלו, שיש הבדלים בינו לבין התקן של 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:

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...