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

Зеркально развернуть слово в строке. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Ег0р
1 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 5
10.12.2010, 09:23     Зеркально развернуть слово в строке. #1
"Ввести матрицу. Элементы матрицы - строки. Подсчитать сумму кодов символов каждого слова и, если сумма оказалась чётной, развернуть зеркально это слово в строке. Полученные матрицы вывести на экран."
C вводом и выводом матрицы проблем нет, но как зеркально развернуть слово в строке? И, может кто знает, как можно получить ASCII код символа и занести его в переменную типа int? Матрица задана изначально, каждый элемент - отдлельный символ, между словами пробелы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Waleros
Сообщений: n/a
30.04.2012, 17:34     Зеркально развернуть слово в строке. #2
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
#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    char *str, *s;
    s = "megaololo";
    int n = 0;
    n = strlen(s); //длина исходной строки
        str = (char*) calloc (n, sizeof(char*)); //выделяем память
    for (int i = 0; i < n; i++)
    {
        str[i] = '0'; //инициализируем, на всякий
    }
    int i = 0, j = n-1;
    while (i < n || j > 0)
    {
        str[i] = s[j];   //заполняем выходную строку
        j--;
        i++;
    }
    printf(str);
    free(str); //освобождаем память
    getchar();  
    return 0;
}
Добавлено через 4 минуты
и код символа -
C++
1
(int)(C)
Waleros
Сообщений: n/a
01.05.2012, 21:41     Зеркально развернуть слово в строке. #3
Ег0р, если не сложно - кинь код матриц плз
-=ЮрА=-
Заблокирован
Автор FAQ
02.05.2012, 01:20     Зеркально развернуть слово в строке. #4
Если без особых заморачиваний на проверку выделений памяти и прочих ньансов, то всё может выглядеть так
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
using namespace std;
 
long lenstr(char * s)//Моя самописная функция подсчёта длинны строки
{
    long i = 0;
    while(s[i] != '\0')
        i = i + 1;
    return i;
}
 
char * revstr(char * s)//Моя самописная функция переворота строки
{
    char buf;
    long len = lenstr(s);
    //Переворачиваем строку в цикле
    for(long i = 0; i < len/2; i++)
    {
        buf = s[i];
        s[i] = s[(len - 1) - i];
        s[(len - 1) - i] = buf;
    }
    return s;
}
 
int main()
{
    system("chcp 1251");
    int i, j, m, sum;
    char ** matrix = NULL;//Указатель на нашу матрицу
    cout<<"Введите число строк в матрице : ";cin>>m;
    matrix = new char * [m];//Выделяем память под строки матрицы
    //Вводим матрицу
    for(i = 0; i < m; i++)
    {
        cin.sync();//Чистим содержимое буфера перед вводом каждой строки
        matrix[i] = new char[256];//Чтобы не заморачиваться делаю строки в матрице по 256 символов
        cout<<"Введите "<<i + 1<<" строку : ";
        cin.getline(matrix[i],256); //Вводим строку
    }
    //Выводим исхожную матрицу + считаем суммы кодов символов в строках
    cout<<"Исходная матрица\n";
    for(i = 0; i < m; i++)
    {
        cout<<matrix[i]<<endl;
        //sum - будет содержать сумму кодов символов строки
        for(sum = j = 0; matrix[i][j] != '\0'; j++)
            sum += matrix[i][j];//Да вот так просто получаются коды символов
        if(sum % 2 == 0)//если сумма оказалась чётной
            //Разворачиваем строку
            matrix[i] = revstr(matrix[i]);
    }
    cout<<"Преобразованная матрица\n";
    for(i = 0; i < m; i++)
    {
        cout<<matrix[i]<<endl;
        //параллельно чистим память
        delete [] matrix[i];
    }
    system("pause");
    return 0;
}
PS:Конечно же существуют стандартные методы определения длинны строк и их реверса к примеру
char * strrev(char * s), но я решил привести код без функций стандартной библиотеки
Миниатюры
Зеркально развернуть слово в строке.  
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
02.05.2012, 11:06     Зеркально развернуть слово в строке. #5
В предыдущем исходнике ошибка. В каждой строке он не делит строку на слова. см. исходник ниже.

Добавлено через 17 секунд
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
 
int main(void)
{
    int nlines = 0;
    printf("Enter the number of strings: "); 
    scanf("%d",&nlines); printf("\n");
 
    static char** line = new char*[nlines];
    for (int z = 0; z < nlines; z++)
    {
        printf("Enter string %d less than 1024 byte: ", z);
        line[z] = new char[256]; gets(line[z]);
    }
 
    printf("\n");
 
    for (int k = 0; k < nlines; k++)
    {
        int code = 0, n = 0; char buf[256] = "\0"; 
        for (int i = n = 0; line[k][i] != '\0'; i++)
            if ((isspace(line[k][i]) && isalpha(line[k][i-1])) || 
                i == strlen(line[k])-1)
            {
                if (i == strlen(line[k])-1) 
                { buf[n] = line[k][i]; code+=buf[n]; }
                buf[i != strlen(line[k])-1 ? n : n+1] = '\0'; 
                printf("line = %d word = %s code = %d ",k,buf,code);
                if ((code % 2) == 0) printf("rev ");
 
                for (int z = strlen(buf)-1; (z >= 0) && 
                        ((code % 2) == 0); z--) printf("%c",buf[z]);
                
                int pos = (i == strlen(line[k])-1) ? i : i-1;
                for (int q = pos, p = 0; (!isspace(line[k][q])) &&
                    (p < strlen(buf) / 2) && (code % 2) == 0; q--)
                {
                    int rpos = i-strlen(buf)+p;
                    char ch = line[k][(i != strlen(line[k])-1) ? rpos : rpos+1];
                    line[k][(i != strlen(line[k])-1) ? rpos : rpos+1] = line[k][q];
                    line[k][q] = ch; p++;
                }
 
                printf("\n");
                strcpy(buf,"\0"); code = 0; n = 0;
            }
 
            else {
                buf[n++] = line[k][i];
                code+=line[k][i];
            }
 
            printf("\n");
    }
 
    _getch();
 
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
02.05.2012, 11:14     Зеркально развернуть слово в строке. #6
Цитата Сообщение от zitxbit Посмотреть сообщение
В предыдущем исходнике ошибка. В каждой строке он не делит строку на слова. см. исходник ниже.
zitxbit, я суммировал элементы строки, да слова не выделял, тк. по хорошему читая это
Цитата Сообщение от Ег0р Посмотреть сообщение
Матрица задана изначально, каждый элемент - отдлельный символ, между словами пробелы.
хотел бы увидеть входную матрицу. А вот если уже касаться ошибок, вот это

Цитата Сообщение от zitxbit Посмотреть сообщение
line[z] = new char[256];
Цитата Сообщение от zitxbit Посмотреть сообщение
include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
- очень плохой стиль программирования, смесь Си и С++, выделяется память в Си через malloc, ну и дальше код не очень(я без обид, просто констатирую факт)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2012, 11:34     Зеркально развернуть слово в строке.
Еще ссылки по теме:

Ввести строку и слово. Вставить введенное слово за пятым словом в строке C++
C++ Повторяется ли слово в строке
Максимальное слово в строке C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
02.05.2012, 11:34     Зеркально развернуть слово в строке. #7
Но раз уж так хотим работать со словами, то вот как это делается просто
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
using namespace std;
 
long lenstr(char * s)//Моя самописная функция подсчёта длинны строки
{
    long i = 0;
    while(s[i] != '\0')
        i = i + 1;
    return i;
}
 
char * revstr(char * s, long len)//Моя самописная функция переворота строки
{
    char buf;
    //Переворачиваем строку в цикле
    for(long i = 0; i < len/2; i++)
    {
        buf = s[i];
        s[i] = s[(len - 1) - i];
        s[(len - 1) - i] = buf;
    }
    return s;
}
 
int main()
{
    system("chcp 1251");
    int i, j, k, m, sum;
    bool bWord = true;//Флаг сигнализирующий что найдено начало слова
    char ** matrix = NULL;//Указатель на нашу матрицу
    cout<<"Введите число строк в матрице : ";cin>>m;
    matrix = new char * [m];//Выделяем память под строки матрицы
    //Вводим матрицу
    for(i = 0; i < m; i++)
    {
        cin.sync();//Чистим содержимое буфера перед вводом каждой строки
        matrix[i] = new char[256];//Чтобы не заморачиваться делаю строки в матрице по 256 символов
        cout<<"Введите "<<i + 1<<" строку : ";
        cin.getline(matrix[i],256); //Вводим строку
    }
    //Выводим исхожную матрицу + считаем суммы кодов символов в строках
    cout<<"Исходная матрица\n";
    for(i = 0; i < m; i++)
    {
        cout<<matrix[i]<<endl;
        //sum - будет содержать сумму кодов символов строки
        for(sum = k = (j = 0); matrix[i][j] != '\0'; j++)
        {
            if(bWord)
            {
                if(matrix[i][j] == ' ')
                    bWord = false;
                else
                    sum += matrix[i][j];
                if(!bWord && (sum % 2 == 0))//если сумма оказалась чётной
                    revstr(&matrix[i][k], j - k);//Разворачиваем слово в строке
            }
            else
            {
                k   = j;
                sum = 0;
            }
        }
    }
    cout<<"Преобразованная матрица\n";
    for(i = 0; i < m; i++)
    {
        cout<<matrix[i]<<endl;
        //параллельно чистим память
        delete [] matrix[i];
    }
    system("pause");
    return 0;
}
Миниатюры
Зеркально развернуть слово в строке.  
Yandex
Объявления
02.05.2012, 11:34     Зеркально развернуть слово в строке.
Ответ Создать тему
Опции темы

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