Professional Documents
Culture Documents
C Task Solutions-Www - Underwar.co - Il
C Task Solutions-Www - Underwar.co - Il
-1-
nir@underwar.co.il ניר אדר
.1תוכן עניינים
-2-
nir@underwar.co.il ניר אדר
-3-
nir@underwar.co.il ניר אדר
.2פתיחה
מאגר התשובות לשפת Cמכיל פתרונות לכל התרגילים המופיעים במאגר השאלות אותו
פרסמתי בשנת ,2001ועדכנתי לאחרונה ב .2005-השאלות הינן שאלות שנאספו לאורך
השנים בהן העברתי שיעורים פרטיים בנושא שפת ,Cוהן נבחרו כך שיקיפו את כל יסודות
השפה ויאפשרו לפותר אותן להתקל במצבים רבים הקיימים בעולם התכנות.
שנים רבות מסמך הפתרונות היה בכתיבה וחיכה להשלמה בין כל המשימות האחרות שלי.
כעת סוף סוף המאגר הושלם והרי הוא לפניכם .המאגר שלפניכם מתאים לגירסה 1.03של
מסמך השאלות .תיקונים והערות יתקבלו בברכה.
מאגר זה אינו מכיל פתרונות מנומקים אלא דוגמאות קוד בלבד .ככל שהזמן יאפשר ,אוציא
בעתיד גרסה מורחבת שתכלול גם הסברים והכוונות לדרכי הפתרון המוצגות במסמך זה.
ניר אדר,
יוני 2007
-4-
nir@underwar.co.il ניר אדר
קלט פלט.3
רמה קלה.3.1
1 תרגיל
#include <stdio.h>
int main()
{
printf("************\n");
printf("* I Love C *\n");
printf("************\n");
return 0;
}
2 תרגיל
#include <stdio.h>
int main()
{
printf("34\n4535\n7899\n23\n");
return 0;
}
3 תרגיל
#include <stdio.h>
int main()
{
printf("I love learning C\n");
printf("I\nlove\nlearning\nC\n");
printf("$$$$$$$$$$$$$$$$$$$$$\n");
printf("$ I love learning C $\n");
printf("$$$$$$$$$$$$$$$$$$$$$\n");
return 0;
}
-5-
nir@underwar.co.il ניר אדר
משתנים.4
רמה קלה.4.1
1 תרגיל
#include <stdio.h>
int main()
{
int x, y;
2 תרגיל
#include <stdio.h>
int main()
{
int x, y, z;
double average;
-6-
nir@underwar.co.il ניר אדר
רמה בינונית.4.2
1 תרגיל
:פלט התוכנית
5
2 תרגיל
#include <stdio.h>
int main()
{
int rails_number;
printf("Please enter number of nails: ");
scanf("%d", &rails_number);
return 0;
}
3 תרגיל
#include <stdio.h>
int main()
{
int x1, y1;
int x2, y2;
int len1, len2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
return 0;
}
-7-
nir@underwar.co.il ניר אדר
4 תרגיל
5 תרגיל
#include <stdio.h>
int main()
{
int road;
int speed;
return 0;
}
-8-
nir@underwar.co.il ניר אדר
הסתעפויות.5
רמה קלה.5.1
1 תרגיל
#include <stdio.h>
int main()
{
int x1, x2, x3, max;
printf("Please enter 3 numbers: ");
scanf("%d%d%d", &x1, &x2, &x3);
return 0;
}
2 תרגיל
#include <stdio.h>
int main()
{
int num, abs_value;
printf("Please enter a number: ");
scanf("%d", &num);
return 0;
}
-9-
nir@underwar.co.il ניר אדר
3 תרגיל
#include <stdio.h>
int main()
{
int age, drink;
printf("Welcome to BAR system.\n");
printf("Enter your age: ");
scanf("%d", &age);
if (age < 18)
{
printf("Sorry, you're too young to use the BAR system,
Goodbye.\n");
return 0;
}
return 0;
}
רמה בינונית.5.2
1 תרגיל
#include <stdio.h>
#include <math.h>
int main()
{
int a, b, c;
int delta;
double real, img;
printf("Please enter a, b, c: ");
scanf("%d%d%d", &a, &b, &c);
-10-
nir@underwar.co.il ניר אדר
/* One-degree equation? */
else if (a == 0)
{
printf("X = %.2lf\n", (double)-c / b);
return 0;
}
/* Calculate delta */
delta = b*b - 4*a*c;
/* x1 */
printf("X1 = ");
if (real != 0)
{
printf("%.2lf", real);
if (img > 0) printf(" + ");
else if (img < 0) printf(" - ");
if (img == 1 || img == -1) printf("i\n");
else printf("%.2lfi\n", img);
return 0;
}
else
{
if (img == 1) printf("i\n");
else if (img == -1) printf("-i\n");
else printf("%.2lfi\n", img);
}
/* x2 */
UnderWarrior Project http://www.underwar.co.il
-11-
nir@underwar.co.il ניר אדר
img = -img;
printf("X2 = ");
if (real != 0)
{
printf("%.2lf", real);
if (img > 0) printf(" + ");
else if (img < 0) printf(" - ");
if (img == 1 || img == -1) printf("i\n");
else printf("%.2lfi\n", img);
return 0;
}
else
{
if (img == 1) printf("i\n");
else if (img == -1) printf("-i\n");
else printf("%.2lfi\n", img);
return 0;
}
}
return 0;
}
2 תרגיל
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535897932384626433832795
int main()
{
/* Variables for storing input from the user */
double num;
char action;
-12-
nir@underwar.co.il ניר אדר
break;
case 'R':
rad_value = num;
deg_value = num / PI * 180;
break;
default:
printf("Error: Unknown Action\n");
return 0;
break;
}
/* Output results */
printf("%.3lf Degrees = %.3lf Radians\n",
deg_value, rad_value);
printf("cos(%.3lf) = %.3lf, sin(%.3lf) = %.3lf\n",
deg_value, cos(rad_value), deg_value, sin(rad_value));
return 0;
}
רמה קשה.5.3
1 תרגיל
-13-
nir@underwar.co.il ניר אדר
לולאות.6
רמה קלה.6.1
1 תרגיל
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i == 7) continue;
printf("%d\t", i);
}
putchar('\n');
return 0;
}
2 תרגיל
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 100; i++)
{
if (i % 7 == 0 && i % 3 == 0) printf("%d\t", i);
}
putchar('\n');
return 0;
}
3 תרגיל
int azeret(int n)
{
int result = 1, i;
for (i = 1; i <= n; ++i) result *= i;
return result;
}
-14-
nir@underwar.co.il ניר אדר
4 תרגיל
5 תרגיל
int fib(int n)
{
int num1 = 0, num2 = 1, cur, cur_index = 1;
if (n < 2) return n;
return cur;
}
6 תרגיל
int prime(int n)
{
int i;
for (i = 2; i < n; i++)
{
if (n % i == 0) return 0;
}
return 1;
}
-15-
nir@underwar.co.il ניר אדר
7 תרגיל
void kefel()
{
int i, j;
8 תרגיל
9 תרגיל
#include <stdio.h>
int main()
{
int sum = 0, num;
while (scanf("%d", &num) == 1) sum += num;
printf("The sum is %d\n", sum);
return 0;
}
10 תרגיל
-16-
nir@underwar.co.il ניר אדר
11 תרגיל
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, number, tries;
return 0;
}
-17-
nir@underwar.co.il ניר אדר
רמה בינונית.6.2
1 תרגיל
return counter;
}
2 תרגיל
return sum;
}
3 תרגיל
int main()
{
int max1, max2, max3;
int i1, i2;
int x;
-18-
nir@underwar.co.il ניר אדר
max2 = i2;
max3 = x;
}
i1 = i2;
i2 = x;
}
printf("maximum : %d %d %d\n", max1, max2, max3);
return 0;
}
4 תרגיל
#include <stdio.h>
int main()
{
int n1, n2;
scanf("%d%d",&n1, &n2);
if (n1 > n2) swap(&n1, &n2);
return 0;
}
-19-
nir@underwar.co.il ניר אדר
5 תרגיל
.1 מתרגילdigits_number()-הפתרון משתמש ב
int digits_number(unsigned long x)
{
int counter = 0;
while (x > 0)
{
counter++;
x /= 10;
}
return counter;
}
6 תרגיל
void print_zigzag()
{
int i = 1, negative = 1;
for (i = 1; i <= 10; ++i)
{
printf("%d\t", i*negative);
negative *= -1;
}
}
-20-
nir@underwar.co.il ניר אדר
7 תרגיל
if (scanf("%d", &max) != 1)
{
printf("Input Error\n");
return -1;
}
while (scanf("%d", &cur) == 1)
{
if (cur > max) max = cur;
}
return 0;
}
8 תרגיל
return 0;
}
-21-
nir@underwar.co.il ניר אדר
רמה קשה.6.3
1 תרגיל
#include <stdio.h>
int main()
{
int n, k;
int n1, n2, k1, k2;
printf("Please enter n, k: ");
scanf("%d%d", &n, &k);
-22-
nir@underwar.co.il ניר אדר
2 תרגיל
-23-
nir@underwar.co.il ניר אדר
מצביעים.7
רמה קלה.7.1
1 תרגיל
רמה בינונית.7.2
1 תרגיל
i = 5, j = 10
i = 31, j = 5
2 תרגיל
-24-
nir@underwar.co.il ניר אדר
מערכים.8
רמה קלה.8.1
1 תרגיל
2 תרגיל
return 0;
}
-25-
nir@underwar.co.il ניר אדר
3 תרגיל
void Analyze_array(int* arr, int arr_size, int *x1, int *x2, double
*x3)
{
int min = arr[0];
int max = arr[0];
int sum = 0;
int counter;
*x1 = min;
*x2 = max;
*x3 = (double)sum / arr_size;
}
4 תרגיל
int main()
{
int arr1[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int arr2[10] = { 0 };
int arr3[10], counter;
for (counter = 0; counter < 10; counter++) arr[counter] = 0;
}
אתחול מפורש: אנו יכולים לעשות זאת בשתי דרכים,7-אם נדרש לאתחל את כל התאים ל
.arr2 לא ניתן להשתמש בטריק שהשתמשנו בו במקרה של. או לולאה,תא אחר תא
5 תרגיל
#define N 10
typedef int mat[N][N];
int sum_matrix(mat m)
{
int i, sum = 0;
for (i = 0; i < N; ++i) sum += m[i][i];
return sum;
}
-26-
nir@underwar.co.il ניר אדר
6 תרגיל
7 תרגיל
8 תרגיל
-27-
nir@underwar.co.il ניר אדר
רמה בינונית.8.2
1 תרגיל
2 תרגיל
#define TRUE 1
#define FALSE 0
-28-
nir@underwar.co.il ניר אדר
3 תרגיל
#include <stdio.h>
#define NUMBER_OF_DAYS 7
int main()
{
// holds the number of tickets ordered in each day
int days[NUMBER_OF_DAYS] = { 0 };
int cur_day, tickets_number;
// get all the data about the tickets from the user
while (scanf("%d%d", &cur_day, &tickets_number) == 2)
{
if (cur_day < 0 || cur_day >= NUMBER_OF_DAYS)
{
printf("ERROR: invalid date\n");
continue;
}
if (tickets_number < 0)
{
printf("ERROR: invalid number of tickets\n");
continue;
}
days[cur_day] += tickets_number;
}
-29-
nir@underwar.co.il ניר אדר
putchar('\n');
}
for (print_counter = 0; print_counter < 10; ++print_counter)
printf("%d\t", print_counter);
putchar('\n');
system("PAUSE");
return 0;
}
4 תרגיל
#include <stdio.h>
#define X 10
#define Y 20
#define SUCCESS 1
#define FAILURE 0
#define FREE 0
#define OCCUPIED 1
int main()
{
Cinema theCinema = { 0 };
int tickets;
int x, y;
-30-
nir@underwar.co.il ניר אדר
return FAILURE;
}
-31-
nir@underwar.co.il ניר אדר
מיונים.9
רמה קלה.9.1
1 תרגיל
-32-
nir@underwar.co.il ניר אדר
2 תרגיל
void merge(int a[], int na, int b[], int nb, int c[])
{
int i=0,j=0,k=0;
-33-
nir@underwar.co.il ניר אדר
מחרוזות .10
רמה קלה.10.1
1 תרגיל
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
system("PAUSE");
return 0;
}
2 תרגיל
3 תרגיל
-34-
nir@underwar.co.il ניר אדר
4 תרגיל
char make_cap(char c)
{
if (c >= 'a' && c <= 'z') return c - 'a' + 'A';
else return c;
}
רמה בינונית.10.2
1 תרגיל
#define TRUE (1)
#define FALSE (0)
/* skip spaces */
while (*s == ' ') ++s;
-35-
nir@underwar.co.il ניר אדר
/* print results */
/* TASK FOR THE READER :) */
}
-36-
nir@underwar.co.il ניר אדר
רקורסיה .11
רמה קלה.11.1
1 תרגיל
void tryangle(int n)
{
int i;
if (n > 1) tryangle(n-1);
for (i = 0; i < n; i++) putchar('*');
putchar('\n');
}
2 תרגיל
int azeret(int n)
{
if (n == 0) return 1;
return azeret(n-1) * n;
}
3 תרגיל
-37-
nir@underwar.co.il ניר אדר
4 תרגיל
int fib(int n)
{
if (n < 2) return n;
return fib(n-1)+fib(n-2);
}
5 תרגיל
6 תרגיל
print_reverese(arr+1, n-1);
printf("%d ", arr[0]);
}
7 תרגיל
void print(int n)
{
if (n == 1)
{
printf("ab");
return;
}
putchar('a');
print(n-1);
putchar('b');
}
-38-
nir@underwar.co.il ניר אדר
תרגיל 8
תשובה :הפונקציה מחזירה את הערך המוחלט של האיבר במערך שערכו המוחלט הוא
הגדול ביותר.
-39-
nir@underwar.co.il ניר אדר
רמה בינונית.11.2
1 תרגיל
strcpy_rec(str1+1, str2+1);
return str1;
}
-40-
nir@underwar.co.il ניר אדר
2 תרגיל
3 תרגיל
ולכן אנחנו יכולים לבחור כל ערך,נשים לב שבתרגיל לא הוגדר הערך המוחזר של הפונקציה
.שיהיה לנו נוח
במקרה של התרגיל הנוכחי המידע שחסר לנו עם התחלת הרקורסיה הוא ערכו של התו
ולהשתמש, ולכן נוח לנו להגדיר כי הפונקציה תחזיר לנו את ערכו של התו האחרון,האחרון
.בהנחה זו בצעד הרקורסיה
char print_last(char* s)
{
char last;
if (s[2] == '\0')
{
if (s[0] < s[1]) putchar(s[0]);
return s[1];
}
last = print_last(s+1);
if (s[0] < last) putchar(s[0]);
return last;
}
4 תרגיל
max = max_arr(arr+1,n-1);
if (abs(max) > abs(a[0])) return max;
return a[0];
}
-41-
nir@underwar.co.il ניר אדר
5 תרגיל
#include <stdio.h>
int is_prime(int n)
{
if (n < 4) return 1;
return is_prime_helper(n, 2);
}
int main()
{
int num;
printf("Please enter a number: ");
scanf("%d", &num);
printf("IsPrime=%d\n", is_prime(num));
return 0;
}
6 תרגיל
#include <stdio.h>
temp1 = square_sum(N-1);
temp2 = square_sum(N-2);
-42-
nir@underwar.co.il ניר אדר
int main()
{
int val;
val = square_sum2(7);
printf ("%d\n",val);
return 0;
}
רמה קשה.11.3
1 תרגיל
temp = s[1];
s[1] = s[0];
last = between(s+1);
s[1] = temp;
return last;
}
-43-
nir@underwar.co.il ניר אדר
2 תרגיל
.א
return;
}
.ב
return;
}
3 תרגיל
#include <stdio.h>
int print_series(int n)
{
int val;
-44-
nir@underwar.co.il ניר אדר
)if (n == 1
{
;)printf("%d ", n
;return 1
}
;)val = print_series(n-1
)(int main
{
;)print_series(10
;return 0
}
הרעיון:
בסיס האינדוקציה :עבור n=1אנחנו מדפיסים 1ומסיימים.
עבור ,n > 1אנחנו למעשה מוסיפים n-1לסכום שחושב עד הצעד ה) n-1-הצעד הקודם(,
ולכן קודם נחשב )ונדפיס( בצורה רקורסיבית את כל הערכים הקודמים .אנחנו מניחים
שהרקורסיה מחזירה לנו את הסכום של האיברים עד האיבר ה) n-1-כולל() ,הסכום נשמר
במשתנה (valולכן כל מה שעלינו לעשות זה להוסיף n-1לסכום ולהדפיס אותו.
-45-
nir@underwar.co.il ניר אדר
רמה קלה.12.1
1 תרגיל
2 תרגיל
#include <stdio.h>
#define N 8
typedef enum { FAIL, SUCCESS } Result;
-46-
nir@underwar.co.il ניר אדר
int main()
{
int Locations[N] = { 0 }, Cols[N] = { 0 }, Rows[N] = { 0 };
int diagonal1[2*N] = { 0 }, diagonal2[2*N] = { 0 };
if (Solve(Locations, Cols, Rows, diagonal1, &diagonal2[N], 0)
== SUCCESS) PrintResult(Locations);
return 0;
}
-47-