עזרה בC++

srn007

New member
עזרה בC++

התחלתי לללמוד את השפה הזאת וקיבלתי כמה שאלות לבית, פתרתי את כולן חוץ מאחת שלא הבנתי בדיוק איך אני עושה אותה.
זאת השאלה:
כתבו תכנית אשר קולטת סדרת מספרים(מעל 5 מספרים ,תקבעו את זה מראש) ולבסוף מדפיסה כמה מספרים חיוביים היו בסדרה וכמה מספרים שליליים היו בסדרה.
לדוגמא:
אם סדרת הקלט נראית כך:
1 2 -4 9 -100 -1 44 94 21 93 -9 0 -1 0 0 1 0 0 1 0 0 0 0 3
אזי התכנית צריכה להדפיס את הפלט הבא:
There were 10 positive numbers and 5 negative numbers.

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

למישהו יש רעיון לתת לי??

תודה מראש
 

פרסאוס

New member
או שתקלוט מספר מספר

או שתקלוט את כולם כמחרוזת ואז תפרק. מי שמתחיל ב - הוא שלילי.
 

BravoMan

Active member
כמה רמזים קטנים:

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

srn007

New member
אפשר עוד כמה רמזים כאלה ??

אני חדש בזה, אז זה קצת בעייתי בשבילי.
 

BravoMan

Active member
מה בדיוק בעייתי?

אם נפתור לך את השאלה זה לא יקדם אותך לשום מקום, ולא נהוג לעשות זאת בפורום.

קשה לענות לשאלה לא ממוקדת כמו שלך במשהו שהוא לא הפתרון עצמו.
אז, במה בדיוק אתה מתקשה?

לקלוט מספר?
לבדוק אם הוא חיובי או שלילי?
לספור פעולות?
לבצע פעולות בלולאה?
 

BravoMan

Active member
תתחיל כמו כל תרגיל אחר בתיכנות:

תפרק את השאלה לשלבים שיש לבצע, ורשום כל שלב בעברית.

למשל ככה:

1. קלוט מספר.
2. בדוק האם המספר חיובי - אם כן, תגדיל כמות מספרים חיוביים באחד.
3. בדוק אם המספר הוא שלילי - אם כן, תגדיל כמות מספרים שליליים באחד.
4. כל עוד לא קלטת את כל המספרים שרצית לקלוט חזור על שלבים 1 עד 3 עבור המספר הבא.
5. הדפס את הכמויות של המספרים השליליים והחיוביים.

עכשיו האם אתה יודע ממה להתחיל?
 

srn007

New member
פתרתי את זה ככה:

תודה על העזרה,
אבל יש אולי דרך יותר קצרה לעשות את זה??


void main()
{
int a,b,c,d,e,f,g,positive=0,negative=0;

printf("Plz enter 7 numbers:");
scanf("%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g);

if(a>=0)
{
positive = positive+1;
}
else if (a<0)
{
negative = negative+1;
}
if(b>=0)
{
positive = positive+1;
}
else if (b<0)
{
negative = negative+1;
}
if(c>=0)
{
positive = positive+1;
}
else if (c<0)
{
negative = negative+1;
}
if(d>=0)
{
positive = positive+1;
}
else if (d<0)
{
negative = negative+1;
}
if(e>=0)
{
positive = positive+1;
}
else if (e<0)
{
negative = negative+1;
}
if(f>=0)
{
positive = positive+1;
}
else if (f<0)
{
negative = negative+1;
}
if(g>=0)
{
positive = positive+1;
}
else if (g<0){
negative = negative+1; }


printf("\nThere were %d positive numbers and %d negative numbers\n",positive,negative);

}
 

BravoMan

Active member
תלוי:

האם למדת כבר לולאות, או שעוד לא?

אם לא למדת לולאות, התרגיל הזה לא ממש מתאים לך, והפתרון שכתבת הוא הכי טוב שתוכל לעשות.

אם למדת לולאות, וספציפית לולאת for, אז זה הזמן להשתמש בה.

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

הפרבולה

New member
התחלה

#include "stdafx.h"
#include "conio.h"

int numberOfPositive =0 ;
int numberOfNegative =0 ;

int _tmain(int argc, _TCHAR* argv[])
{
// TODO put here the main code
}


התוכנית כתובה בC++ ב VS.net
 

BravoMan

Active member
לא בדיוק ++C...

גם אם VS עדיין תומך ב-conio.h, ואאל"ט זה שריד היסטורי מתקופת Turbo C של Borland, הדרך לבצע פלט ב-++C היא עם iostreams מה שדורש include של iostream ככה:

#include <iostream>


בנוסף, אין שום צורך להשתמש במשתנים גלובליים לתרגיל הזה, ושימוש במשתנים כאלה שלא לצורך מאוד לא מומלץ.
זה הרגל רע ועושי גם לפגוע בציון (תלוי בנחה ומוסד לימודים כמובן).
 
איזו דוגמא גרועה נתת תוכנית ריקה של 5 שורות (לא כולל רווחים וסוגריים מסולסלים), שמתוכן 3 שורות כתובות בדיאלקט לא-סטנדרטי של השפה שהומצא עי מיקרוסופט ולא מוכר בשום סביבה אחרת. למה לדחוף ממש בכח דברים כאלו? אגב, VS תומך לחלוטין גם ב ++C סטנדרטי ללא ה"הרחבות" המגעילות.
 

הפרבולה

New member
זו בערך התוכנית שנותן ה wizard

של VS.net גרסה 5 לאפליקצית קונסול, אני משתמש בזה הרבה לכתיבת תוכניות קצרות לשימושים שונים וקצרים שאחרי זה אני בד"כ מוחק את התוכנית.

כשאני צריך לכתוב תוכנית בדיקה קצרה ( למשל בדיקת נוסחה \אלגוריתם מתמטי) אני מבקש מה wizard לפתוח לי אפלקיצה קונסול קצרה כזו, מוסיף את ה include המתאים + _getch בסוף שהחלון לא יסגר מיד, מקמפל ומריץ כדי לראות את החלון לוחץ על מקש מוודא שהתוכנית נגמרת, בשלב זה אני מרגיש שחצי מהעבודה נעשתה למרות שעוד לא כתבתי כמעט אף שורת קוד .


#include "stdafx.h"
#include "conio.h"
#include "math.h"

int _tmain(int argc, _TCHAR* argv[])
{
// TODO put here the main code
_getch();
}


לא ידוע למה התכוונת "בדיאלקט לא-סטנדרטי" אבל אני לא רואה בעיה לכתוב קוד בפורמט שמיקרוסופט המציאה, מדובר בחברה די מוכרת וגדולה בעולם.
 

BravoMan

Active member
זה לא קשור לחברה מוכרת או לא מוכרת.

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

כשלומדים שפה, צריך ללמוד שפה תקנית.

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

שים לב גם, שאתה מכליל קבצי כותר סטנדרטיים עם סימן "".
גרשיים אומרים לקומפיילר לחפש את הקובץ קודם כל בספריית הפרויקט.
כשאר מכלילים קובץ סטנדרטי, מומלץ להשתמש ב-<>.
לא רק שזה אומר לקומפיילר לחפש אותם תחילה בספריות ה-inclue הסטנדרטיות, אלא שזה גם מבהיר למי שקורא את הקוד שמדובר בקובץ חיצוני לפרויקט.

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

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

מומלץ מאוד ללמוד את השפה הזו, לפחות לרמה הבסיסית, אם יש לך צורך בכלים כאלה.

וכמובן שאין כמו shell טוב לאוטומציה.
אפילו MS הבינו את זה ויצרו את Power Shell. לא יודע איך הוא בהשוואה ל-bash ודומיו, אבל אם אתה כבר הקטע של MS, כדאי בהחלט שתכיר אותו.
 
זה לא קשור לגודל החברה או למידת ההכרה בה אתה נמצא בפורום "שפות תכנות" ועונה על שאלה בשפת התכנות ++C. זו שפה שיש לה תקן בינלאומי, והיא מוכרת ונתמכת על מגוון רחב של מערכות הפעלה וסביבות, שמיקרוסופט היא רק אחת מהן.

מיקרוסופט תומכת גם ב ++C תקני, וגם הוסיפה לשפה כל מיני שטויות שלה. זו שיטת עבודה ותיקה שלה, הם עשו אותו דבר ל HTML (ולכן עד היום יש אתרים שעובדים רק באקספלורר), הם ניסו לעשות את זה ל Java (וחטפו תביעה משפטית). ספציפית לדוגמא שלך, getch, stdafx, conio, _tmain ו TCHAR_ הם כולם לא חלק משפת ++C. מדוע לדחוף אותם בכח, כשאין בהם שום צורך בדוגמא שלך? אותה תוכנית בדיוק, בשפה תקנית, היתה נראית ככה:


#include <iostream>
#include <math.h>

int numberOfPositive =0 ;
int numberOfNegative =0 ;

int main(int argc, char *argv[])
{
// TODO
// getchar();
}


אותו דבר בדיוק, רק נתמך בכל קומפיילר, כולל VS, במקום רק VS. ייתכן שב VS תצטרך להיכנס להגדרות הפרוייקט ולסמן "not using precompiled headers" על מנת לא לקבל שגיאה שחסר stdafx.

ואגב, עצם זה שאתה לא רואה את הבעיה, היא בעיה בפני עצמה...
 

הפרבולה

New member
טוב נו למדתי עוד משהו

תמיד שהייתי צריך לכתוב תוכנית קטנה לאיזה test הפעלתי את ה wizard במוד של Consule application וזה מה שהוא נתן לי, ולא התווכחתי איתו (עם מיקרוסופט).
עכשיו פתחתי את ה wizard אבל אם האופציה empty project הוא יצר את כל קבצי הפרויקט אבל ללא קבצי cpp h , ביטלתי את ה precompiled headers , הוספתי קובץ cpp חדש והנה התוכנית הראשונה שלי ב ++C תיקני


#include <iostream>
#include <math.h>

int main(int argc, char *argv[])
{
printf("helo world \n");
getchar();
}

אגב הכנסתי את ה getchar כי בהרצה תחת debug סוגרת את החלון מיד בלעדיו.

את התוכניות "האמיתיות" כלומר אלו שהולכות ללקוחות אני כותב בסביבת win32 ו MFC
 

הפרבולה

New member
לא הבנתי

מה זה visual studio command prompt לא ראיתי אופציה כזו של פרויקט חדש, ומה זה cl.

בכל אופן השלב הבא יהיה כנראה לעבור ל VS גרסה אחרונה נדמה לי 2013
 
למעלה