Премини към съдържанието

Препоръчан отговор

публикувано (редактирано)

Здравейте,

От заглавието става ясно каква е задачата.Сам се уча у нас и няма кого да питам.Гледах в интернет, но решенията им са много над моето ниво.Запознат съм само със if-else,do-while,for,char.

Това е решението, което аз измислих, но нещо не ми се получава искания резултат.Искам ако думата е палиндром всички букви да са главни, а ако не е-малки.

#include<iostream>
using namespace std;
int main()
{
     char b1,b2,b3,b4,b5,b6,b7;
     cin>>b1>>b2>>b3>>b4>>b5>>b6>>b7;
     if(b1==b7||b1==b7+'A'-'a'||b7==b1+'A'-'a'&&b2==b6||b2==b6+'A'-'a'||b6==b2+'A'-'a'&&b3==b5||b3==b5+'A'-'a'||b5==b3+'A'-'a')
     {
      if(b1<='Z'&&b1>='A') cout<<b1;
      else cout<<b1-('a'-'A');
      if(b2<='Z'&&b2>='A') cout<<b2;
      else cout<<b2-('a'-'A');
      if(b3<='Z'&&b3>='A') cout<<b3;
      else cout<<b3-('a'-'A');
      if(b4<='Z'&&b4>='A') cout<<b4;
      else cout<<b4-('a'-'A');
      if(b5<='Z'&&b5>='A') cout<<b5;
      else cout<<b5-('a'-'A');
      if(b6<='Z'&&b6>='A') cout<<b6;
      else cout<<b6-('a'-'A');
      if(b7<='Z'&&b7>='A') cout<<b7;
      else cout<<b7-('a'-'A');
 
     
     }
     else
     {
      if(b1<='Z'&&b1>='A') cout<<b1+('a'-'A');
      else cout<<b1;
if(b2<='Z'&&b2>='A') cout<<b2+('a'-'A');
      else cout<<b2;
      if(b3<='Z'&&b3>='A') cout<<b3+('a'-'A');
      else cout<<b3;
      if(b4<='Z'&&b4>='A') cout<<b4+('a'-'A');
      else cout<<b4;
     
if(b5<='Z'&&b5>='A') cout<<b5+('a'-'A');
      else cout<<b5;
      if(b6<='Z'&&b6>='A') cout<<b6+('a'-'A');
      else cout<<b6;
      if(b7<='Z'&&b7>='A') cout<<b7+('a'-'A');
      else cout<<b7;
     
     
     }
    return 0;
 
}
 
Това е решението на учебника.Запознат съм със всички символи, но нещо пак не мога да разбера ;д
 
#include<iostream>
using namespace std;
int main()
{
     char c1,c2,c3,c4,c5,c6,c7; int d,l;
cin>>c1>>c2>>c3>>c4>>c5>>c6>>c7;

l=c1==c7||c1==c7+'A'-'a'||c7==c1+'A'-'a';

l=l&&(c2==c6||c2==c6+'A-'a'||c6==c2+'A'-'a');

l=l&&(c3==c5||c3==c5+'A-'a'||c5==c3+'A'-'a');

d=l?('A'-'a'):('a'-'A');

if(l&&c1>='a'&&c1<='z'||!l&&c1>='A'&&c1<='Z') c1+=d;

if(l&&c2>='a'&&c2<='z'||!l&&c2>='A'&&c2<='Z') c2+=d;

if(l&&c3>='a'&&c3<='z'||!l&&c3>='A'&&c3<='Z') c3+=d;

if(l&&c4>='a'&&c4<='z'||!l&&c4>='A'&&c4<='Z') c4+=d;

if(l&&c5>='a'&&c5<='z'||!l&&c5>='A'&&c5<='Z') c5+=d;

if(l&&c6>='a'&&c6<='z'||!l&&c6>='A'&&c6<='Z') c6+=d;

if(l&&c7>='a'&&c7<='z'||!l&&c7>='A'&&c7<='Z') c7+=d;

 

cout<<c1<<c2<<c3<<c4<<c5<<c6<<c7<<endl;

return 0;

}

Редактирано от zOFFgam (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

публикувано (редактирано)

omg

Кой учебник ползваш? Кажи ми, за да не го препоръчвам на никого. Намери си по-добър учебник или някакъв друг източник. 

Редактирано от RJ45 (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

Здравейте,От заглавието става ясно каква е задачата.Сам се уча у нас и няма кого да питам.Гледах в интернет, но решенията им са много над моето ниво.Запознат съм само със if-else,do-while,for,char.

Това което твърдиш, че знаеш би било предостатъчно. Но не си го научил правилно явно. Например не знаеш приоритетите на логическите операции. Или не си се замислил за употребата им. Прегледай си още първото ...хмм... "условиище" във if-a.Между другото шегуваш се, нали? Това долу е решението на задача за проверка на палиндром от учебника? Мамка му, ей това най-ме дразни - учебник който те учи как да пишеш код по най-грешния възможен начин...Ползвай скоби. Не ти трябва да знаеш приоритетите. Даже ако питат мен компилатора трябваше да ги изпълнява в произволен ред за да се научат всички да слагат скоби. Редактирано от flare (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

След като съм си направил труда да напиша всичко това тук значи има защо.Блъскам си главата не знам от колко часа да разбера къде ми е грешката.Относно скобите изобщо не те разбрах къде трябва да слагам още и защо ? RJ45, ако можеш да ми препоръчаш някой учебник за С++ ще е добре тъй като аз знам само два, но другия е много малък.

Редактирано от zOFFgam (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

След като съм си направил труда да напиша всичко това тук значи има защо.Блъскам си главата не знам от колко часа да разбера къде ми е грешката.Относно скобите изобщо не те разбрах къде трябва да слагам още и защо ?

Не си губи времето с глупости. По-добре се научи да работиш със стрингове, масиви и други и ще решаваш такива задачи за 2-3реда. Този код, който е в "учебника" ти е меко казано малоумен и никой програмист няма изобщо да се занимава да го чете. 

 

Силно се съмнявам, че този код от "учебника" ти изобщо върви.

Редактирано от RJ45 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

След като съм си направил труда да напиша всичко това тук значи има защо.Блъскам си главата не знам от колко часа да разбера къде ми е грешката.Относно скобите изобщо не те разбрах къде трябва да слагам още и защо ? RJ45, ако можеш да ми препоръчаш някой учебник за С++ ще е добре тъй като аз знам само два, но другия е много малък.

Ми ако си беше направил труда да си прегледаш израза и да го разтълкуваш по ред на изпълнение щеше да ти е по-полезно.

Например, само ако ми обясниш подробно, какво искаш да постигнеш с условието което посочих и веднага ще си хванеш грешката. Подсказах ти предостатъчно с приоритетите. Би могъл и да се замислиш, какво точно се е променило, като ги сложиш на един ред спрямо това да са на 3 различни....

Относно къде да слагаш скоби - не мога да намеря място, където да не трябват още. Разделяш голямото условие на под-условия по смисъл и ги заграждаш в скоби. След това правиш същото и с под-под- условията и така докато не остане операция неоградена в скоби.

Не си губи времето с глупости. По-добре се научи да работиш със стрингове, масиви и други и ще решаваш такива задачи за 2-3реда. Този код, който е в "учебника" ти е меко казано малоумен и никой програмист няма изобщо да се занимава да го чете.

aз го прочетох... Публикувано изображение

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

Ще се радвам ако някой просто ми оправи грешките или да ми каже как да го направя :).И не намирам проблем в това if-a ми да е на 1 ред.Специално на него сложих скоби и отново се получава грешен отговор.Не съм и някой, който пък грам не може да мисли.В Математическа гилмназия съм и нямам грешка по математика(11 клас).Ако не те мързи просто пренапиши кода ми правилно и аз ще видя къде съм сгрешил и другият път просто няма да я допускам...

Редактирано от zOFFgam (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Аз го реших така:

#include <iostream>using namespace std;int main(){   char c[] = {'a','b','c','d','c','b','a'};   bool isPalindrome = false;   for(int i =0; i<sizeof(c);i++){       if(i==sizeof(c)/2)           break;              if(c[i]!=c[sizeof(c)-i-1])       {           isPalindrome=false;           break;       }        else if(c[i]==c[sizeof(c)-i-1])           isPalindrome=true;   }   if(isPalindrome) cout<<"This is palindrome.";   else cout<<"This is not palindrome.";   return 0;}

Със стринг май ще е по-лесно.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Решението ти е по-хубаво със сигурност, но аз не съм виждал повечето от нещата в него.Знам, че sizeof ти казваще размера в байтове на дадения операнд.С какво ти помага той в тази задача.Можеш ли само това да обясниш ?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

Sizeof ти дава размера на масива. В моят код sizeof връща 7, защото има 7 елемента в него.В масивите броенето започва от нула и завършва до големината на масива минус 1(sizeof(c ) -1), в моя случай е 6. Научи как се работи с масиви. Ако искаш пък да сравняваш без значение дали буквите са малки или големи може да използваш tolower(). Например: if(tolower('A')=='a') ...

Или пък в моят случай:

if(tolower(c)!=tolower(c[sizeof(c )-i-1)) .. break;

Редактирано от RJ45 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

// ...   bool isPalindrome = true;   for(int i = 0; i <= sizeof(c)/2; i++){       if(c[i] != c[sizeof(c)-i-1])       {           isPalindrome=false;           break;       }   }// ...

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

flare не знам защо си мислиш, че аз не съм се постарал или явно съм доловил негативизъм, но проблемът не бяха скобите в моята програма.Днес забелязах, че просто извеждам индекса на символа, а не самият символ и просто сложих (char) пред индексите и се получи вярно :)

Редактирано от zOFFgam (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

flare не знам защо си мислиш, че аз не съм се постарал или явно съм доловил негативизъм, но проблемът не бяха скобите в моята програма.Днес забелязах, че просто извеждам индекса на символа, а не самият символ и просто сложих (char) пред индексите и се получи вярно Публикувано изображение

 

И все пак решението ти е хаотично, неефективно и абсолютно нечетимо. Кодът на RJ45 е по-структуриран, по-четим и по-ефективен. Добрият програмист трябва да решава дадена задача възможно най-просто, а кодът му трябва да бъде разбираем за останалите, на които евентуално ще се наложи да го четат.

 

Относно скобите: смята се за добра практика винаги да се използват скоби, дори когато следва само един оператор.

 

[*]Използвай for или while цикли, вместо да проверяваш всяка една комбинация от символи с if условия

[*]Използвай масиви или стрингове - ще си улесниш задачата многократно, а и ще можеш да приложиш алгоритъма си за N на брой символи. В момента програмата ти може да обработи точно 7 символа.

[*]Именувай променливите си със смислени имена: b1, b2, b3... не носят никаква информация за това какво е предназначението на променливата.

[*]Запознай се с основите на програмирането - според мен трябва да се запознаеш по-обстойно с цикли и масиви, за да не тръгваш отново с велосипед за Луната.

[*]Този "учебник" можеш спокойно да го изхвърлиш. Препоръчвам ти този, ако английският ти няма да е проблем. Ето ти и документацията на езика C++.

Редактирано от AxCx (преглед на промените)
  • Харесва ми 4

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

flare не знам защо си мислиш, че аз не съм се постарал или явно съм доловил негативизъм, но проблемът не бяха скобите в моята програма.Днес забелязах, че просто извеждам индекса на символа, а не самият символ и просто сложих (char) пред индексите и се получи вярно Публикувано изображение

Негативизъм спрямо подхода ти към неуспешните ми опити да ти помогна - да естествено. Особено щом смяташ, че програмата, която си постнал отгоре с едно кастване работи...

Все пак:

Логическото И (&&) има по-висок приоритет от логическото ИЛИ (||).

Какво искаш да направиш с условието:

if(b1==b7||b1==b7+'A'-'a'||b7==b1+'A'-'a'&&b2==b6||b2==b6+'A'-'a'||b6==b2+'A'-'a'&&b3==b5||b3==b5+'A'-'a'||b5==b3+'A'-'a')
Ами, да провериш дали първата буква е същата (без значение главна/малка) с седмата, втората с шестата и третата с петата. Тоест имаме три условия свързани с И - и трите трябва да са изпълнени за да е палиндром. Всяко от тях обаче е малко по-сложно, заради възможността буквите да са главни или малки. Съответно имаме подусловия. И тук ти много смело разчиташ че проверките за под условията ще се изпълнят преди комбинирането им.

Да ама няма да стане. Защото И-тата ще се изпълнят първи. Тоест:

b1==b7 || b1==b7+'A'-'a' || b7==b1+'A'-'a'&&b2==b6 || b2==b6+'A'-'a' || b6==b2+'A'-'a' && b3==b5 || b3==b5+'A'-'a' || b5==b3+'A'-'a'

След което имаме много условия вързани с ИЛИ-та и дори едно единствено да се изпълни, ще влезем в тялото, примерно дори само първата и последната буква да са еднакви, без значение останалите.

За да е правилно, трябва да е така:

if (b1 == b7 || b1 == b7 + 'A' - 'a' || b7 == b1 + 'A' - 'a') &&    (b2 == b6 || b2 == b6 + 'A' - 'a' || b6 == b2 + 'A' - 'a') &&    (b3 == b5 || b3 == b5 + 'A' - 'a' || b5 == b3 + 'A' - 'a'))
Аз слагам скоби и около всяко условие поотделно, но в случая не съм, за да покажа кои скоби трябват и кои не.
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

flare явно съм се заблудил, за което се извинявам.Благодаря, че ми помогнахте да си реша задачата и, че ми дадохте напътствия за по-добро решение.Тъй като минаха няколко дни си направих труда да направя с новите ми знания да направя по-добро решение.AxCx не успях да реша задачата със N броя букви, но какво ще кажете за това решение, което мисля, че е по-добро от старото ми:

#include<iostream>using namespace std;int main(){     char ch,i,a[7];     for (i=1;i<=7;i++)     {      cin>>ch;      if((ch<='Z')&&(ch>='A')) a[i]=ch;else a[i]=(ch-'a'+'A');           }     if (a[1]==a[7]&&a[2]==a[6]&&a[3]==a[5]) cout<<(char)a[1]<<(char)a[2]<<(char)a[3]<<(char)a[4]<<(char)a[5]<<(char)a[6]<<(char)a[7]<<endl;     else cout<<(char)(a[1]+'a'-'A')<<(char)(a[2]+'a'-'A')<<(char)(a[3]+'a'-'A')<<(char)(a[4]+'a'-'A')<<(char)(a[5]+'a'-'A')<<(char)(a[6]+'a'-'A')<<(char)(a[7]+'a'-'A')<<endl;     return 0;          }
 
Ако можете да ми кажете какво още трябва да науча за да направя решението за N брой числа :)
 
flare, можеш ли да ми кажеш също какво означава да работи с едно кастване ? 
 
AxCx, тъй като не се сетих за друго наименование ги наименовах ch.Ако можеш да ми помогнеш с наименованието ще съм ти много благодарен.
Редактирано от zOFFgam (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

Ако можете да ми кажете какво още трябва да науча за да направя решението за N брой числа Публикувано изображение
 
flare, можеш ли да ми кажеш също какво означава да работи с едно кастване ? 
 
AxCx, тъй като не се сетих за друго наименование ги наименовах ch.Ако можеш да ми помогнеш с наименованието ще съм ти много благодарен.

 

 

 

Прочети за класовете string и vector. Работата с тези два типа данни е малко по-особена от това, което си виждал до сега, но веднъж усвоиш ли ги, задачи като тази ще ти се струват елементарни. Можеш да пробваш да напишеш програма, която проверява N на брой думи дали са палиндроми. Използвай вектор с елементи от тип стринг:

vector<string> words;

Масив от тип char може да се извежда на конзолата без да е нужно да обхождаш елемент по елемент:

cout<<(char)a[1]<<(char)a[2]<<(char)a[3]<<(char)a[4]<<(char)a[5]<<(char)a[6]<<(char)a[7]<<endl; // няма смисълcout<<a<<endl; // по-лесният вариант

Можеш и да го въвеждаш без цикъл:

char str[N];cin>>str;/* Ако въведеш повече от N-1 символа, * програмата ще се счупи! */

Ето тук може да прочетеш какво означава терминът "type casting". На кратко: изрично казваш на компилатора да разглежда дадена променлива от тип А, като променлива от тип Б. Разбира се, не всички каствания са позволени, а при неправилни такива могат да се получат трудни за откриване грешки.

Именуването на променливите в твоя случай не е толкова фатално, защото са само три, а и вече знаем, че става дума за палиндроми. Може би това "а" е по-добре да стане "word". Също така е по-добре да декларираш променливите за for цикъл вътре в него, защото при наличието на повечко цикли може да се объркаш и да презапишеш брояча с друга стойност:

for (int i = 0; i < length; i++){            ....}

Забелязах, че почваш броенето на елементите в char масива от 1 и свършваш с 7. В програмирането първият елемент е нулевият, а последният е всъщност N-1.

 

Публикувано изображение

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

AxCx, мерси за обяснението. Беше ми много полезно и започвам веднага да уча string :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.