עבור לתוכן

עזרה בשפת C

Featured Replies

פורסם

אהלן, אנשים

יש לי שאלה, שנתקעתי איתה לקראת הסוף.

כתוב תכנית אשר הקלט שלה מספר המציין אורך מילה, ואחריו המלה באותיות אנגליות (גדולות וקטנות) והפלט שלה הוא הצפנה של המילה על-ידי החלפת כל אות על פי החוקיות הבאה: האות A מוחלפת באות Z, האות B מוחלפת באות Y וכן הלאה, האות a מוחלפת באות z, האות b מוחלפת באות y וכן הלאה.

הערות:

אין צורך לבדוק ערך מוחזר ע"י scanf/getchar

אם תו קלט הוא לא אות אלפבית, התוכנית יודיע שגיאה ותסתיים.

אלפבית האנגלי: A B C D E F G H I J K L M N O P Q R S T U C W X Y Z

דוגמא:

Enter the word length and the word immediately after it: 5abCdE

zyXwV is a encoded word.

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

תודה מראש על העזרה. 

#include<stdio.h>

int main()
{
int length;int i;int check;
char letter;char check_letter;char coded_letter;
printf ("\nEnter the word length and the word immediately after it: ");
if (scanf("%d",&length)!=1)
{ printf ("\nInput Error!");
}
else
{ printf ("%d",length);
}
for (i=0;i<length;i++)
{       check=scanf("%c",&letter);
if (check!=1 || letter<'A' || letter>'z' || (letter>'Z' && letter<'a'))
printf ("Input Error!");

else printf ("%c",letter);
if (letter>='A' && letter<='Z')
{ for (check_letter='A',coded_letter='Z';check_letter<='Z'
{ if (letter==check_letter)
printf ("\n%c ",coded_letter);
check_letter++;
coded_letter--;
}
}
if (letter>='a' && letter<='z')
{ for (check_letter='a',coded_letter='z';check_letter<='z'
{ if (letter==check_letter)
printf ("\n%c ",coded_letter);
check_letter++;
coded_letter--;
}
}
}
printf ("is an encoded word.");
return 0;
}

פורסם

למה לא לעשות במקום:


for (check_letter='A',coded_letter='Z';check_letter<='Z'
{ if (letter==check_letter)
printf ("\n%c ",coded_letter);
check_letter++;
coded_letter--;

את:



printf ("\n%c ",'Z'-coded_letter);

יותר יעיל נראה לי..

כנל עבור האותיות הקטנות.

פורסם
  • מחבר

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

פורסם

אם כך, אתה חייב להשתמש במערך...

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

את כל המילה, אין ברירה אלא להשתמש במערך...

אחרת אתה קולט אות ואז אתה חייב לעבוד עליה, אחרת אין

לך איפה לשמור אותה

(אלא אם כן לא הבנתי את הבעיה שלך... שזה גם יכול להיות)

או לעשות את הדבר המטומטם, שזה כמו עכשיו, לקלוט אות ולעבוד

עליה ואז את האות הבאה אבל כשאתה מדפיס את האות המקודדת

להדפיס אותו למיקום אחר במסך שאתה מציין

חוץ מזה, לא הבנתי למה אתה מסתבך כ"כ בתוכנית

אמנם לא טרחתי לקרוא אותה לעומק, אבל בתוכנית כזאת אין צורך ביותר מלולאה אחת,

שהיא הזאת שאחראית לקלוט X אותיות (X=המספר שמכניסים לך בהתחלה)

חוץ מזה אין שום צורך בלולאה

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

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

טוב כתבתי את התוכנית, עכשיו אני לא בטוח איך אם יש לי תו (char) אני לוקח את ערך האסקי (ASCII)

שלו, אז כתבתי את זה בתור 'x', למרות שאני לא בטוח שזה נכון

בכל מקרה, הנה התוכנית:


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

int check_inp(char arr[],int i);

void main(){
int num,i;
char arr[20];
printf("bla bla bla:");
scanf("%d",&num);
scanf("%s",arr);
if (check_inp(arr,num)==0) return 0;
for (i=0;i<num;i++){
if (arr[i]>='A' && arr[i]<='Z'){
arr[i]='Z'+'A'-'arr[i]';
}
else{
arr[i]='z'+'a'-'arr[i]';
}
}
printf("%s",arr);
}

int check_inp(char arr[],int i){
int count;
for(count=0;count<i;count++){
if(!((arr[count]>='a' && arr[count]<='z') || (arr[count]>='A' && arr[count]<='Z'))){
return 0;
}
}
return 1;
}

פורסם
  • מחבר

תודה רבה,

הבעיה נפתרה - הסתבר, שלא היה צריך להדפיס את הקלט.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים