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++;}} Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти