• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

تمرین هایی برای سی++

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
با اجازه اقا ارش
برنامه ای بنویسید که 10 عدد را از کاربر گرفته و بدون استفاده از دستورات شرطی ای عداد را سورت نماید
در ضمن ببرای گرفتن اعداد میتونید از دستور for استفاده کنید و برای مقایسه انها هیچ دستور شرطی را نمیتوانید استفاده کنید .
از هر الگوریتمی که دوست دارید میتونید استفاده کنید . اما بازم میگم هیچ دستور شرطی را استفاده نکنید .
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
اجازه ما هم دست شماست

یه سوال داشتم منظور شما از دستور شرصی IF و ؟ و switch هست یا علمگر های مقایسه ای؟
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
دقيقا منظورم همين دستوارت شرطي است
يعني if
switch
,و هر دستوري كه توسط ان دستور بتونيم بفهمييم a از به b بزرگ تر است يا نه منظورم دستورات خود سي است
مثلا حتي اين دستور
کد:
for ( i=a; i<b;i++){ // test if a < b with for
i=b; }
// now i has big number

باز از دستورات شرطي استفاده كرده
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
دقيقا منظورم همين دستوارت شرطي است
يعني if
switch
,و هر دستوري كه توسط ان دستور بتونيم بفهمييم a از b بزرگ تر است يا نه منظورم دستورات خود سي است
مثلا حتي اين دستور
کد:
for ( i=a; i<b;i++){ // test if a < b with for
i=b; }
// now i has big number

باز از دستورات شرطي استفاده كرده
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
من منظور شما رو این طوری فهمیدم

کد:
#include <iostream>
#include <conio.h>

using namespace std;

int main(void)
{
   int a[10];

   for(int i=0 ;i<10 ;i++)
   {
   	cout<<"emnter "<<i+1<<"th number";
      cin>>a[i];
   }
   for(int i=0;i<10;i++)
   	for(int j=0;j<10;j++)
      	while(a[i]<a[j])
         {
            int tmp;
            tmp=a[i];
            a[i]=a[j];
            a[j]=tmp;
         }

   for(int i=0;i<10;i++)
   	cout<<a[i]<<endl;
   getch();
	return 0;
}
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
البته با عرض پوزش (از آقا سعید و آقا آرش)
آرش جان باز دستور شرطی داخلش هست :
کد:
while(a[i]<a[j])
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
ارش جان همانطور که دوست عزیزمون گفت ( مهدی جان ) باز هم شما از دستور شرطی حلقه ای استفاده کردید
اگه دقت کنی میشه
خیلی هم سادس
یک راهنمایی از توابع ریاضی استفاده کنید
فرض کنید شما فقط for رو بلد هستید و فقط توابع ریاضی حالا برنامه رو بنویسید
هدفم از طرح این مسئله فهمیدن چگونگی مقایسه اعداد توسط کامپوتر است
دقت کنید منها کردن از روش متمم 2 اگر نتیجه منفی باشه بایت انتهایی f برمیگردونه و اگر مثبت عددی بجز این ( توی حالت ساده که اعداد زیاد از هم بزرگتر نیستند ) و بر اساس این فلگ ها مقدار دهی میشن . اما باز مقایسه ای صورت میگیرد
ما میخواییم بفهمیم کامپوتر با چه اعمال ریاضی مقایسه رو انجام میدهد .
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ببخشید من منظور شما درست متوجه نشدم فکر کردم منظور اینکه فقط if نباشه
ببینید این درسته؟

کد:
#include <iostream>
#include <conio.h>

using namespace std;

inline bool IsMax(int,int);
inline bool IsNegative(int);

int main(void)
{
   int a[10];

   for(int i=0 ;i<10 ;i++)
   {
   	cout<<"emnter "<<(i+1)<<"th number";
      cin>>a[i];
   }
   for(int i=0;i<10;i++)
   	for(int j=0;j<10;j++)
      	for(;IsMax(a[i],a[j]);)
         {
            int tmp;
            tmp=a[i];
            a[i]=a[j];
            a[j]=tmp;
         }


   for(int i=0;i<10;i++)
   	cout<<a[i]<<endl;
    getch();
    return 0;
}

inline bool IsMax(int a,int b)
{
     return IsNegative(b-a)  ;
}

inline bool IsNegative(int a)
{
       return a>>sizeof a -1;
}
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
آرش جان خیلی خوبه اما فکر کنم بازم شرط آمده (البته C++ نمیدونم شاید اشتباه میکنم )
کد:
      	for(;a[i]<a[j];)
         {
            int tmp;

------------------------
من اینو نوشتم امیدوارم درست باشه :
کد:
#include <stdio.h>
#include <conio.h>
#include <math.h>

void main () {
	const k = 3;
	int n[k],min,max,i ;
	for(i=0;i<k;i++)
        	scanf("%d",&n[i]);

	for(i=0;i<k;i++)
        	for(int j=0;j<k-1;j++) {
		min = (n[j] + n[j+1] - abs(n[j+1] - n[j]))/2 ;
		max = n[j]+n[j+1]-min;
		n[j] = min ;
		n[j+1] = max;
		}
	for(i=0,printf("->\n");i<k;i++)
	printf("%4d",n[i]);

getche();
 
}

اگر دو عدد m , nباشند : بین این دو کوچکترین رو از این راه بدست آوردم :
min = (m + n - abs(n - m)) /2
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام ارش جان
تا انجا که من دیدم کدتون و تونستم با تغییراتی اون رو اجرا کنم چون از tc استفاده میکنم ( ورژن 3) شما برای مقایشه از دستور for استفاده کردید . دستور for توی اسمیلی مثل while پس بازم دستور شرطیه
توی صورت مسئله گفتم از while -for- if -loop-untile- do- ودیگر موارد مشابه( البته ممکنه بعضی از دستورات توی سی نباشه الان نمیتونم بگم هست یا نه بدی دونستن چند دستور العمل کد نویسی اینه ) حتی jz -jnz-je-jle-و این دستوارت شرطی اسمبلی برای مقایسه استفاده نکنید برای گرفتن و نوشتن و یا تولید حلقه جهت سورت کردن میتوانید استفاده کنید اما برای مقایسه دو عدد
راستی ارش جان این دو تابع IsMax و IsNegative توی چه کلاسی تعریف شدن من نفهمیدم منظورتون چه کلاسی است . در ضمن اینکلود اول ایراد سینتکسی داره باید بشه iostream.h ( شاید کامپایلر شما ایراد نگیره اما کامپایلر من ایراد میگیره حتی از این دستور هم ایراد میگیره using namespace std میگه توی iostream تعریف شده )
شرمنده اگه بد توضیح دادم -
ولی راه حل اون سادس اگه میخواید بگید تا راه حلشو بگم
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
مهدی جان درسته کدتو تست نکردم اما روش مقایست درسته دقیقا همین طوره
شما وقتی دو عدد دارید میانگین این دو عدد بین اون دوتا است
الا اگر اختلاف انها رو به دست بیارم و از تقسیم بر دو کنیم با اضافه و کم کردن از میانگین عدد بزرگترو کوچکتر بدست میاد
راستی یک نکته
چون 13و 14 دو عدد اینتجر هستند و میانگین اون میشه 13.5 که چون اعداد اینتیجره میشه 13 و ممکنه مشکل ساز بشه البته توی کد شما چون تمام مراحل ریاضی توی یک خطه بصورت اعشاری عمل میشه و مشکل ساز نمیشه
به هر حال کدت درست بود
این مسئله نیز حل شد
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ببخشید کد من ایراد تایپی داشت اون تابIsMax رو نوشته بودم تا با اون مقایسه کنم
در ضمن کامپایلر من استاندارد فکر کنم بورلند c++ یه کمی قدیمی و استاندارد جدید رو پشتیبانی نمی کنه فضای نامی در استاندارد جدید std هست و در ضمن کامپایلر من iostream.h رو قبول نمی کنه

برای مقایسه هم من دو عدد رو از هم کم کردم اگه اخرین بیت یک بود یعنی حاصل منفیه و عدد دومی از عدد اولی بزرگتره یه جورایی کاری که دستور cmp در اسمبلی انجام می ده خواستم ثبات های پرچم رو چک کنم گفتم شاید مجاز نباشه
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام ارش جان حالا درست شد
هی میگفتم این دو تابع چیکار میکنن .حالا دیدم چیکار میکنن . ( ولی هنوز نمیدونم جزئ چ کلاسی هستند یه توضیح میدید شرمنده بلد نیستم دیگه درسما خوب نخوندم ببخشید . تازه کارم دیگه )
عزیز درسته
اما باز هم وقتی نتیجه رو برون میده ( true یا false) بازم مقایسه صورت میگره . اما توی اسمیلی بعد از تفریق عداد
نتیجه به تعداد بایتی که گرفتن هر بیت با بیت اول اور میشن و نتیجه نهایی به فلگ z فرستاده میشه . این طوری مقایسه میشه دو دد برابر هستند یا نه . سپس با شیفت به تعداد مناسب بیت علامت رو پیدا میکنن ودر نتیجه معلوم میشه کی از کی بزرگتره همون کاری که شما کردید . به هر حال نتیجه این شد که دید من نسبت به معماری کامپوتر بیشتر بشه
حالا یک سئوال دیگه ....
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
توابعی که نوشتم جزء هیچ کلاسی نیستن اگه منظورتون کلمه ی inline این کلمه باعث می شه که کامپایلر کد تابع رو در محلی که تابع فراخوانی شدهکپی کنه و دیگه لازم نباشه تابع فراخوانی بشه برای توابع کوچک که خیلی استفاده نمی شن این کار باعث سریع تر شدن برنامه منی شه البته در مورد توابه بزرگ و پر کاربرد هم همین کار رو می کنه اما باعث افزایش حجم برنامه می شه
--------------------------------
اما سوال
یه برنامه ی ساده ی دیگه

برنامه بنویسید که بدون استفاده از آرایه و تخصیص حافظه پویا اعداد را از مبنا ی n به مبنای m ببرید
اعداد m و n بین دو تا شانزده و بوده و از کاربر گرفته می شود
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
جناب پروگرمر الگوریتم برنامه تون درسته فقط توی کد نویسی مشکل داره البته ممکنه روی بعضی از کامپایلر ها جواب بده و مشکل نداشته باشه ولی رو کامپایلر من(gcc) این خطا رو داشت
خطا از این قراره که تابع یه chrtoint یه عدد علامت دار بر می گردونه و متغییر sum بدون علامت هست در جمع این دوتا ممکنه مشلکی پیش بیاد که برای برنامه ی شما پیش می یاد

من توی TC 3.0 نوشتمش و مشکلی نداشت.البته حق با شماست و قاعدتآ باید بدون علامت برگردونه.

فقط میخوام بدونم که موقع کامپایل خطا داد یا جواب ها غلط بود ؟

آخه واسه من حتی Warning هم نداد.البته به تنظیمات کامپایلر هم بستگی داره.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
موقع کامپایل وارنینگ داد البته کامپایلر من در بالاترین سطح هشدار ها تنظیم شده
و در هنگام اجرا هم جواب درست رو بر نگردوند
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
ارش جان ببین درسته یا نه ؟
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>

void main(){
   int num_org,num,i,j,k,b,r,m;
   clrscr();
   cout<<"Please enter number in decimal mode:";
   cin>> num_org;
   cout<<"Please inter base number ( 2>,<10 ):";
   cin >> m;
   if (m<2 || m>10) return;
   num=num_org;
   i=0;
   for (;num>=m;){
     num/=m;
     i++;}
   cout<<num;
   for(j=i;j>0;j--){
     num=num_org;
     for(k=0;k<j;k++){
       b=num%m;
       num/=m;
       }
     cout<<b;
     }
   getch();
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
اگه یکم توسعه اش بدبد درست می شه
باید در هر مبنایی بگیره نه فقط 10 به هر مبنایی هم ببره نه فقط 2 تا 10
البته منظور از هر مبنا 2 تا 16 هست
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
برنامه بنویسید که بدون استفاده از آرایه و تخصیص حافظه پویا اعداد را از مبنا ی n به مبنای m ببرید
اعداد m و n بین دو تا شانزده و بوده و از کاربر گرفته می شود

در نگاه اول به نظر میرسه بدون استفاده از آرایه (رشته) این کار غیر ممکن باشه.چون برای گرفتن اعداد در مبنای مثلا 16 علاوه بر ارقام، کاراکتر هم باید وارد بشه مثلآ A یا F و....

در نگاه دوم رو نمیدونم .باید یه کم فکر کنم.

شما خودتون این سوال رو حل کردید ؟

راستی این سوالات رو از کتاب یا منبع خاصی مطرح میکنید؟
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
یکم فکر کنید می شه بدون ارایه هم انجامش داد چون
من قبلا سوال رو حل کردم اگه حل نشد یکی از روش هاش رو بزارم
سوال ها منبع خاصی نداره
بعضی هاش سوال هایی هست که استاد سر کلاس می گه بعضی هاش رو توی انترنت یا کتابی ویا ... می بینم بعضی ها هم به فکر خودم می رسه
 
بالا