Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Parilo
14 / 2 / 12
Регистрация: 18.11.2011
Сообщений: 90
#1

Разница между двумя идентичными программами - C++

08.11.2012, 20:18. Просмотров 633. Ответов 15
Метки нет (Все метки)

Объясните разницу между двумя абсолютно идентичными программами.
Программа 1, в текстовом файле где записаны 10 слов, нужно поменять 1 , 6, K-тый и последнее слово.
Программа 2, в текстовом файле где записаны 10 чисел, нужно поменять 1, 5, K-тый и последнее число.

Обе программа работают, но в 21 строке 1 программы я пишу while (j<i), а в 19 строке 2 программы while (j<i-1). Почему???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 #include <iostream>
 #include <fstream>
 #include <string>
 using namespace std;
 int main ()
 { ifstream f("hw6file.txt");
 string a[100];
 string s;
 getline (cin,s);
 int i=0, k;
 cin >>k;
 
 while (f>> a[i++]);
 
 a[0]=s;
 a[5]=s;
 a[k]=s;
 a[i-2]=s;
 ofstream g("hw6file.txt");
 int j=0;
 while (j<i)
 {g<<a[j]<< endl;j++;}
 
 return 0;}
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 #include <iostream>
 #include <fstream>
 using namespace std;
 int main ()
 { ifstream f("hw5file.txt");
 int a[100];
 int k,x;
 cin >> k >>x;
 int i=0;
 
 while (f >> a[i++]);
 a[0]=x;
 a[4]=x;
 a[k]=x;
 a[i-2]=x;
 
 ofstream g("hw5file.txt");
 int j=0;
 while (j<i-1)
 { g<<a[j]<< endl; j++;}
 return 0;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2012, 20:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разница между двумя идентичными программами (C++):

Разница между программами
Какая между этими программами разница? Почему они другие результаты выводят?...

Взаимодействие между двумя программами
Здравствуйте! Буду рад если кто сможет подсказать) Есть 2 программы. Одна...

Взаимодействие между двумя скомпилироваными программами
Скажите есть 2 скомпилированные программы!!!! как между ними передать текст?, ...

Как организовать обмен данными между двумя разными программами?
Как организовать обмен данными между двумя разными программами? Интересует...

Разница между двумя библиотеками потоков
В чем разница между стандартной библиотекой управления потоками &lt;thread&gt; и...

Какая разница между двумя алгоритмами?
Вообщем, как только я свою задачу не упрощал, но в указанные ограничения она...

15
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
08.11.2012, 21:56 #2
то что здесь написано разве работает?
0
Parilo
14 / 2 / 12
Регистрация: 18.11.2011
Сообщений: 90
09.11.2012, 08:19  [ТС] #3
Цитата Сообщение от Хулиган Посмотреть сообщение
то что здесь написано разве работает?
Да работает. Скопируйте и проверьте, если не верите. Причём совершенно одинаково работают.

Добавлено через 9 часов 6 минут
Так кто-нибудь сможет дать ответ или нет?
Я написал идентичные программы методом тыка, но не понимаю почему j<i в первом случае, а во втором случае j<i-1.
Если есть возможность узнать у профессиональных программистов, спросите пожалуйста. Мне не у кого спросить, кроме как на этом форуме.
Спасибо заранее.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 09:53 #4
Цитата Сообщение от Parilo Посмотреть сообщение
Почему???
Вы у себя спросите: почему вы в первом примере написали while (j<i)? i, в двух примерах (при 10 считываниях), равен 11. Последнее знчение (десятое) вы правильно записываете по индексу i - 2 = 9, т.е. в a[9]. Потом, в цикле, запись в файл. Выход из цикла будет при j = 11, значит последнее, что запишется в файл: a[10]. А что там, если десятое значение находится в a[9]? Сделайте в цикле:
C++
1
cout << j << ' ' << a[j] << endl;
и всё увидите.
Во втором примере всё правильно сделано.
1
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
09.11.2012, 10:10 #5
Цитата Сообщение от Parilo Посмотреть сообщение
не понимаю почему j<i в первом случае, а во втором случае j<i-1.
В первом случае последняя итерация избыточна. То есть в первом случае правильнее писать, как и во-втором
C++
1
while (j<i-1)
Допустим у нас в файле 10 строк.
Тогда в массив a записывается только 10 строк. Начиная с a[0] по a[9]. Но так как массив был объявлен на 100 элементов, то все оставшиеся элементы у нас уже заранее объявлены пустыми. И нам не заметно, что в выходной файл на самом деле в конец дописывается пустая строка. Вот и все различие.

А вообще, по хорошему, надо переделать момент
C++
1
2
while (j<i-1)
{ g<<a[j]<< endl; j++;}
Так как
C++
1
<< endl;
всегда дописывается. А зачем нам еще одна дополнительная пустая строка в конце файла? Не нужна.
Что-то типа
C++
1
2
3
4
5
6
while (j<i-1)
{
  g << a[j];
  j++;
  if(j!=i-1) g << endl;
}
И просто так, как мысль: можно перед while (j<i-1) сделать i--. Это позволит избавиться от всех i-1, и заменить это выражение на просто i, чтобы каждый раз, на каждой итерации не надо было компилятору вычитать и сравнивать, а надо было лишь только сравнивать.

Не по теме:

Совершенно к делу не относится, но Ближнее небо - Золотой лес

1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 10:28 #6
И считывание с файла лучше так не делать. Последнее считывание - это чтение конца файла, при этом i увеличится. Лучше, например, так делать:
C++
1
2
3
4
5
while (f.peek() != EOF)
  {
    f >> a[i];
    i++;
  }
Тогда, при выходе из цикла, i будет равна количеству слов в файле.
1
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
09.11.2012, 10:49 #7
alsav22, логично.
0
Parilo
14 / 2 / 12
Регистрация: 18.11.2011
Сообщений: 90
09.11.2012, 12:47  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы у себя спросите: почему вы в первом примере написали while (j<i)? i, в двух примерах (при 10 считываниях), равен 11. Последнее знчение (десятое) вы правильно записываете по индексу i - 2 = 9, т.е. в a[9]. Потом, в цикле, запись в файл. Выход из цикла будет при j = 11, значит последнее, что запишется в файл: a[10]. А что там, если десятое значение находится в a[9]? Сделайте в цикле:
C++
1
cout << j << ' ' << a[j] << endl;
и всё увидите.
Во втором примере всё правильно сделано.
Спасибо большое за разъяснения.
Но меня мучает единственный вопрос.
Почему в первом примере работа со строками хотя я пишу "неправильно" while (j<i), программа работает правильно. Если я даже её исправлю while (j<i-1) он тоже работает правильно.

А во втором примере работа с числами он работает правильно только в одном случае while (j<i-1).

Почем в 1 варианте при неправильном коде, программа работает правильно? Вот последний вопрос.
Спасибо заранее.
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:55 #9
Цитата Сообщение от Parilo Посмотреть сообщение
Почем в 1 варианте при неправильном коде, программа работает правильно? Вот последний вопрос.
Ради эксперимента, попробуйте так:
while (j<i)
{a[j]="abcd";j++;}
0
Parilo
14 / 2 / 12
Регистрация: 18.11.2011
Сообщений: 90
09.11.2012, 12:59  [ТС] #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Ради эксперимента, попробуйте так:
while (j<i)
{a[j]="abcd";j++;}
Я Вас не понял.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:00 #11
Цитата Сообщение от Parilo Посмотреть сообщение
А во втором примере работа с числами он работает правильно только в одном случае while (j<i-1).
А если while (j<i), то какую ошибку выдаёт? И среда у вас какая?
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 13:08 #12
Цитата Сообщение от Parilo Посмотреть сообщение
Я Вас не понял.
Вам уже объясняли, что у Вас выход за границы происходит, при считывании все нормально, но при записи за границы массива произойдет ошибка.

попробуйте поменять строчку
C++
1
a[i-2]=s;
на
C++
1
a[i-1]=s;
Тоже произойдет ошибка, если такого элемента не окажется в массиве
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:15 #13
У меня и в первом случае ошибки при работе нет и во втором. Просто, во втором случае, в файл мусор из массива в конец файла запишется, и это будет видно. А в первом случае, в конец файла запишется пустая строка, и это незаметно. Но если открыть файл после записи и переместить курсор в конец до упора, то будет видно, что между курсором и последним словом две пустые строки. Одну endl сделал, а одну - та самая лишняя пустая строка из массива строк.

Добавлено через 3 минуты
Croessmah, у ТС выхода за границы массива нет. У него массивы на 100 элементов, а пишет 10. У него, при записи в файл, выход за границу записанных в массив значений.
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 13:18 #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Croessmah, у ТС выхода за границы массива нет. У него массивы на 100 элементов, а пишет 10. У него выход за границу записанных значений.
Одно от другого не отделимо - будет больше записей, выйдет и за пределы.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:24 #15
Согласен, но у него вопрос по конкретному коду.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:28 #16
Если сделать в цикле вывод на консоль. Ошибка в первом случае - пустая строка, во втором - муссор.
1
Миниатюры
Разница между двумя идентичными программами   Разница между двумя идентичными программами  
09.11.2012, 13:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 13:28
Привет! Вот еще темы с решениями:

Связь между программами
У меня есть одна программа на C++. В ней следовательно есть несколько...

Передача данных между программами
Здравствуйте, Уважаемые! Предо мною встала проблема. Есть две программы,...

Обмен данными между программами
Здравствуйте Помогите сделать программу, чтобы при наборе все символов в...

Переключение между программами в source files
Пусть имеется несколько программами в source files. Как запускать ту программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru