Попытка изменить порядок ввода символов. Я очень близко, но без сигары.
#include <iostream>
using namespace std;
const int MAX = 10;
int main()
{
char a[MAX], next;
int index = 0;
cout << "Please enter in up to 10 letters ending with a period: " << endl;
cin >> next;
while((next != '.') && (index < 10))
{
a[index] = next;
index++;
cin >> next;
//cout << " " << next << endl;
}
int numbers_used = index;
for(index = 0; index <= numbers_used; index++)
{
a[index] = a[numbers_used -1];
numbers_used--;
cout << a[index] << " " << endl;
}
}
Я получаю все, кроме последнего переключателя, и хотя мой код не такой чистый, я не вижу, где я ошибаюсь.
Код книги:
for(index = numbers_used -1; index >= 0; index--)
cout<<a[index];
cout<< endl;
и почему это index = numbers_used – 1?? Поскольку numbers_used был установлен в индекс, и индекс был инициализирован в 0, а не 1, я бы не хотел запускать цикл “numbers_used” количество раз? Что мне не хватает?
Попробуй это:
char* flip(char* str, int len) {
for(int x=0; x<(len/2); x++) {
swap(str[x], str[len-x-1]);
}
return str;
}
На данный момент, после того, как вы дойдете до середины строки, вы перезапишите значения, которые вам нужно будет скопировать во вторую половину. С строкой, подобной “FooBarBiz”, ваш код будет вызывать следующие итерации (я поставил пробелы, чтобы попытаться сделать все более ясным):
1: FooBarBiz
2: z ooBarBiz
3: zi oBarBiz
4: ziB BarBiz
5: ziBr arBiz
6: ziBra rBiz
7: ziBrar Biz
...
Однако код, который я опубликовал, использует функцию swap
c++ для обмена бесплатными значениями, таким образом, нет потерянных значений (мы не делаем перезаписи), и вам не нужно хранить целую строку в заполнителе переменная. Имеет ли это смысл?
Если вы хотите отменить список, вы должны начать с последнего элемента и уменьшить индекс.
Вы можете приблизиться к этому, по крайней мере, двумя разными способами. Вы можете отменить порядок строки, а затем распечатать, или вы можете оставить исходную строку немодифицированной и просто напечатать в обратном порядке. Я бы рекомендовал последний подход, в этом случае все, что вам будет нужно сделать, это изменить ваш последний for
цикла к этому:
for(index = 0; index < numbers_used; index++)
{
cout << a[numbers_used-index-1] << " " << endl;
}
Проблема может быть решена с помощью итераторов из стандартной библиотеки. ДвунаправленныйИмятор, например, предлагаемый std :: string, std :: list или std :: vector, может перемещаться в обоих направлениях.
Используя std :: string, решение может быть:
#include <iostream>
#include <string>
using namespace std;
int main(int, char**) {
char n = 0;
string a;
while (n != '.' && a.size() < 10) {
cin >> n;
if (n != '.') {
a.push_back(n);
}
}
for (string::reverse_iterator it = a.rbegin(); it != a.rend(); ++it) {
cout << *it << endl;
}
}
Разве это не будет проще?
#include<iostream>
#include<string>
using namespace std;
const int MAX = 5;
int main()
{
char a[MAX], next;
int index = 0;
bool period = false;
cout << "Please enter in up to 10 letters ending with a period: " << endl;
for(int i = 0; i < MAX && !period; i++)
{
cin >> next;
if(next != '.')
{
a[i] = next; // put the value into the array
index++;
}
else
period = true;
}
for(int i = index - 1; i >= 0 ; i--)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
Я начну с использования: используйте std::string
вместо std::string
в стиле C – это универсально менее грязно и более гибко.
Тем не менее, отпустите все строки C-стиля, так как вы пытаетесь это сделать и, видимо, ваш учебник.
Я не буду комментировать способ чтения пользователем, потому что я не уверен, что он скопирован из учебника (yikes !!), или вы сделали это сами в любом случае, я считаю, что это бессмысленно и неправильно, потому что это может привести к нескольким проблемам. Обратите внимание, что данное решение книги выводит только символы в обратном порядке и не отменяет сам массив символов. Очевидно, вы пытаетесь изменить его.
Ваше решение уменьшает переменную numbers_used
внутри самого цикла for. Это очень плохая идея, поскольку эта переменная используется в условном выражении цикла for. Это означает, что цикл остановится, прежде чем он повторится по всему массиву. Даже если цикл работал правильно, вы все равно не изменили бы массив, как только эта строка будет выполняться
a[index] = a[numbers_used -1];
исходное значение a[index]
перезаписывается и забывается.
Я попробую написать простое решение для изменения символьного массива для новичков:
#include <iostream>
#include <cstring> //getline, strlen
using namespace std;
const int MAX_LETTERS = 10;
int main() {
char a[MAX_LETTERS + 1]; //since it zero terminated
cout << "Enter at most " << MAX_LETTERS << "characters (anything over " <<
MAX_LETTERS << " will be truncated):\n";
cin.getline(a, MAX_LETTERS + 1);
int length = strlen(a); //returns length of input
int last_char = length - 1;
//reverse array
for (int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[last_char];
a[last_char] = temp;
last_char--;
}
//print array
for (int i = 0; i < length; i++)
cout << a[i];
return 0;
}
Прочтите этот учебник по строкам стиля C, это поможет вам многое.
Последний цикл цикла в коде
int numbers_used = index;
for(index = 0; index <= numbers_used; index++)
{
a[index] = a[numbers_used -1];
numbers_used--;
cout << a[index] << " " << endl;
}
Если мы рассмотрим 10 букв abcdefghij и в соответствии с вашим кодом numbers_used=10
после первого цикла. Так во втором цикле
//In for loop
//index=0
a[index]=a[numbers_used-1]; // a[0]=a[9] => a[0]=j
numbers_used--; //numbers_used=9;
//index=1
a[index]=a[numbers_used-1]; //a[1]=a[8] => a[1]=i
numbers_used--; //numbers_used=8;
//index=2
a[index]=a[numbers_used-1]; //a[2]=a[7] => a[1]=h
numbers_used--; //numbers_used=7;
//index=3
a[index]=a[numbers_used-1]; //a[3]=a[6] => a[1]=g
numbers_used--; //numbers_used=6;
//index=4
a[index]=a[numbers_used-1]; //a[4]=a[5] => a[4]=f
numbers_used--; //numbers_used=5;
//index=5
a[index]=a[numbers_used-1]; //a[5]=a[5] => a[5]=e
numbers_used--; //numbers_used=4;
// index=6 and numbers_used becomes 4 => index <= numbers_used condition is violated
so you will out of for loop.
Вот почему вы не можете пройти. И во втором коде i, e в Книге.
for(index = numbers_used -1; index >= 0; index--)
cout<<a[index];
cout<< endl;
Значение number_used равно 10, но [9] – последнее значение в массиве, поэтому индекс присваивается number_used-1. так что вы можете печатать от [9] до [0].