LINUX.ORG.RU

my programs


0

0
Я потихоньку изучаю язык С. Изучаю по книге Керниган и Ритчи.
Задание: Напишите версию функции squeeze(s1,s2), которая удаляет из 
s1 все символы, встречающиеся в строке s2. Вот программа:
#include 		<stdio.h>
#define MAXCHAR		1000
int main() {
	char line1[MAXCHAR] = "привет";
	char line2[MAXCHAR] = "вет";
	squeeze(line1,line2);
	printf("%s\n",line1);
	return 0;
}
squeeze(line1,line2)
char line1[];
char line2[]; {
	int i,j,k = 0;
	int d = 0;
	char line3[MAXCHAR];
	for (i = 0; line1[i] != '\0'; i++) {
		for (j = 0; line2[j] != '\0'; j++)
			if (line1[i] != line2[i])
				d = 1;
		if (d == 1) {
			line3[k++] = line1[i];
			d = 0;
		}
	}
	line3[k] = '\0';
	copy(line1,line3);
}
copy(line1,line2)
char line1[];
char line2[]; {
	int i = 0;
	while((line1[i] = line2[i]) != '\0')
		i++;
}
Мне кажетмя, что она написана, как сказать, не красиво. Особено
функция squeeze. Вопрос, можно ли написть её не так каряво или это
всё мне лишь кажется?
★
Напишите функцию any(s1,s2), которая возвращает либо ту позицию в 
s1, где стоит первый символ, совпавший с любым из символов в s2, 
либо -1 (если ни один символ из s1 не совпадает с символами из 
s2). (Стандартная библиотечная функция strpbrk делает то же самое, 
но выдает не номер позиции символа, а указатель на символ.)
#include 		<stdio.h>
#define MAXCHAR		1000
int main() {
	int i;
	char line1[MAXCHAR] = "РТЙЧЕФ";
	char line2[MAXCHAR] = "Ф";
	i = any(line1,line2);
	printf("%d\n",i);
	return 0;
}
int any(line1,line2)
char line1[];
char line2[]; {
	int i,c,d = 0;
	for (c = 0; line1[c] != '\0'; c++) {
		for (i = 0; line2[i] != '\0'; i++)
			if (line1[c] == line2[i]) {
				d = 1;
				break;
			}
		if (d == 1)
			break;
	}
	if (line1[c] == '\0')
		c = -1;
	return c;
}
То же самое
KLIM ★
() автор топика
Какая может быть работа со строками в языке, название которого не строка, а символ? ;-)

А вообще, я написал бы так:

#include <stdio.h>
#include <string.h>

void squeeze(char *dest, const char *src, const char *chars_to_remove)
{
    while(*src)
        if (!strchr(chars_to_remove, *src))
            *dest++ = *src++;
        else
            src++;
    *dest = '\0';
}

int main()
{
    char buf[20];
    squeeze(buf, "hello, world", "ello");
    puts(buf);
    return 0;
}
human0id ★★★
()
Ответ на: комментарий от KLIM
>Ты используешь те средства языка, до которых я ещё попросту недошёл.

Интересно, это какие же? Или ты таки не дочитал ещё до pointers. В любом случае -- писать так, как ты (т.е. работать с сишными строками через индексы) -- себе же дороже. Только лишние переменные и чрезвычайная запутанность кода.

human0id ★★★
()
Ответ на: комментарий от KLIM
>Вопрос, можно ли написть её не так каряво или это всё мне лишь кажется?

>Ты используешь те средства языка, до которых я ещё попросту недошёл.

Получил, что хотел :-) Изучи эти новые средства.

Selecter ★★★★
()
до кучи:

void squeeze( char *line1, char const *line2 )
{
    int mask[(unsigned char)-1];
    int i;
    char const *p;

    for ( i = (unsigned char)-1; i--; )
    {
        mask[i] = 0;
    }
    for ( p = line2; *p; ++p )
    {
        mask[(unsigned char)*p] = 1;
    }
    for ( i = 0, p = line1; *p; ++p )
    {
        mask[(unsigned char)*p] || (line1[i++] = *p);
    }
    line1[i]=0;
}
dilmah ★★★★★
()
Ответ на: комментарий от dilmah
До кучи средствами С++ :-)

#include <iostream>
#include <string>
using namespace std;

class Squeeze {
	public: string doSqueeze(string s1, string s2) {
		unsigned short i = 0;
		string::size_type pos;
		for(i=0; i < sizeof(s2); i++)
		{
			while(s1.find(s2[i],0)!=string::npos)
			{
				pos = s1.find (s2[i],0);
				s1.erase(pos,1);
			}
		}
		return s1;
	}
};

int main() {
	Squeeze squeeze;
	string s1 = "String";
	string s2 = "ing";
	cout << squeeze.doSqueeze(s1,s2) << endl;
	return 0;
}
Selecter ★★★★
()
Ответ на: комментарий от Selecter
Понимаете, те коды, что вы написали, я понимаю. Я думаю чтоу меня впереди ещё куча программ, где надо будет использовать pointers. Надо уметь использовать все средства языка, что мне даны пока в книге. А потом переходить к новым. Спасибо вам за коды.
KLIM ★
() автор топика
Ответ на: комментарий от KLIM
>Ты используешь те средства языка, до которых я ещё попросту недошёл.

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

anonymous
()
(defun in_list (x y)
  (cond 
	((null y) nil)
	((equal x (car y)) t)
	(t (in_list x (cdr y)))
  )
)

(defun squeeze (x y z)
  (cond
	((null x) z)
	((null y) z)
	((not (in_list (car x) y)) (squeeze (cdr x) y (cons (car x) z)))
	(t (squeeze (cdr x) y z))
  )
)

(defun squeeze_list (x y)
  (squeeze x y nil)
)

(defun squeeze_str (x y)
  (coerce 
	(reverse
	  (squeeze_list (coerce x 'list) (coerce y 'list))
	)
	'string
  )
)

:-) :-) :-)

У кого-нибудь есть более элегантное решение???
tugrik ★★
()
Ответ на: комментарий от tugrik
Try Python:

def squeeze(s1,s2) : return reduce(lambda s,c : s.replace(c,''),s2,s1)

Неужели на лиспе (это он?) для такой элементарной вещи нуно стоко кода? :-)))

AIv ★★★★★
()
Ответ на: комментарий от human0id
void squeeze(char *target, const char *mask){
   bool table[256](false);
   while(*mask) table[*mask] = true;
   int shift=0, len =strlen(target);
   for(int i=0;i+shif<len;i++) 
      if(table[*(target+shift)]) shift++;
      else *target = *(target++ +shift);
   *target = '\0';
}

типа немного оптимизации для длинных mask:-)
AIv ★★★★★
()
Ответ на: комментарий от AIv
Наверно можно и более короткую программу написать.
Это просто в свете многочисленных топиков в последнее время,
я решил вспомнить институтский курс по лиспу.

Вот написал бы кто-нибудь на лиспе более элегантную программу,
а я бы посмотрел.
tugrik ★★
()
Ответ на: комментарий от AIv
ну и зачем учить детей неправильному коду?

(1) bool table[256](false); -- так нельзя

(2) table[*mask] = true; -- тут ошибка, потому что char чаще всего signed.

(3) char не обязан быть 8-битным.

dilmah ★★★★★
()
Ответ на: комментарий от tugrik
LOL. оказывается в clisp'е есть встроенная функция.

(defun squeeze (x y)
  (coerce 
	(set-difference 
	  (coerce x 'list)
	  (coerce y 'list)
	)
	'string
  )
)
tugrik ★★
()
Ответ на: комментарий от dilmah
"Давно не брал я в руки шашку"(c)... каюсь. Ну смысл понятен)))

(3) ну моно поставить сайзоф(чар) это ж не стл пишеться, у меня вот он 8бит всю жизнь был)))

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