שאלה קטנה בשפת c

ronib25

New member
למען האמת הקטע הזה בתרגיל המקורי מודבק מתמונה לכן קשה לי

להבין אם זה עם רווח או בלי...
אם אני עושה רווח.. אני צריך לשנות את הקוד, ואם זה בלי הכל עובד...
האם זה קריטי? (מבחינת מה שמקובל בשפת c) ?
 

BravoMan

Active member
כן, זה קריטי, ואתה עדיין לא מחזיר את הערך הנכון מפונקציות!

מצאת את השיטה הנכונה לעבוד עם מבנים. כל הכבוד!
אכן צריך לעשות את הפעולות הבינריות ופעולות ההצבה ( ^|&= ) על האיבר של המבנה, ולא על כל המבנה במכה.
&nbsp
אבל, כשאתה חוזר מהפונקציה (return), ביקשו שכן תחזיר את כל המבנה במכה, אבל אתה מחזיר רק את האיבר.
זה חוקי ב-C להחזיר מבנה שלם!
&nbsp
בעיה נוספת היא שפונקציית ההדפסה שלך היא בלגן אחד גדול!
אם היא עבדה לך בבדיקה - זה לגמרי במקרה!
&nbsp
שוב - אתה לא נשמע להוראות התרגיל, ומכאן מתחילות כל הצרות שלך.
כתבו לך במפורש להשתמש בפעולות bitwise.
&nbsp
אז למה החלטת לדחוף שם כל מיני מצביעים, להמיר את המספר למחרוזת, ולעבור עליו כמערך תווים?
זה לא נכון, זה מיותר, והכי חשוב - זה לא מה שביקשו בתרגיל!
 

ronib25

New member
אז, שאלה...

איך בדיוק אני מחזיר בפונ׳ 2-4 מבנה בשלמותו, הרי אני לא יכול לעשות return SetABC.
בפונ׳ ההדפסה - המעבר למערך הוא כדי לדעת את אורך המספר בכדי להשתמש כתנאי עצירה לאורכו של המספר...
אני אעבוד עוד על פונ׳ ההדפסה ברגע שאבין איך מחזירים מבנה בשלמותו...יש לך אולי איזה קישור לאתר שיש שם מידע לע מבנים ?
 

BravoMan

Active member
לא, אתה לא יכול לעשות return SetABC כי SetABC

זה טיפוס. כמו שאתה לא יכול לעשות return int
&nbsp
אבל אתה מגדיר משתנה שנקרא sec בפונקציות מהטיפוס הזה, ובו אתה מכניס את הערך שאתה אמור להחזיר.
&nbsp
אז למה שפשוט לא תחזיר אתה כל|בדגש| המשתנה במקום רק איבר אחד שלו?
&nbsp
אין יותר מידי חכמה בעבודה עם מבנים.
הם משתנים רגילים, אין פה אפילו תסבוכת של מצביעים.
&nbsp
הנה סתם קישור מגוגל עם כמה דוגמאות פשוטות:
http://www.studytonight.com/c/structures-in-c.php
&nbsp
 

ronib25

New member
לא הבנתי מה כתבת...

״אז למה שפשוט לא תחזיר אתה כל|בדגש| המשתנה במקום רק איבר אחד שלו?״
לא הבנתי טיפה את התחביר של מה שרשמת...
האם התכוונת שאני אחזיר return st ?
 

BravoMan

Active member
זה פשוט:

יש לך משתנה שנקרא sec.
הטיפוס של המשתנה הוא SetABC.
זה בדיוק הטיפוס שהפונקציה אמורה להחזיר.
&nbsp
אז, מה מונע ממך לעשות return sec?
 

ronib25

New member
שאלה אחרונה (אני מקווה)

אני לא מבין מה לא בסדר בפונ׳ ההדפסה?
היא עובדת..אני משתמש שם במערך למרות שלא התבקשתי כדי לגלות את האורך, במקום להשתמש בעוד פונ׳ שאני אצטרך לרשום...(זה כל המטרה של ה itoa שם)...
ואח״כ אני מדפיס כפי שאמרת לי: להגדיר a ופשוט עם מניפולציה של חיבור אני אדפיס את שאר האותיות...
לכן אני כנראה לא רואה את הפיתרון שאתה רואה שם,שהוא כנראה הרבה יותר יעיל..לכן אשאל שוב:מלבד החוסר סדר והעובדה שהפונ׳ שם יחסית ארוכה..אתה יכול להצביע על נקודות שאפשר לנצל אותן למשל באמצעות bitwise ? או שהן מיותרות בכלל?? כי אני לא רואה כאלו...://
 

BravoMan

Active member
אתה לא צריך לגלות שום אורך של שום דבר.

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

ronib25

New member
תיקון,תיקון להודעה הקודמת שלי...

אני יצאתי טמבל...מאז הקוד שפירסמתי שיניתי... יש לי return sec למשל בפונ׳ השנייה
האם כעת הפונ׳ בסדר ??(מלבד פונ׳ ההדפסה שכעת אסתכל עליה)?

קוד:
# include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct SetABC
{
	unsigned int st;
} SetABC;

void PrintSet(SetABC st);//seif 1
SetABC UnionABC(SetABC st1, SetABC st2);//seif 2
SetABC IntersectABC(SetABC st1, SetABC st2);//seif 3
SetABC MinusABC(SetABC st1, SetABC st2);//seif 4

void main()
{
	int num = 0, i = 0, second, third, fourth;
	SetABC  st1, st2, sec, three, four;
	char buffer[27], buffer2[27];
	printf("Enter the first number: ");
	scanf("%d", &(st1.st));
	printf("Enter the second number: ");
	scanf("%d", &(st2.st));
	printf("\nThe letters that belongs to original numbers are:\n");
	PrintSet(st1);
	PrintSet(st2);
	sec = UnionABC(st1, st2);//seif 2
	printf("(%d) ", sec.st);
	PrintSet(sec);
	three = IntersectABC(st1, st2);//seif 3
	printf("(%d) ", three.st);
	PrintSet(three);
	four = MinusABC(st1, st2);//seif 4
	printf("(%d) ", four.st);
	PrintSet(four);
	getch();
}

void PrintSet(SetABC st)//seif 1 
{
	char ABC = 'a', buffer[27];
	int i = 0, k;
	unsigned int *p = &(st), t, num;
	num = *p;
	itoa(num, buffer, 2);
	i = strlen(buffer);
	if (i > 26)
		printf("The length of binary number too long for use the english ABC");//errore message
	else
	{
		k = i;
		while (k > 0)//while the place in the range of ABC
		{
			if (buffer[k - 1] & 1 == 1)//if the number is 1 so the bit works we shoud print the correct letter
				printf("%c", ABC + i - k);
			k--;//next place on the buffer
		}
		printf("\n");
	}
}
SetABC UnionABC(SetABC st1, SetABC st2)//seif 2
{
	struct SetABC sec;
	sec.st = st1.st | st2.st;
	printf("\nOR:\n");
	return sec;
}
SetABC IntersectABC(SetABC st1, SetABC st2)//seif 3
{
	struct SetABC three;
	three.st = st1.st & st2.st;
	printf("\nAND:\n");
	return three;
}
SetABC MinusABC(SetABC st1, SetABC st2)//seif 4
{
	struct SetABC four;
	four.st = st1.st ^ st2.st;
	printf("\nXOR:\n");
	return four;
}
 
למעלה