Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 20:18     Разница между двумя идентичными программами #1
Объясните разницу между двумя абсолютно идентичными программами.
Программа 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;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2012, 20:18     Разница между двумя идентичными программами
Посмотрите здесь:

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

Добавлено через 9 часов 6 минут
Так кто-нибудь сможет дать ответ или нет?
Я написал идентичные программы методом тыка, но не понимаю почему j<i в первом случае, а во втором случае j<i-1.
Если есть возможность узнать у профессиональных программистов, спросите пожалуйста. Мне не у кого спросить, кроме как на этом форуме.
Спасибо заранее.
alsav22
5282 / 4801 / 442
Регистрация: 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;
и всё увидите.
Во втором примере всё правильно сделано.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 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, чтобы каждый раз, на каждой итерации не надо было компилятору вычитать и сравнивать, а надо было лишь только сравнивать.

Не по теме:

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

alsav22
5282 / 4801 / 442
Регистрация: 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 будет равна количеству слов в файле.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
09.11.2012, 10:49     Разница между двумя идентичными программами #7
alsav22, логично.
Parilo
14 / 2 / 0
Регистрация: 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 варианте при неправильном коде, программа работает правильно? Вот последний вопрос.
Спасибо заранее.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,875
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:55     Разница между двумя идентичными программами #9
Цитата Сообщение от Parilo Посмотреть сообщение
Почем в 1 варианте при неправильном коде, программа работает правильно? Вот последний вопрос.
Ради эксперимента, попробуйте так:
while (j<i)
{a[j]="abcd";j++;}
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
09.11.2012, 12:59  [ТС]     Разница между двумя идентичными программами #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Ради эксперимента, попробуйте так:
while (j<i)
{a[j]="abcd";j++;}
Я Вас не понял.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:00     Разница между двумя идентичными программами #11
Цитата Сообщение от Parilo Посмотреть сообщение
А во втором примере работа с числами он работает правильно только в одном случае while (j<i-1).
А если while (j<i), то какую ошибку выдаёт? И среда у вас какая?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,875
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 13:08     Разница между двумя идентичными программами #12
Цитата Сообщение от Parilo Посмотреть сообщение
Я Вас не понял.
Вам уже объясняли, что у Вас выход за границы происходит, при считывании все нормально, но при записи за границы массива произойдет ошибка.

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

Добавлено через 3 минуты
Croessmah, у ТС выхода за границы массива нет. У него массивы на 100 элементов, а пишет 10. У него, при записи в файл, выход за границу записанных в массив значений.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,875
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 13:18     Разница между двумя идентичными программами #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Croessmah, у ТС выхода за границы массива нет. У него массивы на 100 элементов, а пишет 10. У него выход за границу записанных значений.
Одно от другого не отделимо - будет больше записей, выйдет и за пределы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:24     Разница между двумя идентичными программами #15
Согласен, но у него вопрос по конкретному коду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 13:28     Разница между двумя идентичными программами
Еще ссылки по теме:

C++ Как организовать обмен данными между двумя разными программами?
C++ Разница между двумя библиотеками потоков
Связь между программами C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.11.2012, 13:28     Разница между двумя идентичными программами #16
Если сделать в цикле вывод на консоль. Ошибка в первом случае - пустая строка, во втором - муссор.
Миниатюры
Разница между двумя идентичными программами   Разница между двумя идентичными программами  
Yandex
Объявления
09.11.2012, 13:28     Разница между двумя идентичными программами
Ответ Создать тему
Опции темы

Текущее время: 18:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru