LINUX.ORG.RU

Сравнение строк, содержащих числа (только цифры). Критика

 


1

1

Критика нужна: желательно объективно и без перехода на личности.

Отредактировано с учетом комментариев ниже! Еще раз отредактировано с учетом комментариев ниже! Спасибо всем за помощь, друзья!

C проверкой на знак - отрицания. Посл. вариант: True

/*Данная программа сравнивает две строки, содержащие числа (только).
Возвращает A > B,  A < B или A = B, коды 1, -1 и 0. Ответ 3 - неправильный ввод 
или отсутствие аргументов.
This program compares two strings, which contains numbers (only).
It returns: A > B,  A < B or A = B, codes 1, -1 and 0. Code 3 - incorrect or empty input.
*/


#include <stdio.h>

  /*Функция печати результата*/
  int ret(int r) {

/*Если нужен код ответа (например, для PHP), раскомментируйте строку ниже*/
    //printf("%d", r);

  /*Коды  ответов и вывод на экран сообщений*/
 switch ( r ) {
        case 1:
            printf("A > B\n");
            break;
        case -1:
            printf("A < B\n");
            break;
        case 0:
            printf("A = B\n");
            break;
        case 3:
             printf("Перезапустите с двумя аргументами так: программа 123 321\n");
            break;
    }

    return r;
  }

//Функция конвертации аргумента в целое
int convert_to_int(char * ar1, int i) {

  int a = 0;

  for (i; ar1[i]; i++) a = a * 10 + (ar1[i] - '0');

  return a;
}

int main(int argc, char * argv[]) {

  /*Проверим ввод аргументов*/
  if (argc != 3)   return ret(3);

  /*Проверим знаки - если один с минусом, другой нет (и обратно)*/
  if (argv[1][0] == '-' && argv[2][0] != '-') return ret(-1);
  if (argv[2][0] == '-' && argv[1][0] != '-') return ret(1);

  int i = 0;

  /*Если оба аргумента без знаков минус. Достаточно проверить один*/
  if (argv[1][0] != '-') {
    if (convert_to_int(argv[1], 0) > convert_to_int(argv[2], 0)) return ret(1);
    if (convert_to_int(argv[1], 0) < convert_to_int(argv[2], 0)) return ret(-1);
  }
  /*Если с минусами*/
  else {
    if (convert_to_int(argv[1], 1) > convert_to_int(argv[2], 1)) return ret(-1);
    if (convert_to_int(argv[1], 1) < convert_to_int(argv[2], 1)) return ret(1);
  }
  /*Если равны*/
  return ret(0);
}




Последнее исправление: AnonymUser (всего исправлений: 46)

Ответ на: комментарий от AnonymUser

Вносите царя!
Он всё сделает однострочником.

anonymous
()

Ничего не понял. Если строки разной длины, то что должно выводиться в результате, больше та, что длиннее, пусть даже заполнена нулями?

А если одинаковой, то почему нельзя просто считать обе строки в int переменные и сравнить их? Это какое-то обязательное ограничение не делать так?

grem ★★★★★
()

Внимание! при сравнениии A = 123, B=0023 - результат будет неверным.

а если перевести в двоичные и уже так сравнивать?

targitaj ★★★★★
()

одно число инвертируешь, прибавляешь единицу, прибавляешь другое и смотришь переполнение

А - B = A + not B !+1, единица добавляется в начале сложения

Есть А и В. Делаешь операцию А-В и смотришь возникновение переноса. Чтоб получить -В делаешь инверсию В и прибавляешь 1. Потом суммируешь А и полученное -В. Выход переноса сумматора и есть ответ.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Все! Вроде код идеален! : ))

#include <stdlib.h>
#include <stdint.h>

int main(int argc, char * argv[])
{
    int64_t a = atoll(argv[2]);
    int64_t b = atoll(argv[3]);
    
    if (a  < b) return 1;
    if (a  > b) return 2;
                return 3;
}
PPP328 ★★★★★
()
Ответ на: комментарий от AnonymUser

В задании упоминается только о цифрах?

Ну пусть будет "-" при переводе строки в int он никуда не денется. Даже если сначала читать строку (или инициализировать их внутри), а потом запихивать её части в int.

Я о том, что в задании явных ограничений на дополнительные переменные нет.

grem ★★★★★
()
Ответ на: комментарий от AnonymUser

Не, ну если задача сделать свою хоть в каком-то виде в учебных целях для работы со строками в Си, то это другое дело. А так да, решение со стандартной уже выложили чуть выше.

grem ★★★★★
()
Ответ на: комментарий от grem

Не, ну если задача сделать свою хоть в каком-то виде в учебных целях для работы со строками в Си, то это другое дело. А так да, решение со стандартной уже выложили чуть выше.

Это смотря какой препод. Ведь в задаче условия, что результат будет помещаться в long long — нет.

vodz ★★★★★
()
Ответ на: комментарий от AnonymUser

У стандартной функции ещё есть фича, что она втихоря отрезает кусок, который начинается не с цифры, поэтому о неверноваедённых данных и не узнать, если дополнительно не проверять на допустимые символы.

grem ★★★★★
()

По второму фрагменту (первый не смотрел):

  /*Функция печати результата*/
  int ret(int r) {
    printf("%d", r);
    return r;
  }

Если выводишь ошибку, то она должна быть человеко-читаемой. Нет смысла выводить результат, который ты и так возвращаешь.

  /*Проверим ввод аргументов*/
  if (argc != 3) {
    printf("Restart it with two arguments!\n");
    return ret(0);
  }

Если неправильные поданные аргументы являются ошибкой, то почему возвращается нуль? Какой в этом смысл?

mikhail@fall /tmp $ ./a.out 
Restart it with two arguments!
0%                                                                                                                                                     

С какими аргументами я должен перезапустить? Если в ошибке выводится совет что делать, то его нужно делать понятным. Иначе в нем смысла нет абсолютно никакого — зачем он сдался, если все равно в сырцы смотреть?

	/*Проверим знаки*/
	if (argv[1][0] == '-' && argv[2][0] != '-')
                return ret(2);

	if (argv[2][0] == '-' && argv[1][0] != '-')
                return ret(1);

Что значит ret(2)? А ret(1)?

/*Функция конвертации аргумента в целое*/
int cycles(char *ar1, int i)
{
	int a = 0;

	for (i = i; ar1[i]; i++)
		a = a * 10 + (ar1[i] - '0');

	return a;
}

i = i? Это зачем вообще?

Почему функция называется cycles, если она конвертирует аргумент в целое?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

[qoute]i = i? Это зачем вообще? Невнимательность. Спасибо

AnonymUser
() автор топика
Ответ на: комментарий от Deleted

с именем функции промахнулся ret печатает 1 - А > B 2 A < B 3 A = B Это нужно, чтобы вернуть ответ например в PHP return ведь не печатает на экран, а нужен код ответа

В первом условии return только чтобы прекратить программу у него ведь такой смысл? Ну а без числа полумаем

convert_string_to_int.c:24:5: предупреждение: оператор «return» без значения в функции, возвращающей не void-значение return;

Поэтому 0

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

ret печатает 1 - А > B 2 A < B 3 A = B Это нужно, чтобы вернуть ответ например в PHP return ведь не печатает на экран, а нужен код ответа

Я тебе не о том говорил. Зачем тебе печатать это значение на экран? Если печатаешь, то печатай именно твое «A > B», «A < B».

Программы пишут для людей. Если человеку нужно вчитываться в твой код (исключения бывают, но только подтверждают правило), то этот код — говно.

Deleted
()
Ответ на: комментарий от Deleted

Аааа... ну тут да, получается у меня переопределен код ответа Ладно, сейчас поправлю по стандарту : ) Считал это не существенным

AnonymUser
() автор топика
Ответ на: комментарий от Deleted

Ну это ок, можно переписать но мне надо было именно в тот момент по коду из php, мне так было понятней. Но я перепишу сейчас, а то и правда вдруг кому-то надо будет (хотя вряд ли)

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Дело не в текущем коде, он, понятное дело, обучения ради написан.

Дело в общем подходе. IRL тебе скажут спасибо даже за хороший алгоритм только в том случае, если он одновременно будет хорошо поддерживаться (учитывая trade-off с необходимым уровнем производительности). В остальном его разве что на первичных половых признаках повертеть можно.

Deleted
()
Ответ на: комментарий от Deleted

Ааа ... вот оно что... А мне-то всегда алгоритмизация любыми средствами нравилась, т.е. главное что сам алгоритм корректен...

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Если честно, я не знаю, о ком речь.

Стыдно должно быть. Каждый тру лоровец, который пишет на си знает царя.

забавно тут написали «Вносите царя».

Чисто лоровская фраза. Поиск в помощь.

anonymous
()
Ответ на: комментарий от anonymous
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	return puts((char[]){(argc==3?({int a=atoi(argv[1]),b=atoi(argv[2]);(a>b)-(a<b);}):2)+'=',0})>=0;
}
anonymous
()
Ответ на: комментарий от anonymous

Царь, ты?
С atoi() я тоже могу. Но это как-то совсем не драйвово. Нет в этом царской красоты и изюминки.

anonymous
()
Ответ на: комментарий от anonymous

Программа транслита есть как раз

*Транслитерирует символы
Пользователю предлагается самостоятельно определить алфавит*/
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
    /*here we check arguments*/
    if (argc < 2) {
        printf("Argument must be a char or string:\n");
        return 0;
    }

    char* eng[33] = { "a", "b", "c", "d", "e", "f", "g",
        "h", "i", "j", "k", "l", "m", "n", "o", "p",
        "r", "s", "t", "u", "v", "y", "z", "sh", "sh'",
        "ch", "y", "e", "iu", "ya", "'", "j", "j" };
    char* rus[33] = { "а", "б", "ц", "д", "е", "ф", "г",
        "х", "и", "ж", "к", "л", "м", "н", "о", "п",
        "р", "с", "т", "у", "в", "й", "з", "ш",
        "щ", "ч", "ы", "э", "ю", "я", "ь", "ъ", "ж" };

    char c[4]; /*Буфер. Buffer*/
    int j = 0;
    int i = 0;

    while (argv[1][j] != '\0') {
        /*Каждый четный цикл пишем в буфер. We write in the buffer
	 each iteration, if 'j' is even number*/
        if (j % 2 == 0) {
            c[0] = argv[1][j];
            c[1] = argv[1][j + 1];
            c[2] = '\0';
            i = 0;
            /*Сравним буфер и все строки массива. It compares
 buffer and strings in array*/
            while (i != 33) {
                if (strcmp(c, rus[i]) == 0) {
                    printf("%s", eng[i]);
                }
                i++;
            }
        }
        j++;
    }

    printf("\n", eng[i]);
}

Вот собрать бы каждую строку «с» в один массив строк = ) Ладно-ладно, шучу

AnonymUser
() автор топика
Ответ на: комментарий от anonymous

Да развели тебя на слабО. Не понял что ли, гребень?

anonymous
()
Ответ на: комментарий от x905

это диплом или курсовая ?

Максимум на laba2 тянет.

rupert ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.