שפת C/מחרוזות/תרגילים
מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.
תוכן עניינים |
[עריכה] קלטית שם והדפסת הודעת ברכה אישית
כתבו תוכנית שמבקשת את שם המשתמש, ומדפיסה לו הודעת שלום. הניחו ששם המשתמש קצר מ10 תווים.
פתרון
#include <stdio.h> int main() { char name[10]; printf("Please enter your name: "); scanf("%s",&name); printf("Hello, %s!",name); return 0; }
[עריכה] שרשור שלוש מחרוזות
כתבו תוכנית שקולטת מהמשתמש 3 מחרוזות, משרשרת את שלושתן למחרוזת אחת ומציגה אותה על המסך. הניחו שכל אחת משלוש המחרוזות הנקלטות היא בגודל 15 לכל היותר.שימו לב לא לדרוס זיכרון!
פתרון
#include <stdio.h> #include <string.h> int main() { char str[3][15]; char outputString[50]; int i; for (i=0; i<3; ++i) { printf("Please insert string number %d\n",i+1); scanf("%s",str[i]); } strcpy(outputString,str[0]); strcat(outputString,str[1]); strcat(outputString,str[2]); printf("%s\n",outputString); return 0; }
[עריכה] היפוך מחרוזת
כתבו תוכנית שמקבלת מחרוזת מהמשתמש, ויוצרת מחרוזת חדשה, שמכילה את המחרוזת הראשונה מהסוף להתחלה. כלומר, אם המשתמש הקליד "Shalom" המחרוזת השנייה תהיה "moahS". הניחו שאורך המחרוזות הנו לכל היותר 15.
זכרו שמחרוזת היא פשוט מערך של תווים, ואפשר לגשת לכל תו בה ע"י [str[i כאשר str שם המחרוזת. זכרו גם לדאוג שיהיה תו סיום מחרוזת '0\' במחרוזת החדשה.
פתרון
#include <stdio.h> #include <string.h> int main() { char original[15]; char reversed[15]; int i, end_index; printf("Please insert a string to reverse\n"); scanf("%s",original); end_index = strlen(original) - 1; for(i = end_index; i >= 0; --i) reversed[end_index-i]=original[i]; reversed[end_index + 1] = 0; printf("%s\n",reversed); return 0; }
[עריכה] היפוך מחרוזת ללא מחרוזת עזר
כתבו תוכנית דומה לקודמת: היא קולטת מחרוזת מהמשתמש, ואז הופכת אותה, אך הפעם בלי להשתמש במחרוזת נוספת.
רמז: השתמשו בשני אינדקסים בלולאה. אחד מהם יתחיל מהתו הראשון במחרוזת, ואחד מהתו האחרון. (נזכור שבתא האחרון יש '0\').
פתרון
#include <stdio.h> #include <string.h> int main() { char str[15]; char temp; int i,end_index; printf("Please insert a string to reverse\n"); scanf("%s",str); end_index = strlen(str) - 1; for (i=0; i <= end_index/2; ++i) { temp=str[i]; str[i]=str[end_index-i]; str[end_index-i]=temp; } printf("%s\n",str); return 0; }
[עריכה] מחיקת רווחים ממחרוזת קלט
כתבו תוכנית שקולטת מחרוזת מהמשתמש עם gets, ומוחקת ממנה את כל הרווחים. הניחו שאורך המחרוזות הנו לכל היותר 15. (לא לשכוח לדאוג לתו 0 במקום הנכון...)
פתרון
#include <stdio.h> #include <string.h> int main() { char str[15]; int i, pos=0; printf("Please insert a string from which to remove spaces.\n"); gets(str);/* remember - never use gets in real life! */ for (i=0; i<strlen(str); ++i) if (str[i] != ' ') str[pos++]=str[i]; str[pos]='\0'; printf("%s\n",str); return 0; }
[עריכה] פונקציה דומה לstrlen
כתוב פונקציה בשם strlen_without_h המקבלת מחרוזת, ומדפיסה את מספר התווים בה שאינם האות 'h'.
פתרון
unsigned int strlen_without_h(const char str[]) { unsigned int i; unsigned int len_without_h = 0; for(i = 0; str[i] != 0; ++i) if(str[i] != 'h') ++len_without_h; return len_without_h; }
[עריכה] פונקציה דומה לstrcpy
כתוב פונקציה בשם strcpy_without_h המעתיקה מחרוזת אחת לשניה, למעט כל מופע של האות 'h'.
פתרון
void strcpy_without_h(char dest[], const char src[]) { unsigned int src_i, dest_i; for(src_i = 0, dest_i = 0; src[src_i] != 0; ++src_i) if(src[src_i] != 'h') dest[dest_i++] = src[src_i]; dest[dest_i++] = 0; }