Войти

Показать полную графическую версию : Переделать программу на Си


S*2012*
02-05-2013, 20:17
Всем доброго времени суток!
Помогите, пожалуйста, переделать программу на язык Си или подскажите хотя бы, какие функции использовать, очень надо. Сам я пробовал, но у меня что-то на получается (особенно, где происходит копирование строк). Программирую на Visual C++ 2008. Заранее спасибо.
Вот, собственно, и программа:


var n, Num, Num3, i, j, t: integer;
Count: array[1..10] of integer;
a, b, c, s: string;
Names: array[1..10] of string;
begin
readln(a); {Считываем аббревиатуру}
Num:=0; {Число различных фирм}
ReadLn(N); {Считываем количество фирм}
for i:=1 to N do
begin
ReadLn(s); {считали название фирмы}
b:=s[1];
c:=s;
while (pos(' ',c)>0) and (length(b)<= length(a)) do
{составляем аббревиатуру из названия}
begin
b:=b+c[pos(' ',c)+1];
delete(c,pos(' ',c),1)
end;
if a = b then
begin
{Осуществляем поиск названия в списке уже встретившихся}
j:=1;
while (j<=Num) and (s<>Names[j]) do j:=j+1;
{Если фирма найдена}
if j<=Num then {Увеличиваем счетчик числа повторений}
Count[j]:=Count[j]+1
else begin {Иначе добавляем фирму в конец списка}
Names[j]:=s;
Count[j]:=1;
Num:=Num+1
end
end
end;
{Сортируем массивы Names и Count в порядке убывания значений массива Count}
for i:=Num downto 2 do
for j:=2 to i do if Count[j-1]<Count[j] then
begin
t:=Count[j]; Count[j]:=Count[j-1]; Count[j-1]:=t;
s:=Names[j]; Names[j]:=Names[j-1]; Names[j-1]:=s;
end;
if Num < 3 then Num3:=Num else Num3 := 3;
for i:=1 to Num do
if Count[i] >= Count[Num3] then
writeln(Names[i]);
end.

lxa85
02-05-2013, 21:16
S*2012*, уточните пожалуйста С или С++ ? Вопрос существенный, т.к. в С++ есть инструменты для работы со строками. В простом С AFAIK их нет и приходится строить достаточно сложные конструкции.
В любом случае приведите ваши собственные попытки.
Что то я код читаю, смысла понять не могу. Он что вообще делать то должен?b:=s[1];
c:=s;
while (pos(' ',c)>0) and (length(b)<= length(a)) do
{составляем аббревиатуру из названия}
begin
b:=b+c[pos(' ',c)+1];
delete(c,pos(' ',c),1)
end; »
Это в частности. Это вообще что-то странное и дикое по моему. Могу ошибаться. Нужны комментарии.

S*2012*
02-05-2013, 21:28
Писать нужно на Си.

На вход программе в первой строке подаётся аббревиатура – строка из заглавных латинских букв, состоящая не менее чем из двух и не больше чем из пяти букв. Во второй строке находится число N – количество названий, не все из них точно подходят под указанную аббревиатуру. Программа должна вывести список из трёх фирм с нужной аббревиатурой, которые упоминаются чаще всего.

Пример входных данных:
MS
5
MOUNTING SYSTEM
MACRO SOFT COMPANY
MONTANA JEANS
MOUNTING SYSTEM
MACRO SOFT
Пример выходных данных для приведенного выше примера входных данных:
MOUNTING SYSTEM
MACRO SOFT

Я зациклился на функциях gets и strcat, когда пытался переделать. Вот фрагмент:

int main(void)
{
int n, Num, Num3, i, j, t;
int count[9];
char *a, *b, *c, *s;
char names[9];

gets(a);
Num = 0;
scanf("%d", &n);

for (i = 1; i < 10; i++)
{
gets(s);
strcat(b, s);
}

}

S*2012*
02-05-2013, 21:44
Вопрос не по теме: во много ли раз проще работать си строками в Visual Basic, нежели в Си?

lxa85
02-05-2013, 22:31
S*2012*, Вопрос не по теме: во много ли раз проще работать си строками в Visual Basic, нежели в Си? »
Строки в Visual Basic (http://msdn.microsoft.com/ru-ru/library/hzcd8ze0.aspx)
Основы работы со строками Visual Basic (http://msdn.microsoft.com/ru-ru/library/ms234766.aspx)
Строки в С и С++(часть 1) (http://www.rsdn.ru/?article/cpp/cstr.xml)
Как я понял из задания, надо отсортировать предложенный массив, и вывести наиболее часто употребляемые значения. Мне сейчас сделать это несколько затруднительно. Разбейте задачу на составляющие и попробуйте поискать готовые фрагментарные решения. Ввод данных / сортировка.
Сортировка массива строк Си (http://www.programmersforum.ru/showthread.php?t=92856) может поможет (тема форумная, стартовый код не верен). :dont-know




© OSzone.net 2001-2012