LINUX.ORG.RU

Массив? Структура? Куча ифов или переключатели?

 ,


0

1

Прелюдия: static int argue[] = {111, 20, 30, 40, 50, ..., 250, 260};

Предположим, написал я программу. Она смотрит на аргументы и выполняет с ними определенные действия. Например:

./mybestprog.exe --argue 50
должен выводить мне 4, а я пока додумался только до массива, в котором находится вышеприведенный список:
./mybestprog.exe --argue 4
50
. И я могу узнать только значение, а не его индекс, хотя мне нужна инверсия здесь, либо список какой, по требуемому значению показывающий другую циферку. КАК? Как вы бы сделали это?

★★★★★

hashmap?

Почему бы не сделать просто список пар и искать перебором?

Ну, или два списка пар, каждый отсортирован по одной стороне пары, искать бинарно.

schizoid ★★★
()

хотя мне нужна инверсия здесь, либо список какой, по требуемому значению показывающий другую циферку

Написано немного сумбурно, сложно понять, чего, собсно, требуется. Подозреваю, нужен двумерный массив Nx2 (или два массива, значения которых ассоциированы по индексу). И один цикл, оббегающий массив 0..N-1 .

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

Это побочный эффект желания разобраться. Да, в целом - все верно.

minakov ★★★★★
() автор топика

в чём проблема?
чтобы найти индекс перебираешь массив в цикле, когда значение совпадает с искомым делаешь break — получается индекс.
да и фигня какая-то. Слишком неоднозначное поведение. нужно как-то различать значение от индекса в вызове проги с аргументом.

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

как пример:
--argue 50 — выдаёт 4 или $4
--argue $4 — выдаёт 50
--argue $345 — выдаёт ошибку, такого индекса нет.
--argue -20 — выдаёт ошибку такого значения нет

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

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

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

Всем спасибо! Сделал так:

int arra[] = {20, 30, 40, 50, 60, 70, ..., 990};
int arrb[] = {1, 2, 3, 4, 5, 6, ..., 98};
int i, a;
sscanf(argv[1], "%d", &i);
a = 0;
while(a <= 97){
    if(arra[a] == i){
        printf("Ok! %d id is %d!\n", i, arrb[a]);
    } else {
        printf("Searching... %d is not %d\n", i, a);
        a++;
    }
}
Ругайте

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

Ассоциативный массив в Си. Как?

GHashTable, например, из glib.

А вообще google(«c associative array») много результатов выдаёт.

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

циферки поменял@код целиком вообще переписал? Те списки были образными, на деле у меня несколько другие значения, к примеру:
1=>500;
2=>560;
3=>583;
4=>631;

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

Спасибо, еще плюсов мне не хватало для полной прострации

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

«ИСПолнительный файл, предназначенный для отлова и деморализации троллей». Да и префикс такой же жирный, все новички любят выпендриваться же.

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov
int *arra;
long arraSize;
int i, N;
sscanf(argv[1], "%d", &N); // тут будет кирдык, если не было аргументов
/*
 * тут как-нибудь, например, read'ом, получаем из файла или еще откуда-нибудь
 * массив arra и его размер arraSize
 */ 
for(i = 0; i < arraSize; i++)
    if(arra[i] == N){
        printf("Ok! %d id is  on %dth place!\n", N, i+1);
        break;
    }
if(i == arraSize) printf("not found\n");
Eddy_Em ☆☆☆☆☆
()

Тебе нужно найти индекс по значению? Если не пользоваться библиотечными функциями, то я бы прогнал в цикле проверку на нужное значение до первого вхождения, инкрементируя при этом счетчик, который и будет возвращен в качестве индекса.

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

Естественно, наличие аргументов, как и их объявление, проверяю в начале main, а по --help работает напоминалка. Массив проще хранить в бинарнике, если он меняться не будет никогда, но если задача перерастет из ознакомительной в рабочую, то сделаю по-человечьи. А пока да, самоподсчет границ массива надо добить, спасибо!

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

Упс. Я увидел, как первый комментатор тебе советует хешмэп и решил, что остальные тоже решили поумничать. ☺

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

Кстати да, так как второй массив в любом случае не меняется, убрал его и вывожу a + 1, что работает также безошибочно, если уделять должное внимание первому массиву.

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

Как раз собираю 32битную виртуалочку для отладки... Ну а вынос значений в другие файлы мне сейчас еще добавит лишнего кода, а у меня этот уже плывет

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

Лучше хранить в бинарнике но в архитектурно независимом бинарнике. Как напримре майскуль хранит файлы свои. А еще можно хранить текстовый вариант и компилятор в бинарник ;)

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

Можно и так. А если данных очень до фига и они разные — использовать sqlite.

Eddy_Em ☆☆☆☆☆
()

для минимизации кода

проще вот чё:

определить какое самое длиное по цифрам значение d затем d++

затем сгенерить строку где на позициях кратных d твои значения пустоты залить пробелами.

зетем простейший БИБЛИОТЕЧНЫЙ поиск подстроки

и вывод (позиции/d +1 ) как нужный тебе ответ.

код помоему самый короткий из предложеного.

ps. используй уже написаный код. ВСЕГДА.

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

ну да искать не само значние а «_значение_»

ну и заливать _

ну и в ответе чутка другая формула :

(pos-1)/d+1 или что тоже самое :

(pos +d -1 )/d

деление целочисленое .

если ответ 0 значит нет .

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

ищем значение аргумент[1] обрамлённое символами которые заведомо нет во входных данных ( не цифра например «_»)

в программе вместо массива создаём одну длиную строку в которой на выровненых по длине саммого длиного возможножного числа распологаем данные

тогда поиском подстроки мы найдём её позицию в исходном массиве.

qulinxao ★★☆
()
#include <stdio.h>
#include <string.h>
char * data="_20__30__40__50__100_200_";
main(int a, char * b[]){
	if(a==1){printf("Usage bla bla...\n");return;};

	int d=4;
	char  c[] ="1234567890";
	char * pos=strstr(data,(sprintf(c,"_%s_",b[1]),c));
	
	if(pos==NULL)
		printf("no value in storage :) \n");
	else
		printf("%ld\n",(pos-data+d)/d);
}
qulinxao ★★☆
()
Ответ на: комментарий от XoFfiCEr

причин может быть много разных.

для выделение исполняемых ( в ч/б консоли) например.

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

это не сильно накладно по ресурсам? Вроде лишние переменные, да вот «_» это? Хотя может я просто не вижу, где лучше

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

ты не в толксах, дядя. Я могу его хоть *.dll, хоть *.mds обозвать, он от этого менее линуксовым и кошерным не станет

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

Тем более если не в толксах! Нах винду с ее примочками.

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

меньше кода .

произвольность содержимого ( не только числа , но всякое значение имеющее строковое эталоное представление)

по производительности если string.h использует какой нить кмп (или подобное) скорость поиска близка к линейной.

т.е решение как раз классическая реализация асоциативного массива.

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