این برنامه را چطوری بنویسم

mnsb13600

New Member
با سلام به اساتید
صورت مسئله این طوری که
برنامه ای بنویسید که دو رشته را گرفته باهم ادقام کند و خروجی را چاپ کند سپس تعداد کارکترها را بشمارد

در این برنامه از کتابخانه string .h استفاده نشود
 

the_king

مدیرکل انجمن
با سلام به اساتید
صورت مسئله این طوری که
برنامه ای بنویسید که دو رشته را گرفته باهم ادقام کند و خروجی را چاپ کند سپس تعداد کارکترها را بشمارد

در این برنامه از کتابخانه string .h استفاده نشود

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

int main()
{
    char a[100], b[100];
    int i, j, n;
    printf("Please enter first string :");
    gets(a);
    printf("Please enter second string :");
    gets(b);
    for (i = 0; a[i]; i++);
    for (j = 0; b[j]; j++)
        a[i + j] = b[j];
    a[i + j] = 0;
    printf("Merged string = %s\n", a);
    for (n = 0; a[n]; n++);
    printf("Length = %d\n", n);
    getch();
    return 0;
}

تعریف رشته اول و دوم :
کد:
    char a[100], b[100];

نمایش پیغام و دریافت رشته اول :
کد:
    printf("Please enter first string :");
    gets(a);

نمایش پیغام و دریافت رشته دوم :
کد:
    printf("Please enter second string :");
    gets(b);

شمردن کاراکتر های رشته اول و پیدا کردن انتهای آن :
کد:
    for (i = 0; a[i]; i++);

کپی کردن کاراکتر های رشته دوم به انتهای رشته اول :
کد:
    for (j = 0; b[j]; j++)
        a[i + j] = b[j];

اضافه کردن کاراکتر null به انتهای رشته
کد:
    a[i + j] = 0;

نمایش پیغام و رشته :
کد:
    printf("Merged string = %s\n", a);

شمردن تعداد کاراکتر های موجود در رشته :
کد:
    for (n = 0; a[n]; n++);

نمایش پیغام و تعداد کاراکتر های رشته :
کد:
    printf("Length = %d\n", n);
 

the_king

مدیرکل انجمن
میشه این رشته را با scanf هم گرفت یه چیزی غیره gets

بله، می توانید بجای ;(gets(a از ;(scanf("%s", a و بجای ;(gets(b از ;(scanf("%s", b استفاده کنید اما اگر اینکار رو انجام دهید فقط می توانید از کاربر یک کلمه بگیرید،
فرضا test . نمی توانید یک رشته که شامل کاراکتر فاصله است را از کاربر بگیرید. scanf به محض اینکه به فاصله برسد کارش را تمام می کند.
 

mnsb13600

New Member
بله، می توانید بجای ;(gets(a از ;(scanf("%s", a و بجای ;(gets(b از ;(scanf("%s", b استفاده کنید اما اگر اینکار رو انجام دهید فقط می توانید از کاربر یک کلمه بگیرید،
فرضا test . نمی توانید یک رشته که شامل کاراکتر فاصله است را از کاربر بگیرید. scanf به محض اینکه به فاصله برسد کارش را تمام می کند.

مهندس جان چند تا سوال دیگه
چرا در حلقه for اول از سمی کالن استفاده نکردی
این دستور را لطفا دقیق برام توضیح بده
a[i + j] = b[j]
 

the_king

مدیرکل انجمن
مهندس جان چند تا سوال دیگه
چرا در حلقه for اول از سمی کالن استفاده نکردی
این دستور را لطفا دقیق برام توضیح بده
a[i + j] = b[j]

حلقه می تونه بجز اون ++i (تغییر شمارنده حلقه) بدون کد برای اجرای داخل حلقه باشه :
کد:
for (i = 0; a[i]; i++);

این حلقه مشابه این حلقه است :
کد:
for (i = 0; a[i]; i++)
{
};


اما حلقه می تواند بجز تغییر شمارنده حلقه، کدی هم برای اجرای داخلش داشته باشد :
کد:
for (j = 0; b[j]; j++)
{
        a[i + j] = b[j];
}

اگر اون کد داخل حلقه فقط یک سطر باشد، می توانیم { و } را ننویسیم، یعنی اینطوری هم همان کد قبلی است :
کد:
for (j = 0; b[j]; j++)
        a[i + j] = b[j];

همانطور که این کد :
کد:
if (x > y)
{
	i++;
}

معادل این کد است :
کد:
if (x > y)
	i++;

توجه داشته باشید که یک ; اضافی می تواند نتیجه اجرای کد را به کلی عوض کند. فرضا این کد یک حلقه است که ++x داخلش اجرا می شود، چون حلقه 10 بار تکرار می شود
مقدار x هم 10 بار افزایش می یابد :
کد:
for (i = 0; i < 10; i++)
        x++;

اما اگر یک ; بعد از ( حلقه اضافه کنید، دیگر ++x داخل حلقه نیست و فقط یکبار بعد تمام شدن تمامی 10 دور حلقه اجرا می شود و در نتیجه x فقط یکبار افزایش می یابد :
کد:
for (i = 0; i < 10; i++);
x++;

در کد برنامه ما می خواستیم رشته b رو به انتهای رشته a اضافه کنیم، برای اینکار اول باید بدانیم که انتهای رشته a کجا است.
در حلقه اول ما i را آنقدر جلو می بریم تا به انتهای a برسد :
کد:
for (i = 0; a[i]; i++);

حالا فرضا اگر رشته داخل a برابر test باشد، مقدار i برابر 4 خواهد بود و [a[0 و [a[1 و [a[2 و [a[3 پر است و خانه [a[4 اولین خانه خالی است.
اکنون باید رشته b را باید در a و از خانه خالی [a[4 به بعد بنویسیم. [a[4 همان [a[i است چون i برابر 4 است.
کد [a[i + j] = b[j مقدار داخل خانه j ام را از b به a منتقل می کند. i + j برای این است که از خانه i ام به بعد نوشته شود. یعنی مقدار خانه های قبلی همانطور دست نخورده حفظ شوند.
اگر بجای [a[i + j می نوشتیم [a[j ، هر رشته ای که در a بود از همان خانه 0 به بعد باز نویسی می شد و چیزی از a باقی نمی ماند، می شد مثل b
اگر بجای [a[i + j می نوشتیم [a[i ، کاراکتر های رشته b همه شون روی خانه [a[4 نوشته می شدند و طول a فقط یک کاراکتر بیشتر می شد.
 

mnsb13600

New Member
حلقه می تونه بجز اون ++i (تغییر شمارنده حلقه) بدون کد برای اجرای داخل حلقه باشه :
کد:
for (i = 0; a[i]; i++);

این حلقه مشابه این حلقه است :
کد:
for (i = 0; a[i]; i++)
{
};


اما حلقه می تواند بجز تغییر شمارنده حلقه، کدی هم برای اجرای داخلش داشته باشد :
کد:
for (j = 0; b[j]; j++)
{
        a[i + j] = b[j];
}

اگر اون کد داخل حلقه فقط یک سطر باشد، می توانیم { و } را ننویسیم، یعنی اینطوری هم همان کد قبلی است :
کد:
for (j = 0; b[j]; j++)
        a[i + j] = b[j];

همانطور که این کد :
کد:
if (x > y)
{
    i++;
}

معادل این کد است :
کد:
if (x > y)
    i++;

توجه داشته باشید که یک ; اضافی می تواند نتیجه اجرای کد را به کلی عوض کند. فرضا این کد یک حلقه است که ++x داخلش اجرا می شود، چون حلقه 10 بار تکرار می شود
مقدار x هم 10 بار افزایش می یابد :
کد:
for (i = 0; i < 10; i++)
        x++;

اما اگر یک ; بعد از ( حلقه اضافه کنید، دیگر ++x داخل حلقه نیست و فقط یکبار بعد تمام شدن تمامی 10 دور حلقه اجرا می شود و در نتیجه x فقط یکبار افزایش می یابد :
کد:
for (i = 0; i < 10; i++);
x++;

در کد برنامه ما می خواستیم رشته b رو به انتهای رشته a اضافه کنیم، برای اینکار اول باید بدانیم که انتهای رشته a کجا است.
در حلقه اول ما i را آنقدر جلو می بریم تا به انتهای a برسد :
کد:
for (i = 0; a[i]; i++);

حالا فرضا اگر رشته داخل a برابر test باشد، مقدار i برابر 4 خواهد بود و [a[0 و [a[1 و [a[2 و [a[3 پر است و خانه [a[4 اولین خانه خالی است.
اکنون باید رشته b را باید در a و از خانه خالی [a[4 به بعد بنویسیم. [a[4 همان [a[i است چون i برابر 4 است.
کد [a[i + j] = b[j مقدار داخل خانه j ام را از b به a منتقل می کند. i + j برای این است که از خانه i ام به بعد نوشته شود. یعنی مقدار خانه های قبلی همانطور دست نخورده حفظ شوند.
اگر بجای [a[i + j می نوشتیم [a[j ، هر رشته ای که در a بود از همان خانه 0 به بعد باز نویسی می شد و چیزی از a باقی نمی ماند، می شد مثل b
اگر بجای [a[i + j می نوشتیم [a[i ، کاراکتر های رشته b همه شون روی خانه [a[4 نوشته می شدند و طول a فقط یک کاراکتر بیشتر می شد.

متشکرم مهندس از جوابات
این برنامه را قبلا تو کارگاه نوشتم اما یه مدل دیگه الان هر کاری میکنم جواب نمیده
//vared kardan adad

#include <stdio.h>
#include <conio.h>
void main()
{

int a=0;

clrscr();

while(1)
{

printf("\n adade ra vard conid:");

scanf("%d",&a);

if(a>=17 && a<=20)
printf("\n rotbhe shoma:%c",a,'A');

else

if(a>=15 && a<17)
printf("\n rotbhe shoma:%c",a,'B');

else

if(a>=10 && a<15)
printf("\n rotbhe shoma:%c",a,'C');

else

if(a>10)
printf("\n rotbhe shoma:%c",a,'D');
}

getch();

}
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سوالی که مربوط به موضوع اصلی این تاپیک نیست رو اینجا مطرح نکنید، برای سوال جدید یک تاپیک (مبحث) جدید ایجاد کنید.

تعداد پارامتر ها با فرمت مشخص شده مطابقت نداره، فرضا در فرمت "This %s is %d and %s" جا برای سه تا پارامتر s% و d% و s% هست
پس باید در ادامه سه پارامتر دریافت بشه، نه دو پارامتر و نه چهار پارامتر.

در کد شما داخل فرمت صرفا یک c% وجود داره اما در ادامه دو پارامتر a و 'A' را درج کرده اید، یکی شون اضافی یه :
کد:
printf("\n rotbhe shoma:%c",a,'A')

اون a اضافی یه :
کد:
printf("\n rotbhe shoma:%c",'A')
 

جدیدترین ارسال ها

بالا