تمرینات فصل 3


1ـ برنامهای بنویسید که شماره دانشجویی و معدل تعداد n دانشجو را از ورودی خوانده، دانشجویی را که دومین معدل را از نظر بزرگی دارد پیدا کند و به خروجی ببرد؟

جواب:ابتدا باید بدانیم که در این برنامه اگر تعداد دانشجوها از 2 کمتر باشد نمیتوانیم دومین معدل را محاسبه کنیم، پس برنامه پیغام Error را چاپ کرده و خارج میشود.

n : تعداد دانشجوها
i : ّشمارنده
id-max1 : شماره دانشجویی دانشجو با بالاترین معدل
id-max2 : شماره دانشجویی دانشجو با دومین معدل از نظر بزرگی
ave-max1 : بالاترین معدل
ave-max2 : دومین معدل از نظر بزرگی
id : شماره دانشجویی گرفته شده از ورودی
ave : معدل گرفته شده از ورودی

#include≤stdio.h>
#include≤conio.h>
int main()
{
int n, i=0, id_max1, id_max2, id;
float ave_max1, ave_max2, ave;
clrscr();
printf("Please enter number of student: ");
scanf("%d",&n);
if(n<2)
{
printf("\n Error");
return 0;
}
printf("\n Please enter %d id: ",i+1);
scanf("%d",&id);
printf("\n Please enter %d average: ",i+1);
scanf("%f",&ave);
id_max1=id;
id_max2=id;
ave_max1=ave;
ave_max2=ave;
i++;
printf("\n Please enter %d id: ",i+1);
scanf("%d",&id);
printf("\n Please enter %d average: ",i+1);
scanf("%f",&ave);
if(ave>ave_max1)
{
ave_max1=ave;
id_max1=id;
}
else
{
ave_max2=ave;
id_max2=id;
}
i++;
for(i=3 ; i<=n ; i++)
{
printf("\n Please enter %d id: ",i);
scanf("%d",&id);
printf("\n Please enter %d average: ",i);
scanf("%f",&ave);
if(ave>=ave_max1)
{
ave_max2=ave_max1;
id_max2=id_max1;
ave_max1=ave;
id_max1=id;
}
elseif(ave>=ave_max2)
{
ave_max2=ave;
id_max2=id;
}
}
printf("\n the average is: %.2f , the id is: %d",ave_max2, id_max2);
getch();
return 0;
}



ـ برنامهای بنویسید که اعدادی را از ورودی خوانده تشخیص دهد که آیا اعداد مورد نظر، کامل هستند یا خیر، عددی کامل است که مجموع مقسوم علیههای آن (به جز خودش) با آن عدد برابر باشد. پس از بررسی هر عدد، برنامه باید از کاربر سوال کند که میخواهد بکارش ادامه دهد یا خیر؟

جواب:در این مسئله چون تعداد اعداد مشخص نشده است پس باید در هر مرحله از کاربر سوال شود که برای تشخیص عدد دیگری را در نظر دارد یا نه و بر اساس پاسخ کاربر مراحل مورد نظر اجرا شود.

n : عدد مورد نظر
i : ّشمارنده
s : شماره دانشجویی دانشجو با بالاترین معدل
sum : مجموع مقسوم علیهها
r : باقیمانده تقسیم
کد PHP:


#include≤stdio.h>
#include≤conio.h>
int main()
{
int n, i, sum, r;

char s='y';
clrscr();
while(s=='y')
{
sum=0;
printf("\n Please enter your number: ");
scanf("%d",&n);
for(i=1 ; i
{
r=n%i;
if(r==0)
sum=sum+i;
}
if(sum==n)
printf("\n %d is perfect number ",n);
else
printf("\n %d is not perfect number ",n);
printf("\n do you have another number?(y/n): ");
s=getche();
}
getch();
return 0;
}




3ـ برنامهای بنویسید که خروجی زیر را در صفحه نمایش تولید کند.
*
**
***
****
*****
******

جواب:این مسئله از طریق دو حلقه for تو در تو حل میشود. حلقهی اول برای مشخص کردن شمارهی سطرها و حلقهی دوم برای مشخص کردن تعداد ستارهها در هر سطر که در این مسئله برابر همان شماره سطر میباشد.

i : شمارنده حلقه اول
j : ّشمارنده حلقه دوم
#include≤stdio.h>
#include≤conio.h>
int main()
{
int i, j;
clrscr();
for(i=1 ; i<=6 ; i++)
{
printf("\n");
for(j=1 ; j<=i ; j++)
printf("*");
}
getch();
return 0;
}



4ـ برنامهای بنویسید که کاراکتری را که نشان دهنده رنگی است از ورودی خوانده، به شما بگوید که چه رنگی را میخواهد انتخاب کند. مثلا اگر کاربر حرف ‘r’ را وارد کرد برنامه به او بگوید که دوست دارد رنگ قرمز را انتخاب کند. برای تمام موارد، حروف کوچک و بزرگ کنترل شود، مثلا ‘r’ و ‘R’برای رنگ قرمز.

جواب:
s : کاراکتر مشخص کننده یک رنگ
s فقط میتواند معرف رنگ قرمز، سبز، سفید، مشکی و زرد باشد و رنگهای دیگر در برنامه تعریف نشده هستند.

#include≤stdio.h>
#include≤conio.h>
int main()
{
char s;
clrscr();
for(
{
printf("\n please enter first character of color: ");
s = getche();
if(s=='r'||s=='R')
printf("\n your color is Red");
elseif(s=='g'||s=='G')
printf("\n your color is Green");
elseif(s=='w'||s=='W')
printf("\n your color is White");
elseif(s=='b'||s=='B')
printf("\n your color is Black");
elseif(s=='y'||s=='Y')
printf("\n your color is Yellow");
else
printf("\n your selected no color");
}
getch();
return 0;
}



5ـ برنامهای بنویسید که تعداد n جمله از سری فیبوناجی را تولید کند.
سری فیبوناجی= 1 1 2 3 5 8 13 …
جواب:
i : شمارنده حلقه
n : تعداد جملات
fi : جملهی شماره i از سری فیبوناجی
temp : متغیر کمکی
#include≤stdio.h>
#include≤conio.h>
int main()
{
int i, n, f1=1 , f2=1 , temp;
clrscr();
scanf("%d",&n);
for(i=1 ; i<=n ; i++)
{
printf("%d ",f1);
temp = f2;
f2 = f1+f2;
f1 = temp;
}
getch();
return 0;
}


6ـ برنامهای بنویسید که دو عدد صحیح مثبت را از ورودی خوانده، آنها را به روش تفریق بر هم، تقسیم کند؟

جواب:
x : عدد اول
y : عدد دوم
i : ّشمارنده و بعد از اجرای برنامه i برابر است با خارج قسمت تقسیم
temp : متغیر کمکی
#include≤stdio.h>
#include≤conio.h>
int main()
{
int i=1, x, y, temp;
clrscr();
printf("\n please enter number(x,y);\n");
scanf("%d%d",&x,&y);
temp = x;
while(x>y)
{
x = x-y;
i++;
}
printf("\n %d / %d = %d",temp,y,i);
getch();
return 0;
}


7ـ برنامهای بنویسید که شماره کارمندی و حقوق تعدادی از کارکنان مؤسسهای را دریافت کرده، بر اساس تعرفه زیر، مالیات حقوق آنها را محاسبه کند و به خروجی ببرد. سپس مشخص کند بیشترین دریافتی مربوط به کدام کارمند است؟
از مالیات معاف <400,000 حقوق
10 درصد نسبت به مازاد <500,000 حقوق 400,001<
15 درصد نسبت به مازاد <700,000 حقوق 500,001<
17 درصد نسبت به مازادحقوق 7000,000<

جواب:
n: تعداد کارکنان
i: شمارنده
id: شماره کارمندی
s: حقوق هر کارمند
mal: مالیات مربوط به هر کارمند
max: بالاترین دستمزد
idmax: شماره کارمندی که بالاترین حقوق را دارد


#include≤stdio.h>
#include≤conio.h>
int main()
{
int id, idmax, n, i;
float s, mal, max=0.0;
clrscr();
printf("\n please enter number(n): ");
scanf("%d",&n);
for(i=1 ; i<=n ; i++)
{
printf("\n please enter %d ID: ",i);
scanf("%d",&id);
printf("\n please enter %d salary: ",i);
scanf("%f",&s);
if(s<=400000)
mal = 0.0;
elseif(s>400000 && s<=500000)
mal = 0.1*s;
elseif(s>500000 && s<=700000)
mal = 0.15*s;
elseif(s>700000)
mal = 0.17*s;
printf(" maliat is: %1.2f\n",mal);
if(s>max)
{
max=s;
idmax=id;
}
}
printf("\n the MAX is: %f and ID is: %d",max , idmax);
getch();
return 0;
}

8ـ خروجی دستورات زیر را بنویسید.
x = 5;
while(--x>0)
printf(“%3d”,x);
جواب:
ابتدا در دستور - - x یک واحد از x کم شده و بعد مقایسه انجام میشود. در دستور printf ، %3d نشاندهندهی آن است که طول میدان 3 میباشد و چون اعداد تک رقمی هستند و طول آنها از میدان کمتر است پس اعداد در سمت راست قرار گرفته و دو واجد قبل از آنها خالی میماند.
خروجی برنامه : _ _ 4 _ _ 3 _ _ 2 _ _ 1


9ـ دستورات زیر را با for بنویسید.
int i=1;
while(i<=10)
{
if(i<5 && i!=2)
printf("%c",x);
i++
}

جواب:
int i;
for(i=1 ; i<=10 ; i++)
{
if(i<5 && i!=2)
printf("%c",x);
}

10ـ برنامهای بنویسید که حاصل عبارت زیر را محاسبه کند (n<10).
1 + 1/2! + 1/3! + … + 1/n!

جواب:
i: شمارندهی حلقهی بیرونی
j: شمارنده حلقه داخلی
n: تعداد کل جملات
s: مجموع کل جملات
fac: حاصل فاکتوریل موجود در کسر هر جمله
برای تعریف متغیر fac از long int استفاده میکنیم چون حاصل فاکتوریل اعداد بزرگ طول زیادی دارند.
#include≤stdio.h>
#include≤conio.h>
int main()
{
int n, i, j;
float sum=1.0;
longint fac;
clrscr();
printf("\n please enter number<10: ");
scanf("%d",&n);
printf("\n 1");
for(i=2 ; i<=n ; i++)
{
printf("+1/%d!",i);
fac = 1;
for(j=1 ; j<=i ; j++)
fac = fac*j;
sum = sum + 1.0/fac;
}
printf("= %f",sum);
getch();
return 0;
}

11ـ برنامهای بنویسید که عددی را در مبنای a گرفته، آنرا به مبنای b ببرد.
جواب:
برای حل این مسئله ابتدا باید عدد در مبنای a را به عددی در مبنای 10 تبدیل کنیم، برای این امر ابتدا عدد در مبنای a را به 10 تقسیم میکنیم تا اولین رقم سمت راست عدد در مبنای a بدست آید (باقیمانده تقسیم) و بعد از آن را در a به توان صفر (i) ضرب میکنیم و بعد خارج قسمت تقسیم را دوباره بر 10 تقسیم میکنیم تا رقم دوم نیز بدست آید یک واحد به i اضافه میکنیم و بعد رقم را در a به توان i ضرب میکنیم، آنقدر این کار را ادامه میدهیم تا خارج قسمت صفر شود. این روش برای تبدیل یک عدد مبنای a به عدد مبنای 10 در ریاضی بکار میرود و بعد از آن عدد مبنای 10 را به عدد مبنای b تبدیل میکنیم. برای این تبدیل عدد را به b تقسیم کرده و باقیمانده را در 10 به توان صفر (i) ضرب میکنیم سپس خارج قسمت این تقسیم را نیز دوباره به b تقسیم کرده و باقیمانده را در 10 به توان i+1 ضرب میکنیم، این کار را آنقدر تکرار میکنیم تا خارج قسمت صفر شود این روش برای تبدیل عدد در مبنای 10 به عدد در مبنای b در ریاضیات بکار میرود.
a: مبنای عدد اول
b: مبنای عدد دوم
na: عدد در مبنای a
nb: عدد در مبنای b
n10: عدد در مبنای 10
#include≤stdio.h>
#include≤conio.h>
#include≤math.h>
int main()
{
longint a, b, na, nb, n10, i;
clrscr();
printf("\n please enter na: ");
scanf("%ld",&na);
printf("\n please enter a: ");
scanf("%ld",&a);
printf("\n please enter b: ");
scanf("%ld",&b);
n10 = 0;
i = 0;
while(na>0)
{
n10 = n10 + ((na%10)*pow(a,i));
na = na / 10;
i++;
}
nb = 0;
i = 0;
while(n10>0)
{
nb = nb + ((n10%b)*pow(10,i));
n10 = n10 / b;
i++;
}
printf("\n nb is : %ld", nb);
getch();
return 0;
}


12ـ برنامهای بنویسید که عددی از 1 تا 7 را از ورودی خوانده، روزی از هفته که معادل با آن است در خروجی چاپ کند (با switch).
جواب:
day: شماره مورد نظر

#include≤stdio.h>
#include≤conio.h>
int main()
{
int day;
clrscr();
for(
{
printf("\n please enter number of day(1....7): ");
scanf("%d",&day);
switch(day)
{
case 1:
printf("**Saturday**");
break;
case 2:
printf("**Sunday**");
break;
case 3:
printf("**Monday**");
break;
case 4:
printf("**Tuseday**");
break;
case 5:
printf("**Wednesday**");
break;
case 6:
printf("**Thursday**");
break;
case 7:
printf("**Friday**");
break;
default:
printf("\n your number is False, please try again...");
break;
}
}
getch();
return 0;
}


13ـ برنامهای بنویسید که سال تولد کاربر و سال فعلی را از ورودی خوانده، مشخص کند که او چند سال، چند ماه، چند روز، چند ساعت، چند دقیقه و چند ثانیه عمر کرده است.
جواب:
هر سال 12 ماه است، هر ماه 30 روز، هر روز 24 ساعت، هر ساعت 60 دقیقه و هر دقیقه 60 ثانیه است.
y1: سال تولد کاربر
y2: سال فعلی
y: تعداد سالهای محاسبه شده
m: تعداد ماههای محاسبه شده
d: تعداد روز محاسبه شده
h: تعداد ساعت محاسبه شده
mn: تعداد دقیقه محاسبه شده
s: تعداد ثانیه محاسبه شده

#include≤stdio.h>
#include≤conio.h>
int main()
{
int y1, y2, y, m;
longint d, h, mn, s;
clrscr();
printf("\n your enter year of your brithday: ");
scanf("%d",&y1);
printf("\n your enter this year: ");
scanf("%d",&y2);
y = y2 - y1;
m = y * 12;
d = m * 30;
h = d * 24;
mn = h * 60;
s = mn * 60;
printf("\n your age is %d years and %d months and %ld days and %ld hours and %ld minutes and %ld seconds ",y,m,d,h,mn,s);
getch();
return 0;
}


14ـ برنامهای بنویسید که ضرایب معادله درجه دوم را از ورودی گرفته، معادله را حل کند.
جواب:
معادله درجه دوم : ax2 + bx + c = 0

#include≤stdio.h>
#include≤conio.h>
#include≤math.h>
int main()
{
float a, b, c, D, x1, x2;
clrscr();
printf("\n please enter a,b,c:\n");
scanf("%f%f%f",&a,&b,&c);
D = b * b - 4 * a * c;
if (D<0)
printf("\n Error because the answer is not Real");
else
{
x1 = (-b+sqrt(D))/(2*a);
x2 = (-b-sqrt(D))/(2*a);
printf("\n a is: %f, b is: %f, c is: %f >>> x1 is: %f , x2 is: %f",a,b,c,x1,x2);
}
getch();
return 0;
}


15ـ برنامهای بنویسید که با استفاده از حلقههای تو در تو خروجی زیر را تولید کند.
$$$$$$
$$$$$$
$$$$$$
$$$$$$

جواب:
در این مسئله به دو حلقه تو در تو نیازمندیم، حلقهی بیرونی مشخص کننده سطرهای خروجی و حلقهی داخلی مشخص کنندهی تعداد $ها در هر سطر میباشد.
i: شمارنده حلقهی خارجی
j: شمارنده حلقهی داخلی

#include≤stdio.h>
#include≤conio.h>
int main()
{
int i, j;
clrscr();
for(i=1;i<=4;i++)
{
printf("\n");
for(j=1;j<=6;j++)
printf("$");
}
getch();
return 0;
}


16ـ برنامهای بنویسید که دو مقدار اعشاری را از ورودی خوانده و تفاضل حاصلضرب و حاصل تقسیم آنها را محاسبه کرده و به خروجی ببرد. برنامه وقتی خاتمه مییابد که هر دو عدد اعشاری صفر باشند.

جواب:
x: عدد اعشاری اول
y: عدد اعشاری دوم
m: ضرب دو عدد اعشاری
n: تقسیم دو عدد اعشاری
s: m-n
#include≤stdio.h>
#include≤conio.h>
int main()
{
float x, y, m, n, s;
clrscr();
for(
{
printf("\n 2 float numberyou can select 0 and 0 for Quit\n");
scanf("%f%f",&x,&y);
if(x==0 && y==0)
break;
else
{
m = x * y;
n = x / y;
s = m - n;
printf("\n (%f*%f) - (%f/%f) = %f",x,y,x,y,s);
}
}
getch();
return 0;
}


17ـ برنامهای بنویسید که یک عدد اعشاری مثل 643.21 را خوانده، وارون آن را بیابد. وارون این عدد 12.346 است.

جواب:

#include≤stdio.h>
#include≤conio.h>
#include≤math.h>
int main()
{
double j, x, xx, a;
longint i;
clrscr();
printf("\n enter float number: ");
scanf("%lf",&x);
a = 0;
i = -1;
xx = x;
while (floor(xx)>0)
{
a+(longint)floor(xx)%10)*pow(10,i));
xx/=10;
i--;
}
i = 0;
j = (longint)x;
while (x!=j)
{
x=x*10;
a+(longint)floor(x)%10)*pow(10,i));
i++;
j=(longint)x;
}
printf("\n number is %f",a);
getch();
return 0;
}


18ـ برنامهای بنویسید که یک عدد اعشاری را از ورودی خوانده، هر یک از قسمتهای صحیح و اعشاری آنرا به صورت یک عدد صحیح به خروجی ببرد. به عنوان مثال، عدد 13.42 به صورت دو عدد صحیح 13 و 42 به خروجی ببرد.

جواب:

#include≤stdio.h>
#include≤conio.h>
#include≤math.h>
int main()
{
float x, r;
int m;
clrscr();
printf("\n enter a float number: ");
scanf("%f",&x);
m = (int)x;
r = x - m;
printf("\n %f = %d + %f",x,m,r);
while (r - floor(r) != 0)
r = 10 * r;
printf("\n %1.0f",r);
getch();
return 0;
}


نکته:
در حل دو مسئله آخر از تابعی به نام تابع floor() استفاده کردیم. این تابع بزرگترین مقدار صحیح کوچکتر یا مساوی یک عدد را که به صورت double نمایش داده میشود محاسبه میکند و الگوی آن به صورت زیر است:
Double floor (double num)
اگر مقدار 1.02 به عنوان آرگومان تابع باشد نتیجه حاصل برابر با 1.0 و اگر عدد -1.20 به عنوان آرگومان تابع باشد نتیجهی حاصل برابر با -1.0 خواهد بود. دستور زیر عدد 10 را به عنوان نتیجه عمل چاپ میکند:
printf(“%f”,floor(10.9));
این تابع جزء توابع ریاضی میباشد بنابراین برای استفاده از این تابع و توابع ریاضی دیگر باید فایل سرآیندتعریف شود.