PDA

View Full Version : معکوس کردن یک رشته



mahmood3d
سه شنبه 03 اردیبهشت 1387, 19:22 عصر
با عرض سلام
من تازه شروع به برنامه نویسی با ++c کردم . می خواستم یه برنامه بنویسم که یه رشته ای رو بگیره و کلمه به کلمه اون رو معکوس کنه . مثل : ali reza که در خروجی ila azer چاپ کنه .
همین برنامه رو نوشتم ولی تمام رشته رو معکوس می کنه یعنی همون علیرضا رو به صورت azer ila چاپ می کنه . :لبخند:
فقط زیاد با کدهای پیشرفته ننویسید تا من هم متوجه بشم .:خجالت:

A_Salimi
سه شنبه 03 اردیبهشت 1387, 23:30 عصر
خوب این نباید کار چندان مشکلی باشه . . .

شما دو تا رشته با طول مناسب رو در نظر بگیر ، در رشته اول رشته اصلی رو که میخوای روش کار کنی رو وارد کنید حالا از یک حلقه for استفاده کنید و برای شرط حلقه هم strlen رشته اول رو در نظر بگیرید . فقط چیزی که هست اینه که باید در رشته خودتون با همین حلقه کاراکتر به کاراکتر جلو برید و کاراکتر ها رو در رشته دوم ذخیره کنید ، زمانی که به کاراکتر space ("") رسیدید رشته دوم به صورت معکوس در خروجی چاپ کنید و باز همین رویه رو تا انتهای رشته اول ادامه بدید .

radium
چهارشنبه 04 اردیبهشت 1387, 18:09 عصر
سلام دوست عزیز اینم واسه شما فقط آخر رشتت یه 0 وارد کن.



#include "stdafx.h"
#include "fstream.h"
#include <string.h>
void main()
{
char s[20];
cin>>s;
while(1)
{
for(int i=strlen(s)-1;i>=0;i--)
cout<<s[i];
cout<<" ";
cin>>s;
if(!strcmp(s,"0"))
break;
}
}

mahmood3d
پنج شنبه 05 اردیبهشت 1387, 09:58 صبح
خوب این نباید کار چندان مشکلی باشه . . .

شما دو تا رشته با طول مناسب رو در نظر بگیر ، در رشته اول رشته اصلی رو که میخوای روش کار کنی رو وارد کنید حالا از یک حلقه for استفاده کنید و برای شرط حلقه هم strlen رشته اول رو در نظر بگیرید . فقط چیزی که هست اینه که باید در رشته خودتون با همین حلقه کاراکتر به کاراکتر جلو برید و کاراکتر ها رو در رشته دوم ذخیره کنید ، زمانی که به کاراکتر space ("") رسیدید رشته دوم به صورت معکوس در خروجی چاپ کنید و باز همین رویه رو تا انتهای رشته اول ادامه بدید .
ممنون از اینکه کمکم کردین ولی اگه می شه بیشتر توضیح بدین . من الان این برنامه رو طوری نوشتم که کل رشته رو معکوس می کنه یعنی آخرین کاراکتر آرایه رو تو اولین کاراکتر آرایه دیگه ای کپی می کنم تا اولین کاراکتر آرایه اول که برنامه رو در زیر براتون می زارم . اگه می شه بگین این برنامه رو باید چه طوری تغییر بدم ؟


#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
int z=0;
char a[255],b[255];
cin.get(a,255);
z=strlen(a)-1;
for(int i=0;i<255;i++)
b[z-i]=a[i];
puts(b);
getch();
}

A_Salimi
پنج شنبه 05 اردیبهشت 1387, 20:21 عصر
این هم برنامه ای که شما بهش نیاز داری
مطالعه کن اگه متوجه نشدی بگو توضیح بدم
با کامنت هایی واست توضیح دادم





#include "string.h"
#include "conio.h"
#include "iostream.h"
void main(){
char a[255];
//input string
cin.get(a,255);
//debug . . . necessary for final answer
strcat(a," ");
//define a lenth
int z=strlen(a);
int k=0;
//scan variable a
for(int i=0;i<z;i++){
char m=a[i];
//cheek for next word
if(m==' '){
for(int j=i;j>k;j--)
cout<<a[j-1];
k=i;
cout<<" ";
}
}
cout<<endl;
getch();
}

mahmood3d
جمعه 06 اردیبهشت 1387, 08:59 صبح
دستور زیر چه کاری انجام می دهد و کار متغیر k چیست ؟


strcat(a," ");

A_Salimi
جمعه 06 اردیبهشت 1387, 10:03 صبح
دستور زیر چه کاری انجام می دهد و کار متغیر k چیست ؟


خوب strcat رو برای این گذاشتم که به رشته یک فاصله چسپونده بشه تا رشته آخر هم معکوس بشه . خودت میتونی این خط رو حذف کنی تا ببینی چه اتفاقی میفته ! مگر اینکه زمان وارد کردن رشته در آخر رشته هم یک فاصله خودتان به صورت دستی اضافه کنید.
و اما متغیر k :
در حقیقت فاصله مکان فاصله ها را در خود ذخیره میکند تا خروجی به درستی چاپ شود.

amir_cpp
جمعه 06 اردیبهشت 1387, 11:08 صبح
البته نمی دونم قراره از توابع خود ++C استفاده بکنین یا نه، اما strrev در هدر string.h این کار رو انجام می ده.

mahmood3d
جمعه 06 اردیبهشت 1387, 14:06 عصر
eshgh_82 عزیز
دستت خیلی خیلی درد نکنه فهمیدم چی شد .

البته نمی دونم قراره از توابع خود ++C استفاده بکنین یا نه، اما strrev در هدر string.h این کار رو انجام می ده.
قصد جسارت ندارم :بوس: ولی اولا می خواستم با کد نویسی همین کار رو انجام بدم ثانیا تیکه برنامه ای که در بالا گذاشتم کار همین strrev رو انجام می ده .:لبخندساده:

jalil_m
سه شنبه 11 تیر 1387, 01:44 صبح
با عرض سلام
من تازه شروع به برنامه نویسی با ++c کردم . می خواستم یه برنامه بنویسم که یه رشته ای رو بگیره و کلمه به کلمه اون رو معکوس کنه . مثل : ali reza که در خروجی ila azer چاپ کنه .
همین برنامه رو نوشتم ولی تمام رشته رو معکوس می کنه یعنی همون علیرضا رو به صورت azer ila چاپ می کنه . :لبخند:
فقط زیاد با کدهای پیشرفته ننویسید تا من هم متوجه بشم .:خجالت:


دوست عزيز.شما ميتونيد از تابع strtok كه در هدرفايل string.h هست استفاده كنيد.
اين تابع يه رشته ميگيره و اون رو بر اساس كاراكتر خاصي (كه اينجا كاراكتر space ) هست به چند تكه تقسيم ميكنه و خروجي اون يه آرايه اي از تكه هاي رشته است.
بعد ميتونيد هر عنصر اين آرايه رو به برنامه اي كه خودتون نوشتيد ارسال كنيد تا هر كلمه رو جداگونه معكوس كنه.

dehqani
چهارشنبه 07 خرداد 1393, 17:22 عصر
دوستان ببخشید تاپیک قدیمی رو میارم بالا ولی من اینو نوشتم جواب نمیده و داخل ویژوال 2013 هم نوشتم
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include "string.h"
#include <stdio.h>

using namespace std;
void main()
{
char a[255];
cin.get(a, 255);
strcat(a, " ");
int z = strlen(a);
int k = 0;
for (int i = 0; i<z; i++){
char m = a[i];
if (m == ' '){
for (int j = i; j>k; j--)
cout << a[j - 1];
k = i;
cout << " ";
}
}
cout << endl;
_getch();
}

کامبیز اسدزاده
چهارشنبه 07 خرداد 1393, 17:33 عصر
این یک مثال تقریبا کاملی است امتحانش کنید :



#include <iostream>
#include <string>


using namespace std;




void printReverse(const string& s)
{
for (int i = s.length() - 1; i >= 0; --i) cout << s[i];
}


// the original string is reversed ...
// note: C++ strings are mutable ... i.e. can be modified (in place)
void reverse(string& s)
{
int begin = 0, end = s.length() - 1;
char tmp;
while (begin < end) // swap begin and end ... char's
{
tmp = s[begin];
s[begin++] = s[end];
s[end--] = tmp;
}
}


// a new local copy of a string is reversed
string getReverse(string s)
{
int begin = 0, end = s.length() - 1;
char tmp;
while (begin < end) // swap begin and end ... char's
{
tmp = s[begin];
s[begin++] = s[end];
s[end--] = tmp;
}
return s; // returns a new copy of this reversed copy
}


int main()
{
// 0 //
string testStr = "abcdefghijklmnopqrstuvwxyz";
cout << "(0) Original string: " << testStr << endl;


// 1 //
cout << "\n(1) After calling printReverse(testStr): ";
printReverse(testStr);
cout << endl;


// 2 //
// note: C++ strings are mutable ...
reverse(testStr);
cout << "\n(2) After calling reverse(testStr): " << testStr
<< "\nThe original string is now reversed ..." << endl;


// 3 //
cout << "\n(3) After calling getReverse(testStr): " << getReverse(testStr)
<< "\nThe new (temporary) copy is reversed ..."
<< "\nbut the string passed in is still: " << testStr << endl;


// 4 //
cout << "\n(4) Or using reverse_iterator to print reversed: ";
string::reverse_iterator rit = testStr.rbegin();
string::reverse_iterator rit_end = testStr.rend();
while (rit != rit_end) { cout << *rit; ++rit; }
cout << "\nbut the string is still: " << testStr << endl;


// 5 //
cout << "\n(5) Or using const_reverse_iterator to print ... ";
string::const_reverse_iterator crit = testStr.rbegin();
string::const_reverse_iterator crit_end = testStr.rend();
while (crit != crit_end) { cout << *crit; ++crit; }
cout << "\nbut the string is still: " << testStr << endl;


cout << "\nPress 'Enter' to continue ... " << flush;
cin.get();
}

karkeabadi
پنج شنبه 15 خرداد 1393, 20:02 عصر
من از تمام دوستان عذرخواهی میکنم که تاپیک قدیمی رو مجدد بازنویسی میکنم اما میخواستم ببینم چطور میشه این برنامه رو طوری تغییر داد که بتونه رشته معکوس شده هر حرف اون چند بار در جمله تکرار شده .
امیدوارم واضح گفته باشم .

mr.dkbaz
جمعه 14 فروردین 1394, 02:35 صبح
سلام خدمت اساتید محترم
ابتدا سال جدید رو تبریک میگم
ذوستان من بتازگی شروع به برنامه نوشتن با سی پلاس پلاس کردم و میخوام ک یه برنامه بنویسم که یک رشته دریافت کنه و برعکس اون رو نمایش بده
یادمه ک توی ویژوال بیسیک یه تابع بود ک خودش همه کارارو میکرد اگه این تابع در سی پلاس پلاس هم وجود داره ک معروفی کنید و باهاش برنامه رو بنوسید
اگرم ک نیست عاجزانه ازتون درخواست میکنم یه کد به من بدید یه رشته رو عکسشو تحویل بده فقط لطف کنید خط به خط به صورت کامل و زبان ساده توضیح بدید ک من متوجه بشم
خیلی ممنونم منتظر پاسخ هستم

amirtork
جمعه 14 فروردین 1394, 10:48 صبح
سلام،
این مقاله رو مطالعه کنید،
http://www.cplusplus.com/articles/2wA0RXSz/
توی این مقاله، به شما نحوه ی جدا سازی یک رشته رو بر اساس یک کاراکتر خاص توضیح میده(با استفاده از تابع نوشته شده ی explode(const string& s, const char& c)، و بعد شما میتونید با استفاده از تابع خودتون و یا strrev در هدر فایل string.h، برای هر block از vector خروجی، کار نمایش معکوس هر عبارت انجام بدید.
اگر سوالی بود، در خدمتم.

mr.dkbaz
جمعه 14 فروردین 1394, 23:17 عصر
ممنون ک پاسخگو سوال من بودید
ولی این منبع اینگلیسی بود لطفا اگه متونید سوال من رو بزبان ساده توضیح بدید اگه زحمتی نباشع

من خوذم به یه جاهایی رسیدم اینطوری ک من متوجه شده
تابع strrev یک رشته رو معکوس میکنه فکر میکنم باید اینطوری باشه


#include "conio.h"
#include "iostream.h"
#include "string.h"
Int main(void)
{
char a;
cin<<a;
cout>>strrev(a);
Reutrn 0
}

ایا این کد من درسته؟ هدر هاشم درسته؟
ببخشید اگه اشتباه بوده

amirtork
شنبه 15 فروردین 1394, 15:44 عصر
سلام
در مورد تابع strrev درست متوجه شدید.
کدی هم که قرار دادید، درست هست، اما باید از آرایه ای از char استفاده کنید، و نه فقط از یک کاراکتر.
اما نکته ای که وجود داره این هست که strrev جزو توابع استاندارد نیست، و هر کامپایلر زبان c و c++ این رو نداره، به خاطر همین من پیشنهاد میکنم به جای این تابع، از تابع reverse در کتاب خانه ی algorithm استفاده کنید.
کار کرد این تابع به صورت زیر است:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
string str;
cin>>str;
reverse(str.begin(), str.end());
cout<<str;
return 0;
}

این کد، رشته ی str رو به صورت معکوس چاپ میکنه.

mr.dkbaz
شنبه 15 فروردین 1394, 16:17 عصر
ممنون بابت پاسختون دوست عزیز واقعا لطف کردید
اگه میشه کد خودم رو اصلاح کنید همون ک گفتید باید ارایه باشه ، یعنی اگه ارایه باشه چجوری میشه
لطفا توضیح بدید
ممنون از لطفتون

amirtork
شنبه 15 فروردین 1394, 16:32 عصر
سلام
کد شما به دلیل استفاده از نسخه های قدیمی تر c++ در واقع از حالت استاندارد خارج هست و من باز هم پیشنهاد میکنم از نسخه های جدید تر استفاده کنید، با این حال، این کدی هست که من اشکالاتی رو که توش میبینم رفع کردم، اگر مشکل دیگه ای داشت بفرمایید:
#include "conio.h"
#include "iostream.h"
#include "string.h"
int main()
{
char a[10];
cin>>a;
cout<<strrev(a);
return 0;
}
1- return درست هست، نه Reutrn
2- علامت جریان ورودی برای cin به صورت cin>> هست نه cin<<
3- سی پلاس پلاس زبانی حساس به حروف بزرگ و کوچک هست، بنابراین باید در نوشتن دقت کنید، int درست هست و نه Int.

mr.dkbaz
شنبه 15 فروردین 1394, 16:45 عصر
ممنون واقعا کمک خیلی بزرگی کردید
ببخشید ک انقده سوال میکنم ولی سوال اخرمه
تو کد شما همونی ک خودتون پیشنهاد کردید این خط چیکار میکنه؟
using namespace std;
و میشه خواهش کنم در باره خط
reverse(str.begin(), str.end());
کمی توضیح بدید؟
چرا باید اون دوتا تابع ازشون استفاده بشه منضورمstr.begin و str.end هستش
ممنون

amirtork
شنبه 15 فروردین 1394, 17:08 عصر
using namespace std در این کد، در واقع داره محل تعریف cin و cout و string رو مشخص میکنه.
برای کنترل حجم انبوهی از توابع و کلاس ها، از مبحثی به نام فضای نام استفاده میکنیم، برای مثال اگر ما در برنامه ای، دو تابع با نام و آرگومان های یکسان داشته باشیم، برای مشخص کردن هر کدام، از فضای نام به خصوصی استفاده میکنیم، برای مثال:
#include <iostream>
#include <string>
#include <algorithm>

namespace first
{
void sayHello()
{
std::cout<<"Hello!"<<std::endl;
}
}

namespace second
{
void sayHello()
{
std::cout<<"Hello!"<<std::endl;
}
}
int main()
{
//+++++++++++++
first::sayHello();
second::sayHello();
//+++++++++++++
return 0;
}

در کد بالا، با توحه به اینکه ویژگی های دو تابع کاملا شبیه به هم هست، برای اینکه در برنامه درچار مشکل نشویم، از دو فضای نام مختلف استفاده کردیم.
استفاده از فضای نام دو روش عمده داره:
1- اعلام در ابتدای برنامه مثل using namespace std;
2- اعلام در پشت موارد مورد استفاده از آن فضای نام، مثل std::cout
برای استفاده از روش دوم، باید قبل از عضو نظر در آن فضای نام، ابتدا اسم آن فضای نام رو بیاریم، بعد علامت تفکیک حوزه یا همون :: ، بعدش اسم عضو مورد نظر، مثل std::cin
در مورد اون دو تابع هم، کار اون دو تابع برگردوندن اشاره گر به ابتدا و انتهای رشته ی مورد نظر ما هستن.
str.begin() اشاره گری به ابتدای رشته و دیگری اشاره گری به انتهای رشته برمیگردونن، و علت استفاده هم این هست که تابع reverse برای انجام فرایند معکوس سازی، نیاز به دانستن محدوده ای هست که باید عمل معکوس سازی رو روش انجام بده، و از انجایی که ما میخواستیم کل رشته رو معکوس کنیم، پس دو اشاره گر به ابتدا و انتهای رشته فرستادیم.

samsamkhan
پنج شنبه 29 فروردین 1398, 00:08 صبح
سلام به کلیه دوستان
این دستوری که قرار دادم به صورت معکوس نشون نمیده
ببینید : <?php$str = "12345";
echo $implode;
؟>
این هم جواب نمیده: <?php
$str = "12345";
echo $strrev;
?>
فقط این جواب میده که به صورت برعکس نیست : <?php
$str = "12345";
echo $str;
?>
کسی میتونه منو راهنمایی؟

sadrah87
یک شنبه 01 خرداد 1401, 12:09 عصر
#include <iostream>
#include <string.h>
#include <cstring>
using namespace std ;
int main()
{
int i , a;
char s[] = "matsah hedaznasaH ardaS naM";
for ( i = strlen(s); i >=0 ; i--)
{
cout << s[i];
}
}:بوس::لبخندساده::لبخندساده: ک کنم به حد کافی سادست!