ABA


"|C| שגיאה בהרצה - תרגיל"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15210 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15210
jossepe_4u 
חבר מתאריך 18.3.02
258 הודעות, דרג אמינות חבר זה
   12:31   27.02.09   
אל הפורום  
  |C| שגיאה בהרצה - תרגיל  
 
  

#include <stdio.h>
#include <string.h>

int myPower (int i)
{
int looping , sum = 10;

for (looping = 1; looping >= i ; looping++)
sum *= 10;

return sum;
}

void translate_dec_hex(char *x[])
{
int i = 1;
int summ = 0;
int dividing = 0;
int theNumber = 0;
int szOfx = strlen(*x);

// find the number
for (i = 0; i <= szOfx-1; i++)
{
theNumber += (int)x[i] * myPower(i);
}

i = 1;

printf("The Size: %d \n",szOfx);
printf("The Number: %d \n",theNumber);

// start to convert
do
{
dividing = (theNumber / 2);
summ += ((theNumber % 2) * myPower(i));
++i;
theNumber = dividing;
}
while(theNumber > 0);

printf ("The Binary Number Is: %d \n",summ);
}

int main()
{
char *newNumber[2];
*newNumber = "12";
translate_dec_hex(&newNumber[2] );
return 0;
}

התוכנית אמורה להציג מספר בבסיס 10 באמצעות בסיס 2

הפונקציה myPower נכתבה כי לא הצלחתי להשתמש בפונקציה pow()
והוספתי את הכותר math.h


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תכני בסי שארפ DOWNTOWN 27.02.09 14:10 1
     יש טעות DOWNTOWN 27.02.09 15:10 2
  בוא נתחיל מזה שה-main שלך לא תקין... ldan192  27.02.09 17:30 3
  אין סיבה ש pow לא יעבוד. Net_Boy  27.02.09 17:37 4
  יש דרכים פשוטות יותר, לדוגמא: TTAsnn 27.02.09 21:00 5
  תודה לכולם.... אעדכן jossepe_4u  28.02.09 18:42 6

       
DOWNTOWN
חבר מתאריך 28.5.02
5388 הודעות, דרג אמינות חבר זה
   14:10   27.02.09   
אל הפורום  
  1. תכני בסי שארפ  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 27.02.09 בשעה 14:16 בברכה, DOWNTOWN
 

static int number = 0;
static int changeBase(int num, int targetBase)
{
if (num == 0 || num == 1)
return num;
int helper = (int)Math.Log(num, targetBase);
number += (int)Math.Pow(10, helper);
changeBase(num - (int)Math.Pow(targetBase, helper), targetBase);
return number;
}


זאת תכנית לפני שבוע בדיוק
כעקרון אם זה לבסיס 2 רק צריך להפוך את targetBase ל2

וניתן לממש את פונקציית הלוג בבסיס 2 כך:


static int logBase2(int num)
{
int log = 0;
while ((num >>= 1) != 0)
{
log++;
}
return log;
}

מימוש פונקציית הלוג לקוחה מ
http://tekquestions.wordpress.com/2008/05/15/bit-twiddling-hacks/


ככה שבסופו של דבר תקבל דבר כזה:


static int number = 0;
static int toBase2(int num)
{
if (num == 0 || num == 1)
return num;
int helper = logBase2(num);
number += (int)Math.Pow(10, helper);
toBase2(num - (int)Math.Pow(2, helper));
return number;
}

האמת שלא הבנתי בדיוק מה ניסית לעשות


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DOWNTOWN
חבר מתאריך 28.5.02
5388 הודעות, דרג אמינות חבר זה
   15:10   27.02.09   
אל הפורום  
  2. יש טעות  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 27.02.09 בשעה 15:10 בברכה, DOWNTOWN
 
            if (num == 0 || num == 1)
{
number += num;
return number;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:30   27.02.09   
אל הפורום  
  3. בוא נתחיל מזה שה-main שלך לא תקין...  
בתגובה להודעה מספר 0
 

int main(){
char *number = (char*)malloc(sizeof(int)*3);
*number = "12";
translate_dec_hex(&newNumber);
return 0;
}

אחרי זה תעדכן אילו עוד שגיאות יש לך.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   17:37   27.02.09   
אל הפורום  
  4. אין סיבה ש pow לא יעבוד.  
בתגובה להודעה מספר 0
 
   אתה כנראה לא השתמשת בפרמטרים הנכונים

double pow( double base, double exp );

תבדוק שאתה מעביר לה double ומקבל כערך החזר double.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TTAsnn

דרג אמינות חבר זה
   21:00   27.02.09   
אל הפורום  
  5. יש דרכים פשוטות יותר, לדוגמא:  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 27.02.09 בשעה 21:00 בברכה, TTAsnn
 
הרי זה לא סתם המרה בין בסיסים אלא בין בסיס 10 ל 2 והיות ואתה יודע את הייצוג הפנימי של int קל מאוד לפעול ככה:


#include <stdio.h>

int
main ()
{
char input_number[] = "12";
char new_number[sizeof(int)*8+1] = "";
int number = atoi(input_number);
int shl = 1;
int i=0;

for (i=sizeof(int)*8-1 ; i>=0 ; i--) {
new_number[i] = (number & shl) ? '1' : '0';
shl = shl << 1;
}
new_number[i] = '\0';
printf("%s\n",new_number);
return 0;
}

זה מדפיס לך את המספר עם כל האפסים המרפדים, אפשר בקלות להעיף אותם ע"י משהו כזה:


i=0;
while (new_number[i++] == '0') ;
i--;
strcpy(new_number,&new_number[i]);
printf("%s\n",new_number);

ולא לשכוח להכליל את string.h אם אתה משתמש בדוגמא השניה.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
jossepe_4u 
חבר מתאריך 18.3.02
258 הודעות, דרג אמינות חבר זה
   18:42   28.02.09   
אל הפורום  
  6. תודה לכולם.... אעדכן  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net