Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] работа со строками, можно ли улучшить алгоритм? 
:(
    Опции темы
DeathKnight
Дата 4.11.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



задача такая:
ввести неизвестное кол-во строк по 100 символов
все слова нечётной длинны перевернуть..

Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char **ms, *n,*s, d;
    int i,j,k,c,kk,l,z;
    i=j=kk=k=l=0;
    c=-1;
    ms=(char**)calloc(2,sizeof(char*));
    for(i=0;i<2;i++)
        ms[i]=(char*)calloc(100,sizeof(char));

    printf("vvedite text:\n");
    do
    {
        if(k>1)
        {
            if(!(ms=(char**)realloc(ms,(k+1)*sizeof(char*)))) printf("oshibka");
                for(;i<=k;i++)
                if(!(ms[i]=(char*)calloc(100,sizeof(char)))) printf("oshibka");
        }

        fgets(ms[k], 99, stdin);

        for(j=0;j<100;j++)
        {    
            if(ms[k][j]=='\n')
            {
                ms[k][j]='\0'; break;
            }
        }

        k++; 
        
    }while(ms[k-1][0]!='\0');

    if(k==1){printf("vi ne vveli ni odnoi stroki\n"); return 0;}
    
    for(i=0; i<k;i++)
        puts(ms[i]);

    for(i=0;i<k;i++)
    {
        for(j=0;j<100;j++)
        {
            kk=1;
            if(ms[i][j]==' ' || ms[i][j]=='\t' || ms[i][j]=='\0'||ms[i][j]==',' ||ms[i][j]=='.')
            {
                l=c;
                c=-2;
                kk=0;
            }
            c++;
            
            if(!kk && !(l%2) && l)
            {
                s=(*(ms+i)+j-1);
                n=s-l;
                                
                for(z=l/2;z>=0;z--,n++, s--)
                {
                    d=*s;
                    *s=*n;
                    *n=d;
                }
            }
        }
    }
    for(i=0;i<k;i++)
        puts(ms[i]);

    return 0;
}




вопрос в том, что препод может придраться к решению..
помогите улучшить алгоритм
PM   Вверх
ИванМ
Дата 4.11.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 13
Всего: 23



Лучше пользоваться не fgets, а gets, тогда не надо присваивать элементу со значением "\n" значение 0. И кол-во символов в строке можно узнать с помощью strlen, а не вручную высчитывать.  Обратить строку можно легче:
Код

inr len=strlen(str);
for(int i=0;i<len/2;i++)
{
    char c=str[i];
    str[i]=str[len-i-1];
    str[len-i-1]=c;
}



PM MAIL   Вверх
darkart
Дата 5.11.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Код

#include<malloc.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>

#define MAX_STRING_LENGTH 101 //максимальная длина строки + 1 на 0 символ

int RevertWordsWithOddLength( char* szString )
/*функция возвращает количество перевернутых слов в строке szString*/
{
    int i, iWordLength, iRetVal;// i - счетчик, iWordLength - длина слова, iRetVal - возвращаемое значение
    char *pWordStart, *pSymbol, *pWordEnd;//pWordStart - указатель на начало слова, pSymbol - указатель на текущий символ, pWordEnd - указатель на конец слова

    iRetVal = 0;//инициализация возвращаемого значения
    pSymbol = szString;//инициализация указателя на текущий символ - начало строки

    while( *pSymbol )//пока не конец строки
    {
        while( *pSymbol && !isalpha( *pSymbol ) )//пока не конец строки и символ не буква
            pSymbol++;//переход к следующему символу

        pWordStart = pSymbol;//запоминаем указатель на начало слова или на конец строки

        while( isalpha( *pSymbol ) )//пока очередной символ - буква
            pSymbol++;//переход к следующему символу

        iWordLength = pSymbol - pWordStart;//вычисляем длину слова

        if( iWordLength & 1 )//если длина слова - нечетна
        {
            iWordLength >>= 1;//делим на два

            pWordEnd = pSymbol - 1;//запоминаем позицию конца слова

            for( i = 0; i < iWordLength; i++ )//iWordLength раз меняем символы местами
            {
                *pWordStart ^= *pWordEnd ^= *pWordStart ^= *pWordEnd;//обмен символов, основываясь на свойстве xora
                pWordStart++;//движемся к ентру слова слева
                pWordEnd--;//движемся к центру слова справа
            }
            iRetVal++;//увеличиваем количество перевернутых слов
        }
    }
    return iRetVal;//возвращаем количество перевернутых слов
}

int main()
{
    char** dszStrings;//для хранения массива строк
    int i, nStrings;//i - счетчик, nStrings - количество строк

    printf( "Please enter strings count:\n" );
    scanf( "%d", &nStrings );//ввод количества строк

    dszStrings = ( char** )calloc( nStrings, sizeof( char* ) );//выделение памяти под nStrings указателей на 0-строки
    for( i = 0; i < nStrings; i++ )//выделение памяти для каждой строки
    {
        dszStrings[ i ] = ( char* )calloc( MAX_STRING_LENGTH, sizeof( char ) );//выделение памяти
        printf( "Please enter a string number %d:", i );
        fflush( stdin );
        gets( dszStrings[ i ] );//читаем очередную строку
    }

    //печать исходных строк
    printf( "Source strings:\n" );
    for( i = 0; i < nStrings; i++ )
        printf( "%s\n", dszStrings[ i ] );

    for( i = 0; i < nStrings; i++ )
        RevertWordsWithOddLength( dszStrings[ i ] );//переворачиваем слова в каждой из строк

    //печать строк-результата
    printf( "Result strings:\n" );
    for( i = 0; i < nStrings; i++ )
        puts( dszStrings[ i ] ) ;

    //освобождение памяти
    for( i = 0; i < nStrings; i++ )
        free( dszStrings[ i ] );
    free( dszStrings );

    getch();//ждем ввода

    return 0;
}

PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.