IOPanel

חזור   IOPanel > דבר חופשי > תוכנה ומערכות הפעלה > תיכנות
עמוד ראשי הירשם חיפוש הודעות מהיום סמן פורומים כנקראו

תיכנות פורום בנושאי תיכנות , פיתוח אתרים , שפות תיכנות , אפליקציות סלולר וטאבלטים.

תוכנה ומערכות הפעלה : תיכנות

סריקת מערך דו ממדי בשפת C

שלום רב, כתבתי את קטע הקוד הבא בהתאם להוראות שצירפתי בקובץ: קוד: #include <stdio.h> #define M 4 #define N 3 ...
תגובה
 
קישור חוזר הגדרות אשכול אפשרויות הצגת נושא
ישן 21-12-12, 0:17   #1 (קישור ישיר)
IO Rookie
 
תאריך הצטרפות: Nov 2012
הודעות: 18
ברירת מחדל סריקת מערך דו ממדי בשפת C

שלום רב,

כתבתי את קטע הקוד הבא בהתאם להוראות שצירפתי בקובץ:

קוד:
#include <stdio.h>
#define M 4
#define N 3
int main()
{
    int num, arr[M][N], i, j, counter=0, line=-1;
    scanf("%d", &num);
    for (i=0; i<M; i++)
    {
        for (j=0; j<N; j++)
        {
              scanf("%d", &arr[i][j]);
        }
    }
    for (i=0; i<M; i++)
    {
        for (j=0; j<N; j++)
        {
            if (i<(M) && (j<N))
            {
            if (arr[i][j] + arr[i][j+1] + arr[i+1][j] + arr[i+1][j+1] == num)
            {
                counter++;
                line++;
            }
            }
        }
    }
                if (counter==0)
                {
                    line = -1;
                    printf("The number of 2 by 2 matrices with sum %d is %d\n",num, counter);
                    printf("The index of the last row in which such a 2 by 2 matrix exists, is %d\n", line);
                }
                else
                {
                printf("The number of 2 by 2 matrices with sum %d is %d\n",num, counter);
                printf("The index of the last row in which such a 2 by 2 matrix exists, is %d\n", line);
                }

    return 0;
}
והתגלעו אצלי שתי בעיות כפי שאני מזהה אותן:

המונה של השורה הראשונה של הריבוע האחרון שנמצא לא מתחשב אצלי באפשרות שיהיו שני ריבועים שמתחילים באותה שורה והם לא זהים. איך לעשות את זה?

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

אודה לעזרתכם.
קבצים מצורפים
סוג הקובץ: jpg 1.jpg (123.3 KB, 10 צפיות)
סוג הקובץ: jpg ללא שם.jpg (176.8 KB, 13 צפיות)
eliorws לא מחובר   הגב עם ציטוט
ישן 21-12-12, 0:51   #2 (קישור ישיר)
IO Pro
 
תאריך הצטרפות: Feb 2009
הודעות: 1,083
ברירת מחדל

קוד:
#include <stdio.h>
#define M 4
#define N 3
int main()
{
    int num, arr[M][N], i, j, counter = 0, line = -1;
    scanf("%d", &num);
    for (i=0; i<M; i++)
    {
        for (j=0; j<N; j++)
        {
              scanf("%d", &arr[i][j]);
        }
    }
    for (i=0; i<M-1; i++)
    {
        for (j=0; j<N-1; j++)
        {
            if (arr[i][j] + arr[i][j+1] + arr[i+1][j] + arr[i+1][j+1] == num)
			{
                counter++;
                line=i;
            }
        }
    }
    printf("The number of 2 by 2 matrices with sum %d is %d\n",num, counter);
    printf("The index of the last row in which such a 2 by 2 matrix exists, is %d\n", line);
	scanf("%d",&num);
	return 0;
}
טוב, קודם כל סידרתי את זה וזה עובד, עכשיו אני אסביר.
קודם כל, אצלך, בלולאת ה- for מקוננת השנייה: הלולאה החיצונית (של השורות) רצה עד אשר i קטן מ-M, משמע - עד השורה האחרונה, ובכל איטרציה אתה ניגש למקום הi+1 כלומר לשורה שאחרי השורה האחרונה - חריגה. כנ"ל לגבי הלולאה הפנימית (עמודות).

מה גם שבלולאה הפנימית רשמת את השורה הבאה:
קוד:
if (i<(M) && (j<N))
זה אומנם תקין, אבל מיותר. שתדע שבאופן כללי, אם אתה מגדיר שהלולאה תרוץ עד ערך מסויים, אתה לא צריך לבדוק אם היא באמת עובדת כמו שצריך, תאמין לי - היא עובדת.

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

לגבי ההדפסות - בשני המקרים אתה מדפיס בדיוק אותו דבר, ואין צורך להבדיל בין המקרים,
המשתנה line יישאר בכל מקרה 1- אם הCounter יהיה 0 ולכן אין סיבה להבדיל.

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

זהו בכל אופן, אם יש לך עוד שאלות אתה מוזמן לשאול, בהצלחה!
__________________
Intel i5 2500K @ 4.5 GHz WaterCooled, Asrock Z77 Extreme6, Sapphire 7950 3GB GDDR5 @ 1215/1750
Kingston 8GB (2X4GB) DDR3 @ 1600MHz, Seasonic S12II-620W, Corsair Obsidian 800D, OCZ Vertex 4 SSD 128G Sata3 Indilinx Everest 2
WD 320GB AAKS + Samsung 1TB F3 + WD 160GB AAJS
intenGer לא מחובר   הגב עם ציטוט
ישן 21-12-12, 1:53   #3 (קישור ישיר)
IO Folding Captain
 
סמל האישי של Dj-L@g0la5
 
תאריך הצטרפות: May 2008
הודעות: 1,655
ברירת מחדל

אגב, אל תשכח להוריד את ה-scanf האחרון שלפני ה-return
__________________
Intel Sandy Bridge i5 2500K @4GHz | Reeven RCCF-1201SP | MSI Z77A-GD55
G.Skill DD3-1600 Ripjaws-X 8GB CL8 (2 x 4GB) | nVIDIA GTX 780 | Cooler Master CM690 | Antec Neo Eco 620W
Crucial M4 SSD 128GB + Mushkin Callisto deluxe SSD 60GB + Western Digital ‎WD6400AAKS‎ + Western Digital WD10EARS + Western Digital WD20EARS

Join us to help the World get BETTER - IOPanel-WCG Team | HowTo: Install the Client ; Connect remotely to the Client
Dj-L@g0la5 לא מחובר   הגב עם ציטוט
ישן 21-12-12, 4:14   #4 (קישור ישיר)
IO Pro
 
תאריך הצטרפות: Feb 2009
הודעות: 1,083
ברירת מחדל

כן, רשמתי לו שהקליטה האחרונה היא רק בשביל שזה לא ייעלם מהר ויהיה אפשרי לראות את התוצאה...
עשיתי את הקורס לפני 4 שנים, כבר לא זוכר איך עושים שזה ייעצר עד שיהיה מגע במקלדת... חלוד ;-)
__________________
Intel i5 2500K @ 4.5 GHz WaterCooled, Asrock Z77 Extreme6, Sapphire 7950 3GB GDDR5 @ 1215/1750
Kingston 8GB (2X4GB) DDR3 @ 1600MHz, Seasonic S12II-620W, Corsair Obsidian 800D, OCZ Vertex 4 SSD 128G Sata3 Indilinx Everest 2
WD 320GB AAKS + Samsung 1TB F3 + WD 160GB AAJS
intenGer לא מחובר   הגב עם ציטוט
ישן 21-12-12, 4:35   #5 (קישור ישיר)
IO Folding Captain
 
סמל האישי של Dj-L@g0la5
 
תאריך הצטרפות: May 2008
הודעות: 1,655
ברירת מחדל

באיזה סביבה אתה משתמש? רק בשביל זה התקנתי את Dev-C++ (לקח זמן להבין בהתחלה למה לא מתקמפל ) ושם אחרי שהתוכנית מסתיימת הוא מחכה שאני אלחץ על מקש מסויים על מנת שהוא יסגור את החלון טרמינל.

אגב, סתם בשביל לוודא, M לא אמור להיות העמודות ו-N השורות? כלומר arr[N][M]?
או שאני מתבלבל עם JAVA שאני לומד עכשיו...
__________________
Intel Sandy Bridge i5 2500K @4GHz | Reeven RCCF-1201SP | MSI Z77A-GD55
G.Skill DD3-1600 Ripjaws-X 8GB CL8 (2 x 4GB) | nVIDIA GTX 780 | Cooler Master CM690 | Antec Neo Eco 620W
Crucial M4 SSD 128GB + Mushkin Callisto deluxe SSD 60GB + Western Digital ‎WD6400AAKS‎ + Western Digital WD10EARS + Western Digital WD20EARS

Join us to help the World get BETTER - IOPanel-WCG Team | HowTo: Install the Client ; Connect remotely to the Client
Dj-L@g0la5 לא מחובר   הגב עם ציטוט
ישן 21-12-12, 5:00   #6 (קישור ישיר)
IO Pro
 
תאריך הצטרפות: Feb 2009
הודעות: 1,083
ברירת מחדל

אני משתמש בVS 2008 (גירסא ישנה כי אני משתמש בפרוייקט גמר בספרייה שלא אוהבת גרסאות חדשות יותר).

ובאופן כללי:
קוד:
arr [X][Y]
X זה השורות, ו-Y זה העמודות.

ולגבי הקומפיילר שאתה הורדת - הרצת את הקוד שלי? כי אם כן אז מה הסתם שהוא מחכה שתלחץ על משהו, בשביל זה עשיתי את הScanf

אם זה לא הקוד שלי אז פיצ'ר נחמד
__________________
Intel i5 2500K @ 4.5 GHz WaterCooled, Asrock Z77 Extreme6, Sapphire 7950 3GB GDDR5 @ 1215/1750
Kingston 8GB (2X4GB) DDR3 @ 1600MHz, Seasonic S12II-620W, Corsair Obsidian 800D, OCZ Vertex 4 SSD 128G Sata3 Indilinx Everest 2
WD 320GB AAKS + Samsung 1TB F3 + WD 160GB AAJS
intenGer לא מחובר   הגב עם ציטוט
קישור פירסומי
ישן 21-12-12, 11:10   #7 (קישור ישיר)
IO Folding Captain
 
סמל האישי של Dj-L@g0la5
 
תאריך הצטרפות: May 2008
הודעות: 1,655
ברירת מחדל

הורדתי מהקוד שלך את השורה וככה זה נראה:


אוקיי, אז הגדרת המערך היא כמו ב-JAVA.
ולפי הגדרת השאלה N אמור להיות השורות ו-M העמודות:


אומנם פרט שולי, אבל אם זה תרגיל להגשה, זה יכול להוריד ניקוד
__________________
Intel Sandy Bridge i5 2500K @4GHz | Reeven RCCF-1201SP | MSI Z77A-GD55
G.Skill DD3-1600 Ripjaws-X 8GB CL8 (2 x 4GB) | nVIDIA GTX 780 | Cooler Master CM690 | Antec Neo Eco 620W
Crucial M4 SSD 128GB + Mushkin Callisto deluxe SSD 60GB + Western Digital ‎WD6400AAKS‎ + Western Digital WD10EARS + Western Digital WD20EARS

Join us to help the World get BETTER - IOPanel-WCG Team | HowTo: Install the Client ; Connect remotely to the Client
Dj-L@g0la5 לא מחובר   הגב עם ציטוט
ישן 21-12-12, 12:30   #8 (קישור ישיר)
IO Pro
 
תאריך הצטרפות: Feb 2009
הודעות: 1,083
ברירת מחדל

האמת לא ירדתי לפרטי פרטים, הנחתי שהוא ביצע, אבל אם כן - להחליף
__________________
Intel i5 2500K @ 4.5 GHz WaterCooled, Asrock Z77 Extreme6, Sapphire 7950 3GB GDDR5 @ 1215/1750
Kingston 8GB (2X4GB) DDR3 @ 1600MHz, Seasonic S12II-620W, Corsair Obsidian 800D, OCZ Vertex 4 SSD 128G Sata3 Indilinx Everest 2
WD 320GB AAKS + Samsung 1TB F3 + WD 160GB AAJS
intenGer לא מחובר   הגב עם ציטוט
ישן 21-12-12, 13:23   #9 (קישור ישיר)
IO Folding Captain
 
סמל האישי של Dj-L@g0la5
 
תאריך הצטרפות: May 2008
הודעות: 1,655
ברירת מחדל

השאלה הייתה בשבילו יותר מאשר לך חח
__________________
Intel Sandy Bridge i5 2500K @4GHz | Reeven RCCF-1201SP | MSI Z77A-GD55
G.Skill DD3-1600 Ripjaws-X 8GB CL8 (2 x 4GB) | nVIDIA GTX 780 | Cooler Master CM690 | Antec Neo Eco 620W
Crucial M4 SSD 128GB + Mushkin Callisto deluxe SSD 60GB + Western Digital ‎WD6400AAKS‎ + Western Digital WD10EARS + Western Digital WD20EARS

Join us to help the World get BETTER - IOPanel-WCG Team | HowTo: Install the Client ; Connect remotely to the Client
Dj-L@g0la5 לא מחובר   הגב עם ציטוט
ישן 21-12-12, 17:41   #10 (קישור ישיר)
IO Rookie
 
תאריך הצטרפות: Nov 2012
הודעות: 18
ברירת מחדל

תודה רבה אהבתי במיוחד מה שעשית עם ה-line.
אבל דיי לא הבנתי למה התנאי שאני שמתי כדי למנוע את החריגה לא עזר לתוכנית (ונראה שבכלל זה פגע בה).
איך שאני רואה את זה, תאורתית התוכנית הייתה אמורה לרוץ עד השורה האחת לפני אחרונה והעמודה אחת לפני אחרונה. ובהתאם לכך לא הייתה אמורה להיווצר חריגה באמצעות ה-i+1 או ה-j+1.

והפרטים הקטנים תוקנו....תודה לכם.
eliorws לא מחובר   הגב עם ציטוט
ישן 21-12-12, 18:47   #11 (קישור ישיר)
IO Folding Captain
 
סמל האישי של Dj-L@g0la5
 
תאריך הצטרפות: May 2008
הודעות: 1,655
ברירת מחדל

התנאי שלך בדק אם אתה בתוך המערך. הדבר הזה די מובן כי אתה מריץ את i ו-j בין 0 ל-(N-1) ו-(M-1) בהתאמה.הערכים המקסימליים שהם יכולים לקבל הם גבולות המערך.
כשהגדרת M=3, המספור של השורות הוא 0, 1, 2. ככה שברגע שרשמת:
קוד:
if (i<(N) && (j<M))
בדקת אם אתה בתוך המערך.

אם היית רוצה בדרך שלך היית צריך לרשום:
קוד:
if (i<(N-1) && (j<(M-1)))
אבל מה ש-intenGer עשה זו הדרך הנכונה באמת.
__________________
Intel Sandy Bridge i5 2500K @4GHz | Reeven RCCF-1201SP | MSI Z77A-GD55
G.Skill DD3-1600 Ripjaws-X 8GB CL8 (2 x 4GB) | nVIDIA GTX 780 | Cooler Master CM690 | Antec Neo Eco 620W
Crucial M4 SSD 128GB + Mushkin Callisto deluxe SSD 60GB + Western Digital ‎WD6400AAKS‎ + Western Digital WD10EARS + Western Digital WD20EARS

Join us to help the World get BETTER - IOPanel-WCG Team | HowTo: Install the Client ; Connect remotely to the Client
Dj-L@g0la5 לא מחובר   הגב עם ציטוט
ישן 21-12-12, 19:07   #12 (קישור ישיר)
IO Rookie
 
תאריך הצטרפות: Nov 2012
הודעות: 18
ברירת מחדל

הבנתי. תודה רבה.
eliorws לא מחובר   הגב עם ציטוט
תגובה


הגדרות אשכול
אפשרויות הצגת נושא

חוקי משלוח הודעות
אתה לא יכול לשלוח הודעות חדשות
אתה לא יכול לשלוח תגובות
הינך לא יכול לצרף קבצים להודעותיך
אתה לא יכול לערוך את הודעותיך

vB code הינו פועל
סמיילים הינו פועל
קוד [IMG] הינו פועל
קוד HTML הינו כבוי
Trackbacksהינו פועל
Pingbacks הינו פועל
Refbacks הינו פועל

נושאים דומים
אשכול מפרסם האשכול פורום תגובות הודעה אחרונה
שאלה בשפת C eliorws תיכנות 11 20-02-13 23:43
קיים קובץ בתחום סריקת המסמכים בדומה לקובץ RAW בתחום הצילום A1ex מחשבים ומה שמסביב 5 25-02-12 22:22
מערך SLI 16X16X מול מערך 8X8X ברזולוציה 2560x1440 amadey כרטיסי מסך 3 31-10-11 20:34
עזרה שניה בשפת C ExtaNd תוכנה ומערכות הפעלה 13 08-11-08 21:30
פופאפים קופצים גם אחרי סריקת ספייוור Odedk תמיכה טכנית 1 28-07-08 13:30


כל הזמנים הם GMT +3. השעה כרגע היא 13:45.





מופעל על ידי: vBulletin
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO
IOPanel.net © כל הזכויות שמורות