PDA

View Full Version : بزرگ کردن کاراکتر اول رشته



vahideh85
یک شنبه 04 فروردین 1387, 21:03 عصر
چطوری می تونم کاراکتر اول کلمات یه رشته رو بزرگ کنم ؟؟
تابع main اونم می خوام
باید با اشاره گرها اینو انجام بدم؟

Nima_NF
دوشنبه 05 فروردین 1387, 01:44 صبح
از طریق یک اشاره گر به کارکتر ، به ترتیب تمامی حروف را که بعد از یک جای خالی قرار دارند یافته و مقدار عددی کارکتر اول اشاره شده را از 32 کم کنید تا حروف کوچک به حروف بزرگ تبدیل شوند ؛
این کار یعنی معادل کد اسکی آن ها را از هم کم می کنید (زیرا کد اسکی A عدد 65 و a عدد 97 می باشد)

ضمنا تمامی کارکتر ها را ابتدا با تابع isupper تست کنید که اگر حروف بزرگ هست کارهای فوق را انجام ندهید.

vahideh85
چهارشنبه 14 فروردین 1387, 19:30 عصر
مرسی. یه مدت دسترسی نداشتم به نت

coid conv (char s[] )
{
s[0] = toupper (s[0]);
for (int i=0 ; s[i] != '/0' ; i++)
if (s[i] == ' ')
s[i+1] = toupper (s[i+1]);
}


این تابع حرف اول یه رشته رو بزرگ می کنه ولی main درست در نمی یاد
:ناراحت:

emad_67
پنج شنبه 15 فروردین 1387, 00:00 صبح
این تابع حرف اول یه رشته رو بزرگ می کنه ولی main درست در نمی یاد
درست نفمیدم منظورت چیه ولی اینجوری بنویس:


#include<iostream.h>
#include<ctype.h>
void conv (char s[] );
void main()
{
char s[]="c++ builder";
conv(s);
}
void conv (char s[] )
{
s[0] = toupper (s[0]);
for (int i=0 ; s[i] != '\0' ; i++)
if (s[i] == ' ')
s[i+1] = toupper (s[i+1]);
cout<<s<<endl;
}
تابع toupper در هدر ctype.h قرار داره.
کاراکتر انتهای رشته هم '0\' هست نه '0/'

vahideh85
پنج شنبه 15 فروردین 1387, 00:21 صبح
مرسی از راهنماییتون
ولی من م خوام رشته رو از کاربر بگیره
نه خودمون یه رشته بدیم بهش
اینو نمی تونم درست در بیارم
'0\' اشتباه چاپی بود:لبخند:

emad_67
پنج شنبه 15 فروردین 1387, 09:47 صبح
ولی من م خوام رشته رو از کاربر بگیرهبرای گرفتن رشته از ورودی قسمت main رو اینجوری بنویس:


char s[80];
cout<<"Please enter your strig : \n";
cin.getline(s,80);
conv(s);
توسط cin.getline میتونی یک خط از ورودی رو بخونی و در آرایه قرار بدی. در اینجا تا 80 کاراکتر رو میتونی ذخیره کنی. تابع getline سه پارامتر میگیره که آرگمان اول اون آرایه تعریف شده هست و پارامتر دوم طول آرایه هست و پارامتر آخر کاراکتری هست که انتهای رشته رو نشون میده.(جایی رو مشخص میکنه که بعد از اون دیگه نباید رشته خونده بشه)
به صورت پیشفرض برای این تابع پارامتر سوم به صورت 'n\' تعریف شده یعنی همون enter. بنابراین من در اینجا اونو ننوشتم یعنی syntax اصلی به این شکل هست:


cin.getline(s,80,'\n');

vahideh85
پنج شنبه 15 فروردین 1387, 10:50 صبح
واقعا خیلی ممنون
با این تابع کلی از سوالام برطرف شد
اگه بخوایم مثلا کلمه پنجم این رشته رو چاپ کنیم چی کار باید بکینم؟

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

moh.mon
پنج شنبه 15 فروردین 1387, 11:54 صبح
شما میتونید با پیدا کردن زیر رشته ی مورد نظر و استفاده از دستور cout این کار رو انجام بدین .
http://barnamenevis.org/forum/showthread.php?t=99113&page=1

vahideh85
پنج شنبه 15 فروردین 1387, 12:07 عصر
while(s1[b]==' ')
{
b++;
}
e=b;
while(s1[e]!=' ' && s1[e]!='\0')
{
e++;
}


نفهمیدم منظورتونو می شه کامتر توضیح بدین
s1 رو برا چی به کار بردین؟

emad_67
پنج شنبه 15 فروردین 1387, 12:34 عصر
اگه بخوایم مثلا کلمه پنجم این رشته رو چاپ کنیم چی کار باید بکینم؟برای پیدا کردن کلمه پنجم بهتره که اول تک تک کلمات رشته رو از هم تفکیک کنی و در یک آرایه قرار بدی و بعد اون خونه از آرایه رو چاپ کنی. برای تفکیک کلمات از تابع strtok در هدر string.h باید استفاد کنی.به این شکل:


#include<iostream.h>
#include<ctype.h>
#include<string.h>
void conv (char s[] );
void main()
{
char s[80];
char *word[10],*token;
cout<<"Please enter your strig : \n";
cin.getline(s,80);
conv(s);

token=strtok(s," ");
for(int i=0;token!=NULL;i++)
{
word[i]=token;
token=strtok(NULL," ");
}

cout<<word[4]<<endl;
}
void conv (char s[] )
{
s[0] = toupper (s[0]);
for (int i=0 ; s[i] != '\0' ; i++)
if (s[i] == ' ')
s[i+1] = toupper (s[i+1]);
cout<<s<<endl;
}
بعد از اینکه حروف اول هر کلمه بزرگ شد اونو تفکیک می کنیم. تابع strtok دو پارامتر داره که پارامتر اول اون خود آرایه و پارامتر دوم اون کاراکتری هست که باید رشته بر اساس اون تفکیک بشه. بعد از تفکیک هر کلمه این تابع اشاره گری به اون کلمه رو بر میگردونه که در token ذخیره میشه. در انتها هم وقتی که همه کلمات تفکیک شدند این تابغ مقدار NULL رو بر میگردونه.
word هم آرایه ای از اشاره گر هاست که آدرس هر کلمه رو در اون ذخیره میکنیم.

برا یاد گرفتن c++ چه کتابی رو بهتره بخونم؟
کتاب دو جلده دیتل ترجمه قلزم رو دارم ولی احساس می کنم چیزی نمی فهمم ازش به خصوص که فعلا کلاس اینا بلد نیستیم و اون کتاب همه چی رو بر مبنای اون نوشتهمن خودم کتاب دیتل رو خوندم و خیلی راضی بودم. این مسائلی که الان داریم در موردش صحبت میکنیم به کلاس ها ربطی نداره و در فصل اشاره گر ها و رشته ها از این کتاب هست. به طور مثال این کد همون مثال strtok از خود کتاب دیتیل هست (انگلیسی) که قلزم ترجمه کرده.


1 // Fig. 8.34: fig08_34.cpp
2 // Using strtok.
3 #include <iostream>
4 using std::cout;
5 using std::endl;
6
7 #include <cstring> // prototype for strtok
8 using std::strtok;
9
10 int main()
11 {
12 char sentence[] = "This is a sentence with 7 tokens";
13 char *tokenPtr;
14
15 cout << "The string to be tokenized is:\n" << sentence
16 << "\n\nThe tokens are:\n\n";
17
18 // begin tokenization of sentence
19 tokenPtr = strtok( sentence, " " );
20
21 // continue tokenizing sentence until tokenPtr becomes NULL
22 while ( tokenPtr != NULL )
23 {
24 cout << tokenPtr << '\n';
25 tokenPtr = strtok( NULL, " " ); // get next token
26 } // end while
27
28 cout << "\nAfter strtok, sentence = " << sentence << endl;
29 return 0; // indicates successful termination
30 } // end main
در کل به نظر من کتاب خیلی خوبی هست.
در این بخش هم یه جست و جویی بکن قبلا در موردش صحبت شده:
http://barnamenevis.org/forum/forumdisplay.php?f=45

moh.mon
پنج شنبه 15 فروردین 1387, 17:57 عصر
نفهمیدم منظورتونو می شه کامتر توضیح بدین
s1 رو برا چی به کار بردین؟
شما ابتدا باید زیر رشته ی مورد نطر را پیدا کنید و در یک بافر کپی کنید و سپس اون و چاپ کنید و منظور از s1 در اینجا همون رشته ی مورد نظر هست.
با استفاده از برنامه ی زیر میتونید زیر رشته ی مورد نظر رو در یک بافر کپی کنید . (در ضمن برنامه های زیر غیر بهینه هستن.)
do
{
while(s1[b]==' ')
{
b++;
}
e=b;
while(s1[e]!=' ' && s1[e]!='\0')
{
e++;
}
strncpy(s2, s1 + b ,(e-b));
s2[e-b]='\0';

vahideh85
پنج شنبه 15 فروردین 1387, 18:51 عصر
بازم خیلی ممنون
بازم یه چند تا مشکل دارم

1)اگه می شه بگین کار این دستور چیه؟


token=strtok(NULL," ");

منظور از تفکیک نال چی هستش؟


2) شما همش خروجی main رو void می نویسید و return نمی زارید این تو عمل کردش اصلا فرقی نمی کنه با این که خروجی رو int بزاریم و return 0; بزاریم؟

3) و این که چطوری بگم به برنامه اگه کلمه پنجم بود چاپ کنه و اگه نبود بگه که پنجمین کلمه وجود نداره ارایه رو می شه این مدلی کنترل کردش؟

4) و دیتیل احساس می کنم خیلی سطح بالا نوشته مثلا همش نوشته متغیر ثابت نمی دونم غیر ثابت متغییر و این جور چیزا احساس می کنم هیچ چی نمی فهمم !!!!

emad_67
پنج شنبه 15 فروردین 1387, 21:20 عصر
1)اگه می شه بگین کار این دستور چیه؟



token=strtok(NULL," ");
منظور از تفکیک نال چی هستش؟عملکرد تابع strtok به این شکل است:
مثلا فرض کن که رشته my name is ali رو داریم و میخوایم اونو تفکیک کنیم.
در ابتدا که می نویسیم:


token=strtok(s," ");
در این قسمت تابع strtok به دنبال کاراکتر جدا کننده در رشته میگرده و در صورت پیدا شدن به جای اون کاراکتر در رشته اصلی کاراکتر '0\' رو قرار میده و یک اشاره گر به کاراکتر بعدی یعنی n رو ذخیره میکنه و سپس اشاره گری به ابتدای رشته یعنی حرف m بر میگردونه و در token ذخیره میشه یعنی رشته ما به این شکل میشه:
my'\0'name is ali
بنابراین در ابتدا که token رو چاپ کنی عبارت my چاپ میشه. در فراخوانی های بعدی این تابع باید به پارامتر اول اون NULL رو بدیم. کلمه NULL مشخص میکنه که این تابع باید کلمات رو از آدرس رشته ای که آخرین بار به این تابع داده شده تفکیک کنه. در صورتی که به جای NULL رشته s رودوباره ارسال کنیم دائما اشاره گری به ابتدای رشته یعنی my بر میگرده که باعث ایجاد حلقه بینهایت میشه.

) و این که چطوری بگم به برنامه اگه کلمه پنجم بود چاپ کنه و اگه نبود بگه که پنجمین کلمه وجود نداره ارایه رو می شه این مدلی کنترل کردش؟میتونی ابتدا تعداد space ها رو بشمری و براساس اون بگی که کاراکتر پنجم وجود داره یا نه. همچنین میتونی ابتدا همه خونه های آرایه رو NULL قرار بدی و در صورتی که خونه مورد نظر بعد از strtok هنوز null بود بر اساس index آرایه میتونی بگی که کلمه پنج وجود داره یا نه. همین طور میتونی از وکتور استفاده کنی ولی در صورتی که فقط میخوای چک کنی ببینی که کاراکتر n ام وجود داره یا نه و تفکیکی انجام ندی ساده ترین راه شمردن تعداد space هاست.

) و دیتیل احساس می کنم خیلی سطح بالا نوشته مثلا همش نوشته متغیر ثابت نمی دونم غیر ثابت متغییر و این جور چیزا احساس می کنم هیچ چی نمی فهمم !!!!بله یه مقدار سطح دیتل بالاست ولی به هر حال میتونی از کتاب جعفر نژاد که سطح پایین تری داره استفاده کنی.

vahideh85
پنج شنبه 15 فروردین 1387, 22:21 عصر
خیلی ممنون از توضیحاتتون

vahideh85
پنج شنبه 15 فروردین 1387, 23:27 عصر
با استفاده از برنامه ی زیر میتونید زیر رشته ی مورد نظر رو در یک بافر کپی کنید







تابع strncpy n تا کاراکتر اول یه رشته رو تو اون یکی کپی می کنه؟ حتما باید اولی باشه؟
می شه توضیح بدین؟

moh.mon
جمعه 16 فروردین 1387, 09:18 صبح
تابع strncpy n تا کاراکتر اول یه رشته رو تو اون یکی کپی می کنه؟ حتما باید اولی باشه؟
می شه توضیح بدین؟

منظورتون رو کامل نفهمیدم ولی تابع strncopy یک رشته یا زیر رشته از یک رشته رو در یک رشته ی دیگه کپی میکنه البته به تعداد کاراکتر های معین.
شما میتونید آرگمان های تابع srncopy رو بوسیله ی help زبان برنامه نویسیتون بدست بیارید.

strncopy(s2,s1,a)