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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.