דוגמאות
כעת עומד לרשותנו חלק מאוד משמעותי מהסינטקס של השפה וכדאי להתחיל לתרגל את מה שלמדנו על מנת להתמקצע בו. הקורס נבנה בצורה היררכית - כל שלב שנלמד יתבסס על השלב הקודם ולכן כדאי לוודא שאתם מצליחים לפתור בהצלחה את התרגילים לפני שממשיכים להרצאה הבאה.
דוגמא 1
נניח שאנחנו רוצים להדפיס את כל המספרים בין 0 ל-100 חוץ ממה שמתחלק ב-3:
#define N 100
int main() {
for(int i = 0; i < N; i++) {
if(i % 3 == 0) {
continue;
}
printf("%d\n", i);
}
}
דוגמא 2
נמצא את המספר החיובי הראשון שקטן ממיליון וסכום ספרותיו הוא 34:
#include <stdio.h>
#define UPPER_BOUND 1000 * 1000
#define WANTED_SUM 34
#define NOT_FOUND -1
int main() {
int wanted_num = NOT_FOUND;
for (int i = 0; i < UPPER_BOUND; i++) {
int sum = 0;
int n = i;
while (n > 0) {
sum += n % 10;
if (sum > WANTED_SUM) {
break;
}
n /= 10;
}
if (sum == WANTED_SUM) {
wanted_num = i;
break;
}
}
if (wanted_num != NOT_FOUND) {
printf("wanted number = %d\n", wanted_num);
} else {
printf("No such number exists\n");
}
}
לאחר מציאת מספר המקיים את התנאי אין צורך להמשיך לחשב ולכן נבצע break.
דוגמא 3
בהנתן שני מספרים חיוביים, מצאו את המספר הקטן ביותר ביניהם שמכפלת ספרותיו גדולה ממיליון ושאין לו אף ספרה זוגית:
#define SUM_LIMIT 500
#include <stdbool.h>
#include <stdio.h>
#define PRODUCT_LIMIT 1000 * 1000
#define NOT_FOUND -1
int main() {
int lower_limit, upper_limit;
do {
scanf("%d %d", &lower_limit, &upper_limit);
} while (lower_limit < 0 || upper_limit < 0 || lower_limit >= upper_limit);
int result = NOT_FOUND;
for (int i = lower_limit; i < upper_limit; i++) {
int product = 1;
bool found = true;
for (int n = i; n > 0; n /= 10) {
int digit = n % 10;
if (digit % 2 == 0) {
found = false;
break;
}
product *= digit;
}
if (found && product > PRODUCT_LIMIT) {
result = product;
break;
}
}
if (result != NOT_FOUND) {
printf("Result = %d\n", result);
} else {
printf("No result between %d and %d\n", lower_limit, upper_limit);
}
}
הערה: פקודות break ו-continue מתייחסות ללולאה הפנימית ביותר בהן הן משומשות. לכן למשל בדוגמא השנייה היינו צריכים להשתמש פעמיים ב-break בשביל לצאת משתי לולאות בהתאמה.
דרך נפוצה להשתמש ב-break היא ביציאה מלולאות אינסופיות:
#include <stdio.h>
int main() {
int input;
while(1) {
printf("Enter a positive number\n");
scanf("%d", &number);
if(number <= 0) {
printf("%d is not positive\n", number);
} else {
break;
}
// Do stuff with positive number
}
}
דוגמאות
כעת עומד לרשותנו חלק מאוד משמעותי מהסינטקס של השפה וכדאי להתחיל לתרגל את מה שלמדנו על מנת להתמקצע בו. הקורס נבנה בצורה היררכית - כל שלב שנלמד יתבסס על השלב הקודם ולכן כדאי לוודא שאתם מצליחים לפתור בהצלחה את התרגילים לפני שממשיכים להרצאה הבאה.
- כתבו תוכנית המקבלת מהמשתמש רצף של תווי ASCII וסוכמת את כל המספרים מתוכם. אם התו הוא מספר בין 0-9, התוכנית מוסיפה אותו לסכום - אם הוא אינו מספר, התוכנית מסיימת ומדפיסה את התוצאה. אם המשתמש לא הכניס אף מספר נגדיר את הסכום להיות 0.
- כתבו תוכנית שמקבלת מספר שלם מהמשתמש ומדפיסה כמה ספרות יש בו.
- כתבו תוכנית שמקבלת מספר שלם מהמשתמש ומדפיסה את הספרה הכי גדולה בו.
- כתבו תוכנית המדפיסה את לוח הכפל מ-1 ועד 9.
#include <stdio.h>
int main() {
int sum = 0;
char input;
while(1) {
scanf("%d", &input);
if(input >= '0' && input <= '9') {
sum += input - '0';
} else {
break;
}
}
printf("sum = %d\n", sum);
}
#include <stdio.h>
int main() {
int num = -1;
scanf("%d", &num);
int digits = 1;
while(num > 0) {
num /= 10;
}
printf("%d digits\n", digits);
}
#include <stdio.h>
int main() {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
printf("%d ", i * j);
}
printf("\n");
}
}
שאלות נוספות
-
מספר פלינדרום הוא מספר שנקרא אותו דבר כאשר הופכים אותו. למשל, המספר
12321הוא פלינדרום בעוד ש-12345אינו פלינדרום. כתבו תוכנית שמקבלת מספר מהמשתמש ומדפיסה האם הוא פלינדרום או לא. -
כתבו תוכנית שמקבלת מספר מהמשתמש ומדפיסה באופן סדרתי את סכום ספרותיו עד שנשארת רק ספרה אחת. לדוגמא, עבור המספר
923יודפס:923, 14, 5. -
כתבו תוכנית שמקבלת מספר מהמשתמש ומדפיסה את הפירוק שלו לגורמים ראשוניים. למשל, עבור המספר
360יודפס2 2 2 3 5, מכיוון שמתקיים \(360 = 2^3 \cdot 3^2 \cdot 5\). -
קראו מספר בינארי מהמשתמש שמכיל רק את הספרות
0ו-1והדפיסו את ההצגה העשרונית של אותו מספר. לדוגמא, עבור111יודפס7, ועבור1011יודפס11.