Radu Опубликовано 31 марта, 2009 Жалоба Поделиться Опубликовано 31 марта, 2009 1)написать процедуру или функцию позволяющую найти самого молодого из студентов Program Lab19_pr16; Uses crt; Type Student=Record Nume:String; AnulS:integer; Grupa:string; Media:real; Age:integer; End; FisierStud=File of Student; Var FS:FisierStud; n:integer; W:student; s:string; Med:real; Key:1..4; Procedure Creare(m:integer; c:string); Var i:integer; Begin Assign(FS, c); Rewrite(FS); For i:=1 to m do Begin Writeln('Dati datele Studentul ',i); Writeln; Write('Numele si Prenumele: '); Readln(W.Nume); Write('Anul de studiu: '); Readln(W.AnulS); Write('Grupa: '); Readln(W.Grupa); Write('Media: '); Readln(W.Media); Write('Age: '); Readln(W.Age') Writeln; Write(FS, W); End; Close(FS); End; Procedure Afisare; Begin Reset(FS); While not EOF(FS) do Begin Read(FS, W); Writeln('Numele: ',W.Nume); Writeln('Anul de Studiu: ',W.AnulS); Writeln('Grupa: ',W.Grupa); Writeln('Media: ',W.Media :5:2); Writeln; End; Close(FS); End; Procedure MinAge ????????????????? P.S. Nume = имя Age= возраст Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 31 марта, 2009 Жалоба Поделиться Опубликовано 31 марта, 2009 (изменено) Radu: написать процедуру или функцию позволяющую найти самого молодого из студентов Procedure MinAge; var Age:integer;beginReset(FS);Age:=0; while not EOF(FS) do begin Read(FS, W); if W.Age>Age then Age:=W.Age; end;Close(FS); Reset(FS);while not EOF(FS) do begin Read(FS, W); if W.Age=Age then begin Writeln('Numele: ',W.Nume); Writeln('Anul de Studiu: ',W.AnulS); Writeln('Grupa: ',W.Grupa); Writeln('Media: ',W.Media :5:2); WriteLn('Age: ',W.Age:3); Writeln; end; end;Close(FS);End; Изменено 31 марта, 2009 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
leksev Опубликовано 31 марта, 2009 Жалоба Поделиться Опубликовано 31 марта, 2009 Привет троль.Выручай,нужно написать прогу с использованием рекурсии. Задание:Вычислить сумму 12членов рукуррентной последовательности: X0=1;X1=1;Xk=0.7Xk-1+1.1Xk-2;k=2,3... Язык си. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 31 марта, 2009 Жалоба Поделиться Опубликовано 31 марта, 2009 (изменено) leksev: Рекурсия - жутко неэкономичная штука. Но продемонстрировать ее применение несложно. #include<stdio.h>float x(int k){return k<=1?1:0.7*x(k-1)+1.1*x(k-2);}float s(int k){return !k?0:s(k-1)+x(k-1);}main(){printf("%f",s(12));getchar();} Тут функция x(k) рекурсивно вычисляет x с индексом k, а s(n) - рекурсивно вычисляет сумму n членов последовательности. С аргументом 12 будет вычислена сумма 12 членов (с 0-го по 11-й). Изменено 31 марта, 2009 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Ragnos Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 Народ помогите плиз, немогу прогу заставить работать uses crt; type letters=set of char; const o:letters=['ц','н','г','з','в','р','л','д','ж','ч','м','б']; qq:array [1..12] of char=('ц','н','г','з','в','р','л','д','ж','ч','м','б'); R:letters=[',','.',';','?','!']; {знаки препинания} var i,j,chet:byte; s, ss: string; o1,o2, temp: letters; m: char; begin clrscr chet:=1; i:=1; o1:=q; o2:=[]; writeln ('******nachalo*******'); writeln ('введите строку') ; readln(s); if s=''then S:=' морковка горох капуста мозамбези крыша звезда'; repeat while (s in R) and (i<length (S)) do begin ss: ss+s ; i:=i+1 end; writeln (chet,'',ss); temp:[]; for j:=1 to length (Ss) do temp:=temp+[s[j]]; for j:=1 to 8 do begin {первое условие} if (chet=1) and (NOT (qq[j] in temp) then exclude (01,qq[j]); {второе условие } if (chet=0) and (NOT (qq[j] in temp) then 02:= 02+[qq[j]]; end; cheat:=1-chet; end; until i>=length(s); write ('входят в каждое нечётное слово:'); for m:=''to#255 do if m in 01 then write (m); writeln; write ('не входят хотя бы одно чётное слово:'); for m:=''to#255 do if m in 02 then write (m); writeln; repeat until key pressed; end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 Не следует доверять писать программы FineReader'у :blush2: Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
leksev Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 leksev: Рекурсия - жутко неэкономичная штука. Но продемонстрировать ее применение несложно. #include<stdio.h>float x(int k){return k<=1?1:0.7*x(k-1)+1.1*x(k-2);}float s(int k){return !k?0:s(k-1)+x(k-1);}main(){printf("%f",s(12));getchar();} Тут функция x(k) рекурсивно вычисляет x с индексом k, а s(n) - рекурсивно вычисляет сумму n членов последовательности. С аргументом 12 будет вычислена сумма 12 членов (с 0-го по 11-й). А как ввод аргумента сделать произвольным.и что значит в функции s аргумент n,в програме вообще нет n. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 Students: Как я понял, любых сдвоенных символов? И, хм, а если символов три одинаковых подряд? Для простоты буду считать за пару символов каждое совпадение символа с предыдущим. #include<stdio.h>main(){char s[255];int i,n=0;gets(s);for(i=1;s[i];i++)n+=s[i]==s[i-1];printf("%d\n",n);getchar();} Не любых а указанных в здании. Именно "сс" "нн" "лл" Как такое сделать ? :) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Random Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 Привет всем!вобщем задание звучит так.. На Си. В заданном тексте перевернуть каждое слово. попробовал написать: #include "stdio.h"#include "conio.h"#include "string.h"#define M 100void PS(char str,int i,int k);main(){static char str[M];int i,k,N;puts("Введите предложение\n");gets(str);N=strlen(str);k=0; for(i=0;i<N;i++) {if(str[i]=='_') PS(*str,i,k);k=i+1; }PS(*str,i,k);puts(str);getch();return 0;}void PS(char str,int i,int k){int j,n,p,z;static char temp[M];n=i-k; for(j=1;j<=n;j++) { temp[1]=str[k]; for(z=1;z<n-j;z++){ str[k-1+z]=str[k+z]; str[i-j]=temp[1]; }return 0; }return 0;} неработает :) ошибок полно ( еще одно задание,тож на Си: Слить две упорядоченные последовательности чисел в одну(Рекурсии). Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 Тролль спасибо огромное! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 P.S. мал. ошибка :blush2: Procedure MinAge; var Age:integer; begin Reset(FS); Age:=100; while not EOF(FS) do begin Read(FS, W); if W.Age<Age then Age:=W.Age; end; Close(FS); Reset(FS); while not EOF(FS) do begin Read(FS, W); if W.Age=Age then begin Writeln('Numele: ',W.Nume); Writeln('Anul de Studiu: ',W.AnulS); Writeln('Grupa: ',W.Grupa); Writeln('Media: ',W.Media :5:2); WriteLn('Age: ',W.Age:3); Writeln; end; end; Close(FS); End; P.P.S. Еще просьба 1)написать процедуру или функцию позволяющую вывести на экран информацию о студентах имя которых начинается с буквы из указанного диапазона. 2)написать процедуру или функцию позволяющую удалить из списка данные человека имя которого вводится с клавиатуры. Program Lab19_pr16; Uses crt; Type Student=Record Nume:String; AnulS:integer; Grupa:string; Media:real; Age:integer; End; FisierStud=File of Student; Var FS:FisierStud; n:integer; W:student; s:string; Med:real; Key:1..4; Procedure Creare(m:integer; c:string); Var i:integer; Begin Assign(FS, c); Rewrite(FS); For i:=1 to m do Begin Writeln('Dati datele Studentul ',i); Writeln; Write('Numele si Prenumele: '); Readln(W.Nume); Write('Anul de studiu: '); Readln(W.AnulS); Write('Grupa: '); Readln(W.Grupa); Write('Media: '); Readln(W.Media); Write('Age: '); Readln(W.Age') Writeln; Write(FS, W); End; Close(FS); End; Procedure Afisare; Begin Reset(FS); While not EOF(FS) do Begin Read(FS, W); Writeln('Numele: ',W.Nume); Writeln('Anul de Studiu: ',W.AnulS); Writeln('Grupa: ',W.Grupa); Writeln('Media: ',W.Media :5:2); Writeln; End; Close(FS); End; Спасибо! P.S. Nume = имя Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 1 апреля, 2009 Жалоба Поделиться Опубликовано 1 апреля, 2009 leksev: А как ввод аргумента сделать произвольным.и что значит в функции s аргумент n,в програме вообще нет n.Должен же я был в описании для тебя, что делает функция, как-нибудь обозначить ее аргумент! У тебя в условии указано суммировать 12 членов ряда, вот там в программе и стоит вместо n число 12. Если ты хочешь суммировать другое количество членов ряда, замени 12 в тексте программы на другое число или вводи его с клавиатуры. При вводе количества суммируемых членов ряда с клавиатуры программа будет выглядеть так #include<stdio.h>float x(int k){return k<=1?1:0.7*x(k-1)+1.1*x(k-2);}float s(int k){return !k?0:s(k-1)+x(k-1);}main(){int n;printf("n ? ");scanf("%d",&n);printf("%f",s(n));getchar();getchar();} Students: Не любых а указанных в здании. Именно "сс" "нн" "лл"Как такое сделать ? Слегка изменить программу. Если речь идет об опреленных парах то, скорее всего, и сочетание, например, "сссс" надо считать за две пары? Если не половина, то четверть дела в написании программы - понять, чего от нее хотят. Вот измененный текст для счета именно пар этих символов. #include<stdio.h>main(){char s[255]; int i,n=0; gets(s);for(i=1;s[i]&s[i-1];i++)if(s[i]==s[i-1]&&(s[i]=='с'||s[i]=='н'||s[i]=='л')){n++;i++;}printf("%d\n",n);getchar();} Random: В заданном тексте перевернуть каждое слово.Честно говоря, разобраться с чужой программой в десять раз труднее, чем написать свою - чем обычно эта затея и заканчивается. Поэтому не буду ставить вопросы - а это для чего? а это почему? а просто напишу свой вариант #include<stdio.h>main(){char t[255];int j,i=0,k=0; printf("Enter the string: "); gets(t); do if(t[i]>='0')k++;else{if(k){for(j=i-1;j>=i-k;j--)putchar(t[j]);k=0;}putchar(t[i]);}while(t[i++]); getchar();} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 2 апреля, 2009 Жалоба Поделиться Опубликовано 2 апреля, 2009 Тролль: Please #861 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
leksev Опубликовано 2 апреля, 2009 Жалоба Поделиться Опубликовано 2 апреля, 2009 большое спасибо троль. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 2 апреля, 2009 Жалоба Поделиться Опубликовано 2 апреля, 2009 (изменено) Radu: Тролль: Please #861Ты уж извини, по ночам я обычно сплю. Ты почти в одиннадцать ночи написал условие задачи, а в седьмом часу утра напоминаешь, что за ночь еще ничего не сделано :blink:. Да и бывает, что и днем другие дела находятся... ;) Ну, вернемся к нашим баранам. Пишу только сами процедуры, как и раньше, не проверяя их в программе, так что полное отсутствие ошибок не гарантировано. Если что-то несущественное, надеюсь, сам справишься, нет - будем разбираться. По первой процедуре пояснять почти нечего: просматриваем файл, если в текущей записи первая буква имени студента в интервале между заданными при вводе, печатаем все поля записи. По второй процедуре: было два пути. Простейший - считывать все записи из файла и переписывать их в другой временный файл, за исключением той записи, которую надо удалить, а потом удалить исходный файл и временному файлу дать имя исходного. Более сложный, но красивее, который я и выбрал - работать непосредственно с исходным файлом. Читаем его и, найдя запись с нужным именем, если она последняя, просто сдвигаем указатель текущей позиции в файле на одну запись назад, а если нет, то начиная со следующей записи до конца файла танцуем так: читаем запись в переменную W, возвращаемся к шедшей до нее записи файла, записываем в нее значение W, переходим к записи, следующей после прочитанной, читаем ее в переменную W и далее сказка про белого бычка до конца файла (записи нумеруются с 0, поэтому последняя запись имеет номер на единицу меньше размера файла). Затем отрубаем хвост файла стандартной процедурой Trancate и закрываем файл. Procedure Select;var C1,C2:char;beginWrite('letter 1 (from)? '); ReadLn(C1);Write('letter 2 (to)? '); ReadLn(C2);Reset(FS);while not EOF(FS) do begin Read(FS,W); if (W.Nume[1]>=C1)and(W.Nume[1]<=C2) thenbeginWriteln('Numele: ',W.Nume); Writeln('Anul de Studiu: ',W.AnulS);Writeln('Grupa: ',W.Grupa); Writeln('Media: ',W.Media :5:2);WriteLn('Age: ',W.Age:3); Writeln;end end;Close(FS);end;Procedure Delete;var i:integer; Nume:string;beginWrite('Nume to delete the student? '); ReadLn(Nume);Reset(FS); W.Nume:='';while (W.Nume<>Nume)and not EOF(FS) do Read(FS,W);if Nume<>W.Nume then WriteLn('no such nume!')else begin if EOF(FS) then Seek(FS,FilePos(FS)-1) else for i:=FilePos(FS) to FileSize(FS)-1 do begin Seek(FS,i); Read(FS,W); Seek(FS,i-1); Write(FS,W) end; Truncate(FS); end;Close(FS);end; Подсказки в процедурах на английском, как это будет по-румынски, не знаю :g:. Изменено 2 апреля, 2009 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 Тролль: спасибо "Подсказки в процедурах на английском, как это будет по-румынски, не знаю" -да не вопрос , я исправлю . Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Random Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 большое спасибо Троль :) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 Тролль: все работает отлично P.S. Еще одна задачка С клавиатуры вводятся информация : имя человека( m человек), урок ( n уроков) и оценка на каждый урок.Написать програмку для Turbo Pascal которая считает сколько оценок 9 есть на несколко ( n уроков ) уроков у всех ( m человек ) . Можно в любом типе даных . Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 Radu: Глупое условие. var n:integer; s:string;beginwriteln('Вводите что хотите через Enter, закончив вводом пустой строки');n:=0; repeat readln(s); if s='9' then inc(n) until s=''; writeln('9 вводилось ',n,' раз'); readlnend. Каков вопрос - таков и ответ. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 Тролль: ине бы по сложнее если можно 1. Вводим количество человек и уроков 2. Вводим информацию про учеников имя, и оценки на каждый урок (нарпимер 1 человек,3 урока - вводим имя а потом урок1-оценка,урок2-оценка,урок3-оценка) 3.написать процедуру или функцию которая считает сколько оценок 9 есть. Я вот как-то так представляю себе эту програмку. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 (изменено) ине бы по сложнее если можноОригинально :D Вообще-то, делая глупости, ограничивайся минимумом необходимого :D. Почти вся вводимая информация не нужна для ответа. var a,b:array[1..50]of string[20]; c:array[1..50,1..50]of byte; i,j,m,n,s:integer;begin write('сколько учеников? '); readln(m); write('сколько уроков? '); readln(n); writeln('имена учеников? '); for i:=1 to m do readln(a[i]);writeln('названия уроков? '); for j:=1 to n do readln(b[j]);writeln('оценки? '); for i:=1 to m do for j:=1 to n do begin write(a[i],'':20-length(a[i]),b[j],'':20-length(b[j])); readln(c[i,j]) end;s:=0; for i:=1 to m do for j:=1 to n do if c[i,j]=9 then inc(s);writeln; writeln(s); readlnend. Задача типа: на первой остановке в трамвай вошло 4 человека, на следующей остановке вышло 2 человека, на следующей остановке вошло еще 5 человек, сколько остановок проехал трамвай? Изменено 3 апреля, 2009 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 3 апреля, 2009 Жалоба Поделиться Опубликовано 3 апреля, 2009 Тролль: все отлично работает,спасибо тебе огромное дружище :D Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Random Опубликовано 8 апреля, 2009 Жалоба Поделиться Опубликовано 8 апреля, 2009 Программа на Си. Слить две упорядоченные последовательности чисел в одну. (при помощи рекурсии). Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core_st Опубликовано 8 апреля, 2009 Жалоба Поделиться Опубликовано 8 апреля, 2009 фуф...вернулся со своим калькулятором. дописал функции обработки много разрядных чисел и теперь осталась самая малость. Вычесление. Как оказалось, имеющийся алгоритм также работает только с одноразрядными числами. Вот моя функция. В чем проблема? расчет с операциями '+' и '-' делает но непонятно каким образом. при сложении трех чисел с 3 разрядами - например 200+400+600 - результат - 1500. с 4 разрядами - вообще бред. С двумя все прекрасно. с * и / програма вообще выдает результаты совсем непонятного характера. Или еще примеры - записав строку вида "12-4" получаем результат -30. не пойму в чем проблема До начала работы функции у програмы уже есть строка в ОПН - "123 123 + 123 + =", записана в AnsiString AfterCon. Вот собственно и надо наладить работу функции void TStr2PPN::calculate (){/* оголошення необхідних змінних для функції обрахування */float stack[256];char * buf=AfterCon.c_str();char temp[10];int sp = 0,i=0,j=0,k=0;while(i<=AfterCon.Length()){ if (buf[i]>='0'&&buf[i]<='9') { while (buf[j]>='0'&&buf[j]<='9'){ temp[k]=*(buf+j); k++;j++; } *(stack+sp)=StrToFloat(temp); k=0;sp++;i++;} else{switch(*(buf+i)){ case '\0': break; case ' ': j++; break; case '=': Result=stack[--sp]; break; case '+': j++; stack[sp-2] = stack[sp-2] + stack[sp-1]; sp--; break; case '-': j++; stack[sp-2] = stack[sp-2] - stack[sp-1]; sp--; break; case '*': j++; stack[sp-2] = stack[sp-2] * stack[sp-1]; sp--; break; case '/': j++; stack[sp-2] = stack[sp-2] / stack[sp-1]; sp--; break; default: stack[sp++] = StrToFloat(buf);}} i++;}} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core_st Опубликовано 8 апреля, 2009 Жалоба Поделиться Опубликовано 8 апреля, 2009 С одноразрядными числами и операциями * и / решилось. просто дописал отдельній случай для одноразрядных чисел. И так - в диапазоне 0..99 - калькулятор работает прекрасно со всеми скобками и т д. - но вот дальше 99 - непонятные операции. Привожу дописаную функцию void TStr2PPN::calculate (){/* оголошення необхідних змінних для функції обрахування */float stack[256];char * buf=AfterCon.c_str();char temp[10];int sp = 0,i=0,j=0,k=0;while(i<=AfterCon.Length()){ if (buf[i]>='0'&&buf[i]<='9') { if (buf[i+1]==' '){ stack[sp++]=StrToFloat(buf[i]); } else{ { } while (buf[j]>='0'&&buf[j]<='9'){ temp[k]=*(buf+j); k++;j++; temp[k+1]='\0'; } *(stack+sp)=StrToFloat(temp); k=0; sp++;i++;}} else{switch(*(buf+i)){ case '\0': break; case ' ': j++; break; case '=': Result=stack[--sp]; break; case '+': j++; stack[sp-2] = stack[sp-2] + stack[sp-1]; sp--; break; case '-': j++; stack[sp-2] = stack[sp-2] - stack[sp-1]; sp--; break; case '*': j++; stack[sp-2] = stack[sp-2] * stack[sp-1]; sp--; break; case '/': j++; stack[sp-2] = stack[sp-2] / stack[sp-1]; sp--; break; default: stack[sp++] = StrToFloat(buf);}} i++;}} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.