שאלה

BravoMan

Active member
ברוך שובך!
איך מתקדמת הבינה המלאכותית?
היא כבר מוכנה להשתלט על העולם? :-D

בכל אופן, התשובה לשאלתך היא:
השתמש בפקודה SEEK.

היא מקבלת 2 פרמטרים: הקובץ הפתוח, והמקום בקובץ ממנו אתה רוצה לקרוא או לכתוב בפקודה הבאה.
ככה תוכל לדלג לכל מקום בכל זמן.


בהצלחה!
(ואני מקווה שאתה תכניס אותי לרשימה הלבנה, כדי שהבינה המלאכותית תרחם עלי כשהיא תחליט לחסל \ לשעבד את יתר האנושות!)
 
אסביר את השאלה: אני מתחיל לקרוא ברצף מתקדם כרגיל קובץ שמיושם דרך QBASIC בעזרת הפקודה "open"i, ואני רוצה באמצע הקריאה לחזור אחורה למקום מסוים קודם בקובץ שכבר קראתי ממנו ומשם לחזור ולהמשיך לקרוא קדימה מבלי לסגור את הקובץ. איך אעשה את זה?
 
תודה וסחטיין על החביבות. אני לא בטוח שהתוכנה תעבוד אבל אני מאמין שיש לה פוטנציאל די טוב להצליח, אני מקווה שלא תשתלט על העולם ואשתדל להוסיף לה פקודות עצירה טובות שימנעו זאת. אשמח אם תסביר לי יותר במפורט איך כותבים את שני המשתנים בפקודה SEEK, וגם איך עושים פקודות עצירה שיפעלו היטב על כל התוכנה.
 
שאלה: עכשיו ניסיתי לכתוב עם SEEK, ועשה לי קפיצות גדולות בין המספרים. בכל פעם שחיפשתי נתון במקום מסוים בקובץ, אילץ אותי המחשב לפסוח על כמות גדולה של מספרים ברצף כדי להגיע אליו. אני מניח שזה כי הוא סופר את הפסיקים שמפרידים בין הנתונים בקובץ. מה לעשות?
 
נערך לאחרונה ב:

BravoMan

Active member
שאלה: עכשיו ניסיתי לכתוב עם SEEK, ועשה לי קפיצות גדולות בין המספרים. בכל פעם שחיפשתי נתון במקום מסוים בקובץ, אילץ אותי המחשב לפסוח על כמות גדולה של מספרים ברצף כדי להגיע אליו. אני מניח שזה כי הוא סופר את הפסיקים שמפרידים בין הנתונים בקובץ. מה לעשות?
הוא לא סופר פסיקים, אבל לאן פקודה "SEEK" תדלג, תלוי בצורה שאתה קורא מהקובץ.

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

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

פקודת עצירה טובה תהיה:
קוד:
IF AI$ = "EVIL" THEN
    STOP
END

בהצלחה!
 
STOP זו פקודת עצירה מקומית, התכוונתי איך להשתמש בפקודה שגורפת ממקום אחד על התוכנית כולה, אולי WHILE. הקובץ שלי נפתח בערך כך:

$open"i", 1, a
seek 1,3
$input# 1,b
$print b
close

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


490 INPUT "I/O"; I$, O$
500 OPEN "O", 1, O$: CLOSE
510 n4 = 1: n7 = 1: n8 = 1
520 OPEN "I", 1, I$: DO
530 OPEN "I", 2, "DICTIO": DO
540 INPUT #2, b$, C$: OPEN "I", 3, b$: DO
550 INPUT #1, a$: INPUT #3, d$: n4 = n4 + 1
556 IF LEN(a$) > 1 AND LEFT$(a$, 2) = "X(" THEN a$ = "X"
557 IF LEN(d$) > 1 AND LEFT$(d$, 2) = "X(" THEN d$ = "X"
570 IF a$ <> d$ THEN Q4 = 1: SEEK 1, n7: GOTO 590
580 Q4 = 0: LOOP UNTIL EOF(3)
590 CLOSE 3
600 IF Q4 = 0 THEN GOTO 621
620 LOOP UNTIL EOF(2)
621 CLOSE 2
622 OPEN "A", 4, O$
623 IF Q4 = 1 THEN Q4 = 0: PRINT #4, a$; ","; : PRINT a$; "?"; : INPUT aa ELSE PRINT #4, b$; ","; : PRINT b$; "!"; : INPUT aa
624 CLOSE 4
625 n7 = n4: SEEK 1, n4: LOOP UNTIL EOF(1): CLOSE

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

BravoMan

Active member
לא נראה שהקוד עושה מה שאתה חושב שהוא עושה.

למה הקוד שלך מבקש שם קובץ מהמשתמש?
מה יש בקובץ שהמשתמש מכניס?

למה המילון שלך הוא למעשה רשימת קבצים ולא רשימת מילים, ומה זה הנתון הנוסף שאתה קורא מקובץ מילון אבל מתעלם ממנו?

סה"כ נראה שאתה מנסה לקרוא מ-3 קבצים שונים, ולחפש תוכן של הראשון בתוך השלישי, עם שינוי מינורי במקרים מסויימים (מה זה כל ה-X וההחלפות?)

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

אגב, ממליץ בחום לתת למשתנים שלך שמות שמשמעותיים ולא שמות של אות אחת או אות ומספר, כדי שהקוד יהיה קריא יותר!

כמו כן, אם יש לך הרבה פקודות בתוך תנאי IF למשל, אל תכתוב את כולן באותה שורה, במקום השתמש במבנה IF ... END IF.

בייסיק לא ממש תומך בהזחות כמו שפות תכנות מודרניות, אבל עדיין ככל שתעשה את הקוד יותר קריא ומפורד, כך יהיו לך פחות תקלות!
 
יש לי קובץ מילון שהכתבתי למחשב של כחמש מאות מילים באנגלית עם הגדרות באנגלית, המלים הראשונות מוגדרות בעזרת ביסיק וכל מלה מוגדרת בעזרת צירופי מלים שלפניה, שלהן יש משמעות פשוטה יותר. כל הגדרה למלה אחרי שנבנתה מתוך המלים הקודמות, נוצרת בקובץ נפרד עם שם המלה, שכל הקובץ תנאי אחד ארוך עם רצפים של IF. יש קובץ אם שמוגדר בהתחלה ויש בו כמה תכונות כמו לימוד לבצע פעולות בעזרת המלים "IF SHOULD" וזיהוי תכונה של דבר בעזרת המלה "CHARACTER"", ואת קובץ האם מצרפים אחר כך לכל הגדרה בנפרד, אחרי שגם הוא תורגם לביסיק. אחר כך יש קטעי תוכנה שמשתמשים בהגדרות במילון לתקשר באנגלית, לחשוב ולהרגיש. יש משתנה X שמגדיר מצבים בזמן הפעלת ההגדרות. בזמן יצירת ההגדרות המחשב מסדר את התנאים בצורה ברורה, ומוסיף למשתנה X מקומות עולים במערך וחוזרים להתחלה כדי ליצור ממנו קבוצת ערכים שונים. בקטע ששלחתי לך אני מנסה לקבל קובץ שתורגם מאנגלית בעזרת המילון לביסיק ולתרגם אותו בחזרה לאנגלית, ע"י השוואה של הכתוב בו לכתוב בהגדרות, כדי ליצור תקשור חוזר מהמחשב כלפי חוץ. אלגוריתם לא קל. הקובץ של המילון וקבצי המלים גם בלי סיומת ולכן כשאני שולח את המילון לאחרים שיבדקו אותו זה מסכן אותם שיקלקל להם את המחשב. אני מכיר את צורת התנאי ,IF THEN, לא מכיר צורות אחרות ולא יודע אם אסתדר אתן וכדאי שאתחיל עכשיו לשנות את התוכנות בשבילן. לא הבנתי איך הקוד יהיה יותר קריא אם אתן שמות משמעותיים אם המחשב לא מבין את השמות, אולי לי זה יהיה יותר קריא.
 
נערך לאחרונה ב:

BravoMan

Active member
אל תדאג, המחשב שלי עובד על לינוקס, אי אפשר לקלקל אותו עם שום קובץ, גם כזה ששורף WINDOWS!

אבל אם אתה מתעקש, אל תשלח את כל הקובץ.

תעתיק לפה 5 שורות ראשונות מהקובץ של 500 שורות, ותעתיק תוכן של 1 או 2 מקבצי ההגדרה אליהם הקובץ הגדול מפנה.

לגבי השמות - המחשב לא צריך להבין אותם, אתה ואני צריכים להבין אותם!
שמות קריאים הם בשבילך, כדי שלא תצטרך לזכור מה כל משתנה עושה, אלא תוכל להבין זאת מיד מהשם שלו, גם אם לא נגעת בקוד שנה.

ככל שלך יהיה קל יותר להבין את הקוד, כך אתה תעשה פחות טעויות בקוד.

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

קוד:
530 OPEN "I", 2, "DICTIO"
535 DO
540 INPUT #2, WORDS_FILE$, UNUSED$
545 OPEN "I", 3, WORDS_FILE$
546 DO
550 INPUT #1, a$
551 INPUT #3, d$
552 n4 = n4 + 1
556 IF LEN(a$) > 1 AND LEFT$(a$, 2) = "X(" THEN a$ = "X"
557 IF LEN(d$) > 1 AND LEFT$(d$, 2) = "X(" THEN d$ = "X"
570 IF a$ <> d$ THEN
571 NOT_DOUND = 1
572 SEEK 1, n7
573 GOTO 590
574 END IF
580 NOT_FOUND = 0
585 LOOP UNTIL EOF(3)

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

קבצים מצורפים

  • תוכנות בינה.docx
    KB 38.7 · צפיות: 4

BravoMan

Active member
הצלחתי לקבל ולחלץ את הקבצים בלי בלי בעיה.

אני אצטרך לעבור עליהם, אבל כבר במבט חטוף, ייתכן שיש כמה בעיות לוגיות בקובץ DICTIO שגורמות לבינה המלאכותית שלך להתבלבל, וכתוצאה מכך אתה חושב שיש תקלות בתוכנה, אבל בעצם התקלות הן במילות.

למשל, NO = NOT X זה הגיוני רק אם X הוא YES, אבל אם X הוא כבר NO, אז יוצא הפוך על הפוך.
 
490 INPUT "I/O"; I$, O$
500 OPEN "O", 1, O$: CLOSE
510 advance = 1: advance2=1:readback = 1
520 OPEN "I", 1, I$: DO
530 OPEN "i", 2, "DICTIO": DO
540 INPUT #2, b$, C$: OPEN "I", 3, b$: DO
550 INPUT #1, a$: INPUT #3, d$: advance = advance + 1: advance2 = advance2 + 1
553 IF a$ = "" THEN advance = advance + 1: advance2 = advance2 + 1
556 IF LEN(a$) > 1 AND LEFT$(a$, 2) = "X(" THEN a$ = "X"
557 IF LEN(d$) > 1 AND LEFT$(d$, 2) = "X(" THEN d$ = "X"
570 IF a$ <> d$ THEN notfound = 1: SEEK 1, readback: GOTO 590
580 LOOP UNTIL EOF(3)
590 CLOSE 3:
600 IF notfound = 0 THEN GOTO 621
620 advance = readback: LOOP UNTIL EOF(2): REM next word
621 CLOSE 2
622 OPEN "A", 4, O$
623 IF notfound = 0 THEN PRINT #4, b$; ",";
624 IF notfound = 1 THEN notfound = 0: PRINT #4, a$; ",";
625 CLOSE 4
626 readback = advance2
627 SEEK 1, advance2
628 LOOP UNTIL EOF(1)
629 CLOSE

כתבתי עכשיו את הקטע הזה, והקובץ שנוצר היה בנוי מטקסטים מקוטעים כמו F במקום IF ואולי בגלל זה לא נתן את כל ההגדרה אלא כל חלק בנפרד.
 
X הוא מושג בסיסי שמוגדר בביסיק ועדיין לא באנגלית, והוא אפשרות קיימת שחיובית ביחס לעצמה. NOT שולל אותה. אם X אפשרות שלילית, השלילה שלה יוצאת חיובית.
YES נוצר אחרי NOT כשלילה של שלילה, NOT NO. המחשב לא מריץ את המילון, אלא מתרגם אותו מלה אחרי מלה לפי מורכבות המשמעות, כדי ליצור מכל מלה קובץ נפרד שאחר כך יוכל להריץ.
 

BravoMan

Active member
אין מונח X בביסיק.
כאן תמצא רשימה של כל הפקודות ש-QBASIC מכיר:
הפקודה היחידה שמתחילה ב-X היא XOR.

אתה אומנם יכול ליצור משתנה ששמו X, אבל ל-BASIC עצמו אין לכך משמעות כי משתנה יכול להחזיק כל דבר.

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

BravoMan

Active member
אבל כאן בדיוק הבעיה הלוגית:
משתנה אינו מונח בסיסי!

משתנה יכול להחזיק כל ערך.

עבור מחשב, מונחים בסיסיים הם "אמת" ו-"שקר" המוצגים כ-0 ו-1.

אז, אם אתה רוצה להסביר משהו למחשב, אתה חייב להתחיל מהמונחים האלה, ולא ממונח "משתנה".
 
למעלה