Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 23:56   #1
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию Ввести строку, состоящую только из букв, и определить, являются ли буквы в строке упорядоченными по алфавиту

Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main()
{
    char str[80];
    int i;
    puts("Vvedite stroku");
    scanf("%s",str);
    for(i=0; i<strlen(str); i++)
    {
             if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))
           {
               if (i) 
               {
                  if (int(str[i]) != int(str[i-1])+1)
                     break;      
               }
            
    }
        
        }
    if (i == strlen(str))
       printf("!!PRAVEL`NO!!\n");   
       else
       {
           printf("NEPRAVEL`NO \n");
            
       }
    getchar();
    getchar();
}
Объясните пожалуйста вот эти строки. Построчно!

Код:
if (i) 
               {
                  if (int(str[i]) != int(str[i-1])+1)
                     break;
И почему в конце 2
Код:
getchar();
getchar();
NeLIN вне форума Ответить с цитированием
Старый 03.07.2013, 00:15   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Цитата:
Сообщение от NeLIN Посмотреть сообщение
Объясните пожалуйста вот эти строки. Построчно!
Код:
if (i) 
               {
                  if (int(str[i]) != int(str[i-1])+1)
                     break;
В ASCII кодировке английские буквы идут по порядку. Почему и можно сравнивать код тестируемой буквы с кодом предыдущей буквы, увеличенным на единицу.

Цитата:
И почему в конце 2
Код:
getchar();
getchar();
Код корявый, отчего и 2 getchar(), каковые заменяются более понятным system("pause").

Не запускал, но уверен, что "abc" будет !!PRAVEL`NO!!, а "aBc" будет !!NE PRAVEL`NO!!.
Что, очевидно, не правильно))

А еще, для интереса, желательно добавить тест на русские буквы. Там похитрее чуть, потому што Ё на отшибе.
Smogg вне форума Ответить с цитированием
Старый 03.07.2013, 00:55   #3
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
В ASCII кодировке английские буквы идут по порядку. Почему и можно сравнивать код тестируемой буквы с кодом предыдущей буквы, увеличенным на единицу.


Код корявый, отчего и 2 getchar(), каковые заменяются более понятным system("pause").

Не запускал, но уверен, что "abc" будет !!PRAVEL`NO!!, а "aBc" будет !!NE PRAVEL`NO!!.
Что, очевидно, не правильно))

А еще, для интереса, желательно добавить тест на русские буквы. Там похитрее чуть, потому што Ё на отшибе.
А вот в начале if(i).Что значит
NeLIN вне форума Ответить с цитированием
Старый 03.07.2013, 01:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
А вот в начале if(i).Что значит
это значит, что код написан криво! впрочем, об этом уже выше говорилось.

А подразумевает сей код следущее: если i не равно 0, тогда выполнить проверку символов: сравнить текущий с предыдущим.
это позволяет не сравнивать первый символ в строке (с индексом ноль) с предыдущим символом (очевидно, что такого нет).

а код мало того, что кривой, так ещё, имхо, и не адекватный.

во-первых, кто скажет, что:
пример 1) строчка acef не упорядочена по алфавиту?
пример 2) строчка AbcD не упорядочена по алфавиту?
пример 3) строчка dcba не упорядочена по алфавиту (заметьте, о том, что символы стоят в возрастающем или убывающем порядке не сказано НИ слова)?
ну и наконец,
пример 4) строчка 5413#$%441223 упорядочена по алфавиту? (ваш код наверняка скажет, что !!PRAVEL`NO!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 01:40   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

пример 4) противоречит условию.

пример 3) вот за это спасибо, тут Вы остроумно подметили, не пришло б в голову.
Smogg вне форума Ответить с цитированием
Старый 03.07.2013, 01:54   #6
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
это значит, что код написан криво! впрочем, об этом уже выше говорилось.

А подразумевает сей код следущее: если i не равно 0, тогда выполнить проверку символов: сравнить текущий с предыдущим.
это позволяет не сравнивать первый символ в строке (с индексом ноль) с предыдущим символом (очевидно, что такого нет).

а код мало того, что кривой, так ещё, имхо, и не адекватный.

во-первых, кто скажет, что:
пример 1) строчка acef не упорядочена по алфавиту?
пример 2) строчка AbcD не упорядочена по алфавиту?
пример 3) строчка dcba не упорядочена по алфавиту (заметьте, о том, что символы стоят в возрастающем или убывающем порядке не сказано НИ слова)?
ну и наконец,
пример 4) строчка 5413#$%441223 упорядочена по алфавиту? (ваш код наверняка скажет, что !!PRAVEL`NO!!
Подскажи пожалуйста как должно быть правильно
NeLIN вне форума Ответить с цитированием
Старый 03.07.2013, 09:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Smogg
пример 4) противоречит условию.
угу. точно. и в программе даже зачем-то есть неработающая проверка на то, что символ строки - латинская буква.
Суть не в этом, суть в том, что
а) программа скажет, что этот пример ПРАВИЛЬНЫЙ!
б) зачем в программе код проверки на латинскую букву, если он ни на что не влияет?!!


Цитата:
Подскажи пожалуйста как должно быть правильно
во-первых, определитесь, что считать упорядоченной строкой, а что - нет. (смотри мои примеры 1..3 выше). И что должна выдавать программа, если ввели строчку, содержащую запрещённые символы (не латинские буквы)

во-вторых, я С вообще не знаю. Так, понимаю мало-мало написанный код. Но не факт, что то, что я напишу, вообще будет компилироваться и работать. Поэтому я на себя такую ответственность не возьму. Возможно, что другие форумчане, которые знают С, подcкажут...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 14:50   #8
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Соглашусь с тем человеком который говорил что код кривой. Модет так будет немного красивее?!

Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main()
{
    char str[80];
    int i;
    puts("Vvedite stroku");
    scanf("%s",str);
    int sizeStr = strlen(str);
    for (i=0; i < sizeStr-1; i++) {
        if (str[i]>='A' && str[i]<='Z') 
            str[i] += 32;
    }
    for (i=0; i < sizeStr-1; i++) {
        if ((str[i]>='a' && str[i]<='z') && str[i] > str[i+1]) break;

    if (i == sizeStr)
       printf("!!PRAVEL`NO!!\n");   
       else
       {
           printf("NEPRAVEL`NO \n");
            
       }
    getchar();
    getchar();
}
Код конечно выровнял не сильно, но зато решаются такие проблемы как различие строчных и заглавных букв, а также будет считаться что ответ правильный если пропущена буква, например: acdgz тоже считается упорядочена по алфавиту.

Конечно код писался на бумаге, но компилятор рассудит ошибся я где нить или нет.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 03.07.2013, 15:00   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
   for (i=0; i < sizeStr-1; i++) {
        if (str[i]>='A' && str[i]<='Z') 
            str[i] += 32;
    }
До последнего символа не дойдем.
Igor95 вне форума Ответить с цитированием
Старый 03.07.2013, 15:13   #10
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Код:
   for (i=0; i < sizeStr-1; i++) {
        if (str[i]>='A' && str[i]<='Z') 
            str[i] += 32;
    }
До последнего символа не дойдем.
Опаньки, здесь реально ошибся. Просто вначале думал в одном цикле все сделать, а когда понял что не получится забыл исправить:
Код:
   for (i=0; i < sizeStr; i++) {
        if (str[i]>='A' && str[i]<='Z') 
            str[i] += 32;
    }
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дано строку. определить количество гласных букв в строке nazar113 Паскаль, Turbo Pascal, PascalABC.NET 9 18.01.2013 22:21
Ввести с клавиатуры n чисел. Определить произведение тех из них, которые являются положительными. kandrash C# (си шарп) 4 28.11.2012 16:33
Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести рез-ть на экра Газимов Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.03.2012 15:58
задача на Си,Ввести строку, в которую могут входить только цифры и буквы. vinternete Помощь студентам 0 11.07.2011 12:35
являются ли числа в файле упорядоченными Pohmel Помощь студентам 6 21.04.2008 16:12