Переписать на С++
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Переписать на С++ - 2007-12-08 20:53:13.100000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
В общем, ситуация такая: моей бывшей однокласснице нужно писать программы на 2 языках: Паскаль и С, она меня попросила помочь. Код на Паскаль я сочинил (хотя он, конечно, сложноватый не в меру), а на С уже время не хватает. Если у кого есть время, напишите ту же программу на С. Код на Паскаль: type
student=record
imia, fam: string;
grupa: integer;
end;
var i, N, h, max, maxg:integer;
stu:array [1..100] of student;
matrix: array [1..100, 1..2] of byte; {100 - max cislo grupp}
procedure sortarray;
var e,x,y:integer;
begin
for x:=1 to N do
begin
for y:=x to N-1 do
begin
e:=stu[x].grupa;
if e>stu[y+1].grupa then begin
stu[x]:=stu[y+1];
stu[y+1].grupa:=e;
end;
end;
end;
end;
procedure naiti(P:integer);
var ch,k,S,d:byte;
begin
for ch:=1 to P do
begin
s:=0;
for k:=ch to P do
begin
if ((stu[ch].grupa=stu[k].grupa) and (stu[ch].grupa<>stu[ch-1].grupa)) then
begin
s:=s+1;
matrix[ch,1]:=stu[ch].grupa;
matrix[ch,2]:=s;
end;
end;
end;
writeln;
write('nomer gruppy : ');
for d:=1 to P do
begin
if matrix[d,1]<>0 then write(matrix[d,1],' ');
end;
writeln;
write('kol-vo studentov:');
for d:=1 to P do
begin
if matrix[d,2]<>0 then write(matrix[d,2],' ');
end;
end;{procedure}
begin
write ('Vvedite chislo studentov N = ');
readln(N);
for i:=1 to N do
begin
write('VVedite imia ',i, ' studenta - ');
readln(stu[i].imia);
write('Vvedite familiu ', i, ' studenta - ');
readln(stu[i].fam);
write('Vvedite grupu ', i, ' studenta - ');
readln(stu[i].grupa);
end;
for h:=1 to 100 do {zapolniaet matricu [1..100,1..2] nuliami}
begin
matrix[h,1]:=0;
matrix[h,2]:=0;
end;
sortarray; {sortiruet zapisi}
naiti(N); {naxodit, skolko studentov v kakoi grupe. N - kolichestvo vvedennyx studentov}
writeln;
writeln;
writeln('spisok');
max:=0;
for h:=1 to 100 do
begin
if matrix[h,2]>max then begin
max:=matrix[h,2];
maxg:=matrix[h,1];
end;
end;
writeln;
for h:=1 to 100 do
begin
if (stu[h].grupa=maxg) then writeln(stu[h].imia,' ',stu[h].fam,' ',stu[h].grupa);
end;
readln;
end.
+2 за рабочий код в репутацию гарантирую. Update: исходник исправлен
|
|
|
RE: Переписать на С++ - 2007-12-08 23:35:32
|
|
|
kosolapov
Сообщений: 37
Оценки: 0
Присоединился: 2007-07-21 05:40:00.330000
|
Лучше бы задачу саму написал_)
|
|
|
RE: Переписать на С++ - 2007-12-08 23:52:28.103333
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
Нужно условие задачи? Пожалуйста: пользователь вводит количество N студентов. Затем N раз заполняет данные - имя, фамилия, номер группы студента. Программа находит, сколько студентов в каждой группе и выводит данные студентов, которые числятся в самой большой группе. В программе должна использоваться процедура или функция, находящая и выдающая количество студентов в каждой группе. Переменные в процедуре должны использоваться локальные, глобальные не использовать.(как видно, требования насчёт переменных я не придерживался, но если будете писать, то в идеале будет, если напишите как требуется). А код свой я оставил, чтобы не было постов и флуда "Ещё один леньтяй, хочет на чужом труде выехать"
|
|
|
RE: Переписать на С++ - 2007-12-09 02:59:37.390000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
скачай программку p2c и конвертни.
|
|
|
RE: Переписать на С++ - 2007-12-09 11:56:40.540000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
Одна проблема - у меня Windows а не Linux, а р2с для Linux только, насколько я понял.
|
|
|
RE: Переписать на С++ - 2007-12-09 13:02:27.203333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
ох, блин, мне эти вендусятники, дрожащие от страха при слове "компиляция". вот здесь лежат сорцы p2c. устанавливаешь MinGW и компиляешь там p2c – это делается тривиально командой make в директории куда распаковывал. потом используешь созданный бинарник p2c. ладно, держи:/* Output from p2c, the Pascal-to-C translator */
/* From input file "test.pas" */
#include "p2c.h"
typedef struct student {
Char imia[256], fam[256];
long grupa;
} student;
Static long i, N, h, max, maxg;
Static student stu[100];
Static uchar matrix[100][2]; /*100 - max cislo grupp*/
Static Void sortarray()
{
long e, x, y, FORLIM, FORLIM1;
FORLIM = N;
for (x = 0; x < FORLIM; x++) {
FORLIM1 = N;
for (y = x + 1; y < FORLIM1; y++) {
e = stu[x].grupe;
/* p2c: test.pas, line 16:
* Warning: No field called GRUPE in that record [288] */
if (e > stu[y].grupe) {
/* p2c: test.pas, line 17:
* Warning: No field called GRUPE in that record [288] */
stu[x] = stu[y];
stu[y].grupa = e;
}
}
}
}
Static Void naiti(P)
long P;
{
uchar ch, k, S, d;
for (ch = 1; ch <= P; ch++) {
S = 0;
for (k = ch - 1; k < P; k++) {
if (stu[ch - 1].grupa == stu[k].grupa &&
stu[ch - 1].grupa != stu[ch - 2].grupa) {
S++;
matrix[ch - 1][0] = stu[ch - 1].grupa;
matrix[ch - 1][1] = S;
}
}
}
printf("\nnomer gruppy : ");
for (d = 0; d < P; d++) {
if (matrix[d][0] != 0)
printf("%12d ", matrix[d][0]);
}
printf("\nkol-vo studentov:");
for (d = 0; d < P; d++) {
if (matrix[d][1] != 0)
printf("%12d ", matrix[d][1]);
}
} /*procedure*/
main(argc, argv)
int argc;
Char *argv[];
{
long FORLIM;
PASCAL_MAIN(argc, argv);
printf("Vvedite chislo studentov N = ");
scanf("%ld%*[^\n]", &N);
getchar();
FORLIM = N;
for (i = 1; i <= FORLIM; i++) {
printf("VVedite imia %12ld studenta - ", i);
gets(stu[i - 1].imia);
printf("Vvedite familiu %12ld studenta - ", i);
gets(stu[i - 1].fam);
printf("Vvedite grupu %12ld studenta - ", i);
scanf("%ld%*[^\n]", &stu[i - 1].grupa);
getchar();
}
for (h = 1; h <= 100; h++) { /*zapolniaet matricu [1..100,1..2] nuliami*/
matrix[h - 1][0] = 0;
matrix[h - 1][1] = 0;
}
sortarray(); /*sortiruet zapisi*/
naiti(N);
/*naxodit, skolko studentov v kakoi grupe. N - kolichestvo vvedennyx studentov*/
printf("\n\nspisok\n");
max = 0;
for (h = 1; h <= 100; h++) {
if (matrix[h - 1][1] > max) {
max = matrix[h - 1][1];
maxg = matrix[h - 1][0];
}
}
putchar('\n');
for (h = 1; h <= 100; h++) {
if (stu[h - 1].grupa == maxg)
printf("%s %s %12ld\n",
stu[h - 1].imia, stu[h - 1].fam, stu[h - 1].grupa);
}
scanf("%*[^\n]");
getchar();
exit(EXIT_SUCCESS);
}
/* End. */ содержимое p2c.h, я уж не буду приводить. всё равно ведь преподу не стоит демонстрировать автоматизм трансляции из паскаля в це, всё равно править придётся. зы. скомпилять и проверить результат не удалось, ибо в твоём сорце ошибка. исправлять лень.
|
|
|
RE: Переписать на С++ - 2007-12-09 14:39:28.650000
|
|
|
Alaget
Сообщений: 330
Оценки: 0
Присоединился: 2007-11-08 15:57:53.170000
|
rgo так что получается если я хорошо знаю паскаль, то си учить вовсе не объязательно, и ещё я смогу по Linux сразу програмировать.
|
|
|
RE: Переписать на С++ - 2007-12-09 14:50:58.653333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
проще, пожалуй, использовать fpc или gpc. Я не знаю, как там с привязками к libc или syscall'ам, или gtk и всем прочим библиотекам, но по-любасу можно. А! кстати, AFAIK, gpc умеет включать C-шные хедеры, с тем чтобы использовать оттуда типы/функции. То есть, в теории, проблем быть не должно.
|
|
|
RE: Переписать на С++ - 2007-12-09 16:20:16.816666
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
rgo, я проверял паскалевский код - он рабочий. Результаты даёт верные.
|
|
|
RE: Переписать на С++ - 2007-12-09 17:19:37.683333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: t3rmin41 rgo, я проверял паскалевский код - он рабочий. Результаты даёт верные. быть того не может. в student нету поля grupe:[rgo tmp]$ fpc tmp.pas
Free Pascal Compiler version 2.0.4 [2006/11/14] for i386
Copyright (c) 1993-2006 by Florian Klaempfl
Target OS: Linux for i386
Compiling tmp.pas
tmp.pas(16,13) Error: Unknown record field identifier "GRUPE"
tmp.pas(17,18) Error: Unknown record field identifier "GRUPE"
tmp.pas(102) Fatal: There were 2 errors compiling module, stopping
tmp.pas(102) Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
|
|
|
RE: Переписать на С++ - 2007-12-09 17:34:00.130000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
блин, точно. там должно быть не .grupe a .grupa. И везде где не .grupa(е) должно быть .grupa Исходник поправил. BTW, попробовал я собрать p2c, ничего не получилось - батник выкидывает "#" is not recognised as internal or external command or operator и всё такое в том же духе. Единственное что делает - пишет только строки где @echo и всё. Запускал я makefile сделав из него makefile.bat
|
|
|
RE: Переписать на С++ - 2007-12-09 19:41:52.840000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: t3rmin41 блин, точно. там должно быть не .grupe a .grupa. И везде где не .grupa(е) должно быть .grupa Исходник поправил. BTW, попробовал я собрать p2c, ничего не получилось - батник выкидывает "#" is not recognised as internal or external command or operator и всё такое в том же духе. Единственное что делает - пишет только строки где @echo и всё. Запускал я makefile сделав из него makefile.bat потому как для сборки тебе надо поставить MinGW: MS видите ли, игнорирует стандарты POSIX, и для совместимости приходится ставить сторонние разработки, включающие в себя sh, make, cc, ld и ряд других утилит. Makefile – это не батник, это Makefile, который должен обрабатываться утилитой make. Причём этот makefile не будет обрабатываться ни make'ом от MS, ни make'ом от Borland. это Makefile для GNU make.
|
|
|
RE: Переписать на С++ - 2007-12-09 20:02:11.530000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
ОК, попробую. Правда, сегодня времени нету уже, так что позже.
|
|
|
RE: Переписать на С++ - 2007-12-09 23:31:47.543333
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
довольно галимый, но рабочий код: //---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include "string.h"
#include "stdlib.h"
#include "iostream.h"
struct student {
std::string name;
std::string surname;
int group;
};
struct group {
int number; // номер группы
int count; // сколько раз встречается
};
// возвращает номер группы, которая встречается больше всего раз
int MaxGroup(group gr[], int grCount) {
int max = 0;
for (int i = 1; i <= grCount; i++) {
if (gr[i].count > gr[max].count) {
max = i;
}
}
return max;
}
void ShowMaxGroup(student st[], int stCount, int maxGrNumber) {
cout << "Group with max number of students: " << maxGrNumber << endl;
for (int i = 0; i < stCount; i++) {
if (st[i].group == maxGrNumber) {
cout << i + 1 << ": " << st[i].name << " " << st[i].surname << endl;
}
}
}
int main(int argc, char* argv[])
{
int N;
student st[100];
int grCount = 0;
group gr[100];
cout << "Enter number of students: ";
cin >> N;
cout << "Enter students data: " << endl;
for (int i = 0; i < N; i++) {
cout << "sudent # " << i + 1 << endl;
cout << "name: ";
cin >> st[i].name;
cout << "surname: ";
cin >> st[i].surname;
cout << "group: ";
cin >> st[i].group;
cout << endl;
int j = 0;
while (j < grCount && gr[j].number != st[i].group) j++;
if (gr[j].number == st[i].group) {
gr[j].count++;
} else {
gr[grCount].number = st[i].group;
gr[grCount].count = 1;
grCount++;
}
}
int maxGr = MaxGroup(gr, grCount);
ShowMaxGroup(st, N, gr[maxGr].number);
cin >> N;
return 0;
}
//---------------------------------------------------------------------------
|
|
|
RE: Переписать на С++ - 2007-12-10 00:16:52.323333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: t3rmin41 ОК, попробую. Правда, сегодня времени нету уже, так что позже. в том что я привёл надо исправить всякие Static на static (или вообще убрать), Void->void, Char->char, PASCAL_MAIN->нафиг, ну и две ошибочные строки которые предварены комментариями от p2c. так что вовсе необязательно чего-то теперь компилировать ;)
|
|
|
RE: Переписать на С++ - 2007-12-10 00:34:34.150000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
quote:
ORIGINAL: kreol довольно галимый, но рабочий код: Ты сам хоть код компилил? У меня не выдает никакого ответа, кроме "Max group bla bla bla 0". При том, надо не просто найти группу с максимальным количеством студентов (это несложно), а вывести на экран, сколько в каждой группе студентов + список студентов в максимальной группе. Update: rgo получает обещанные +2. Если кто-то желает ещё получить, выкладывайте код - ещё 2 человекам так и быть, поставлю.
|
|
|
RE: Переписать на С++ - 2007-12-10 01:17:36.593333
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
quote:
ORIGINAL: t3rmin41 Ты сам хоть код компилил? У меня не выдает никакого ответа, кроме "Max group bla bla bla 0". При том, надо не просто найти группу с максимальным количеством студентов (это несложно), а вывести на экран, сколько в каждой группе студентов + список студентов в максимальной группе. В условии было сказано: "Программа находит, сколько студентов в каждой группе и выводит данные студентов, которые числятся в самой большой группе." Сколько в каждой группе студентов моя программа находит и сохраняет в массив gr, выводить эту информацию на экран по твоему условию не надо. Все остальные условия ("вывести на экран … список студентов в максимальной группе") выполнены. Почему у тебя не работает, это уже вопрос не ко мне. Возможно, не правильно вводишь информацию (дополнительных проверок я не ставил). Пример работы моей программы:quote:
Enter number of students: 6 Enter students data: student # 1 name: ivan surname: ivanov group: 111 student # 2 name: petr surname: petrov group: 222 student # 3 name: sidor surname: sidorov group: 333 student # 4 name: stepan surname: stepanov group: 222 student # 5 name: mark surname: markov group: 333 student # 5 name: albert surname: albertov group: 333 Group with max number of students: 333 3: sidor sidorov 5: albert albertov 6: stepan stepanov Больше всего людей в группе 333, в неё входят студенты под номерами 3 (sidor sidorov), 5 (5: albert albertov) и 6 (stepan stepanov). Что не правильно??
|
|
|
RE: Переписать на С++ - 2007-12-10 01:31:41.860000
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
*чешет репу* нда, чё-то я неправильно условие написал. Я пользуюсь Borland 5.5.1. Программа компилится, но опять выдало group with max number of students: 0. Какие данные я могу ввести неправильно? Разве что номер группы должен быть целым числом. Проверял - всё нормально я ввёл, а результата - нет. Специально проверил с теми именами и номерами, что у тебя - тот же 0. Каким компилятором пользуешься? Если Dev-C++, то всё более или менее понятно.
|
|
|
RE: Переписать на С++ - 2007-12-10 01:51:20.890000
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
Охохооох, как же я люблю эти плюсы… Я делал в шестом билдере, у меня всё работает без запинки, в чём может быть трабл, даже не могу представить. Можешь прогнать в отладчике, посмотреть, на каком месте сбой (посмотри состояние массивов после заполнения и результат функции MaxGroup). Вообще буквально неделю назад было у меня общение с одним товарищем. Я ему давал код, который у меня прекрасно работал. Он запускал у себя, и этот код вылетал просто на символе амперсанда при передаче параметра по ссылке. Тогда я решил, что всё дело в среде и переслал ему свою IDE - Borland C++ 3.1 (для доса который). Угу, как бы не так, даже моя среда разработки у него на компьютере не воспринимала передачу по ссылке. Так что тут чёрт его знает от чего всё зависит.
|
|
|
RE: Переписать на С++ - 2007-12-10 07:23:23.613333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: kreol Охохооох, как же я люблю эти плюсы… Я делал в шестом билдере, у меня всё работает без запинки, в чём может быть трабл, даже не могу представить. Можешь прогнать в отладчике, посмотреть, на каком месте сбой (посмотри состояние массивов после заполнения и результат функции MaxGroup). Вообще буквально неделю назад было у меня общение с одним товарищем. Я ему давал код, который у меня прекрасно работал. Он запускал у себя, и этот код вылетал просто на символе амперсанда при передаче параметра по ссылке. Тогда я решил, что всё дело в среде и переслал ему свою IDE - Borland C++ 3.1 (для доса который). Угу, как бы не так, даже моя среда разработки у него на компьютере не воспринимала передачу по ссылке. Так что тут чёрт его знает от чего всё зависит. ну почему же чёрт знает… просто не надо использовать неинициализированные данные. В данной ситуации у тебя массив gr нигде не инициализируется. Удивительно что это хоть где-то сработало.
|
|
|
RE: Переписать на С++ - 2007-12-10 09:28:15.390000
|
|
|
Kill_em_all
Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
|
quote:
Код на Паскаль я сочинил (хотя он, конечно, сложноватый не в меру), а на С уже время не хватает. Если у кого есть время, напишите ту же программу на С. За это время уже бы 100 раз написал на Си
|
|
|
RE: Переписать на С++ - 2007-12-10 14:32:24.456666
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
quote:
ORIGINAL: rgo ну почему же чёрт знает… просто не надо использовать неинициализированные данные. В данной ситуации у тебя массив gr нигде не инициализируется. Удивительно что это хоть где-то сработало. А йопт, точно =) Как-то все переменные main'а воспринимаются по привычке как глобальные, а глобальные сами инициализирубтся нулями. Может тогда ещё объяснишь, почему на двух разным машинах распознаётся или не распознаётся амперсанд при передаче по ссылке, ну например в функции void draw(int& x, int &y, int r) ? Тут то уж точно дело не в инициализированных переменных =)
|
|
|
RE: Переписать на С++ - 2007-12-10 16:39:37.086666
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
quote:
ORIGINAL: kreol например в функции void draw(int& x, int &y, int r) Как-то странно ты передаёшь ссылки - то int& х, то int &y) В смысле то амперсанд у типа, то у переменной стоит. quote:
Как-то все переменные main'а воспринимаются по привычке как глобальные, а глобальные сами инициализирубтся нулями. Вот-вот. Для этого в паскалевском коде я и писал
for h:=1 to 100 do {zapolniaet matricu [1..100,1..2] nuliami}
begin
matrix[h,1]:=0;
matrix[h,2]:=0;
end;
потому что в этой матрице может оказаться что угодно
|
|
|
RE: Переписать на С++ - 2007-12-10 17:45:56.770000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: kreol Может тогда ещё объяснишь, почему на двух разным машинах распознаётся или не распознаётся амперсанд при передаче по ссылке, ну например в функции void draw(int& x, int &y, int r) ? Тут то уж точно дело не в инициализированных переменных =) не знаю. надо видеть код, который то распознаётся, то нет.
|
|
|
RE: Переписать на С++ - 2007-12-10 21:57:05.563333
|
|
|
weak spirit
Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
|
quote:
ORIGINAL: rgo не знаю. надо видеть код, который то распознаётся, то нет. void draw (int& x)
{
}
void main(void)
{
} Ну как? Так понятнее? =)
|
|
|
RE: Переписать на С++ - 2007-12-10 23:01:43.586666
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
quote:
ORIGINAL: weak spirit void draw (int& x)
{
}
void main(void)
{
} Если быть более точным, void draw (int& x, int& y, int r)
{
}
void main(void)
{
int x = 10;
int y = 10;
int r = 5;
draw (x, y, 5)
} , но ругается именно на амперсанд в объявлении draw.
|
|
|
|
|