Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Не работает программа


Автор: Julia9311 12.12.2012, 23:15
По идее эта программа должна с помощью функции getline() считывать строки текстового файла и проверять, является ли записанное в каждой строке выражение палиндромом. Программа работает, но выполняет не то... помогите разобраться, пожалуйста!)


Код

#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
 
bool isPal(const std::string& s, size_t i, size_t j)
{
    if(i >= s.length() || j >= s.length()) return false;
    if(i > j) std::swap(i, j);
    return std::equal(s.begin() + i, s.begin() + j, s.rbegin() + s.length() - j - 1);
}
 
int main()
{
    std::ifstream File_input("text1.txt", std::ifstream::in);
    std::string s;
    std::cout<<"Press ENTER to continue...";
    while(File_input) 
   {
    std::cout<<s<<std::endl;
    std::cin.get();
    std::getline(File_input, s);
    size_t i, j;
    std::cout << "i and j: ";
    std::cin >> i >> j;
    std::cout << (isPal(s, i, j)? "yes" : "no" );
    }
    File_input.close();
    return 0;
}

Автор: borisbn 13.12.2012, 09:10
почему сначала печатается строка
Цитата(Julia9311 @  12.12.2012,  23:15 Найти цитируемый пост)
 std::cout<<s<<std::endl;

а потом она считывается из файла ?
Цитата(Julia9311 @  12.12.2012,  23:15 Найти цитируемый пост)
std::getline(File_input, s);

как по Вашему, правильнее наоборот ? ))

Цитата(Julia9311 @  12.12.2012,  23:15 Найти цитируемый пост)
 std::cin.get();

это зачем ?

а по поводу i и j я вообще не понял... зачем они ???

почитай про то, что такое http://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC

в общем, алгоритм д.б. такой:
1) прочитать очередную строку из файла
2) напечатать её на экране
3) проверить, что 0-й символ равен последнему, 1-й - предпоследнему, 2-й - предпредпоследнему, и т.д.
4) если все пары символов равны, то напечатать "yes", иначе - "no"

Автор: feodorv 13.12.2012, 11:27
Цитата(borisbn @  13.12.2012,  10:10 Найти цитируемый пост)
3) проверить, что 0-й символ равен последнему, 1-й - предпоследнему, 2-й - предпредпоследнему, и т.д.

Можно http://forum.vingrad.ru/index.php?showtopic=312499&view=findpost&p=2230044 подсмотреть smile 

Автор: Julia9311 13.12.2012, 22:42
С программой разобралась) но как теперь сделать, чтобы строки считывались именно с помощью getline()?


Код

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std; 
int main()
{   
   int n,j,f,k;
   char ar1[100];
   char ar2[100];
   FILE *f1;
   f1=(fopen("text.txt","r"));
   fgets(ar1,100,f1);              
   n=strlen(ar1);   
   j=0; f=0; k=0;   
   while(k<n)               
   {
       if(ar1[k]==' ')       
   {
   for(int j=k; j<n; j++) 
   ar1[j]=ar1[j+1];
   n--;
   k--;
   }                              
   k++;
   }
   for(int i=n-1; i>=0; i--)               
   {
   for(j=f; j<n; j++)
   {
    ar2[j]=ar1[i];
       }
            j=0;
           f++;
              }
            int p;                                  
                p=strncmp(ar1,ar2,n); 
         if(p==0) 
        cout << "Eto polindrom\n\n"; 
          else 
            cout << "Eto ne polindrom\n\n";
 
 
return 0;
}
 

Автор: volatile 14.12.2012, 00:08
Первый вариант был много лучше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)