Ответы: Задачи с экзамена
Описание
Характеристики ответов (шпаргалок)
Список файлов
- Задачи с экзамена
- PRAK_KOM.TXT 1,06 Kb
- prak_kom_solution.txt 7,12 Kb
- Прочти меня!!!.txt 136 b
От: --------
Кому: <kuvalda@aport.ru>
Тема: Может помогу кому.
Дата: 6 января 2001 г. 21:01
Привет. Побывав на двух комиссиях по праку (3 семестр) спешу помочь тем, кто может оказаться в такой же ситуации...Присылаю варианты комиссий, хотя они могут у тебя уже быть.
Ком.1
1) Написать на Си прогу, реализующую конвеер (Name1 | Name2). Вызов из ком-ной строки PROGRAM Name1 Name2. Предусмотреть обработку ошибок (отсутствие файлов, кол-во параметров) .
2)Написать на Си прогу, обрабатывающую каждое четное возникновение сигнала SIGTRAP форматированием двух сыновьих процессов, связанных каналом.
Ком.2
1) Дан текстовый файл с именем Name. Написать прогу, инвертирующую (запись наоборот) данный файл без использования доп. рабочих файлов..
2) Написать прогу, которая свяжет каналом процесс-внук с правнуком, при этом, процесс-внук имеет доступ к файлу Name2. Процесс внук должен передать через канал процессу правнуку содержание файла Name2. Правнук должен изменить (создать) файл Name3, чтобы тот содержал инвертированную копию Name2.
Рабочие файлы не использовать.
Типовые задачи прака (не с комиссии, но стоит уметь их решать)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
1 Написать программу tail , печатающую n последних строк файла. Число n и
Имя файла задается с помощью аргументов командной стоки. Обращение вида tail
n filename, печатает n последних строк файла с именем filename. Если строк
в файле меньше n, тогда печатаются все строки файла.
#include <stdio.h>
main(int argc, char **argv) {
int n=10;
int fd1;
char e;
FILE *f;
if( argc!=2 ) {
printf( "\n\nUsage: tail1 <filename>" );
return 1;
}
if( (fd1=open( argv[1], _F_READ ))==-1 ) {
printf( "Error opening '%s' for reading.\n", argv[1] );
return 2;
}
lseek( fd1, 0, SEEK_END );
while( n && lseek( fd1, 0, SEEK_CUR ) ) {
read(fd1, &e, 1 );
if( e=='\n' ) n--;
lseek( fd1, -2, SEEK_CUR );
}
if( e=='\n' ) lseek( fd1, +2, SEEK_CUR );
while( (read(fd1, &e, 1)==1 ) printf( "%c", e );
close( fd1 );
return 0;
}
2 Написать программу head, печатающую n первых строк файла. Число n и
имя файла задается с помощью аргументов командной стоки. Обращение вида head
n filename, печатает n первых строк файла с именем filename. Если строк в
файле меньше n, тогда печатаются все строки файла.
# include <stdio.h>
# include <fcntl.h>
char name[50];
char e;
main () {
sscanf( "%s", name );
f=open( name, O_RDONLY );
for( i=0; i<10; ) {
if( !read( f, &e, 1 ) ) break;
if( e=='\n' ) i++;
printf( "%c", e );
}
}
3 Написать программу, реализующую следующую схему: процесс 2 считывает строку
с
клавиатуры и посылает ее через канал процессу 4, который выводит строку на
экран.
//task with a sophisticated process hierarchy
#include <stdio.h>
#include <fcntl.h>
char s;
int fd[2];
main() {
pipe( fd );
if( !fork() ) while( (s=getchar())!='\n' ) write( fd[1], &s, 1 );
if( !fork() ) if( !fork() )
while( (read( fd[0], &s, 1 )==1 ) printf( "%c", s );
return 0;
}
4 Написать ф-ю strindex(s,t), кот. Выдает позицию самого правого вхождения t в
s или 1, если вхождение не обнаружено.
# include <stdio.h>
# include <string.h>
int strindex (char*s, char t) {
int i, len=-1;
for (i=1,i<strlen(s),i++) {
if (t==*(s+i)) len i;
}
if (len!=-1) return len;
else return 1;
}
5 В файле задана последовательность слов, разделенных запятой.
Написать программу, которая выводит на экран количество символов
в самом длинном из всех встречающихся в файле слове. Максимально
возможная длина слова в файле неограниченна.
#include <stdio.h>
#include <fcntl.h>
main() {
char mas[50],c;
int fd, sh=o,max=0;
scanf ("%s",mas);
fd=open(mas,O_RONLY);
while (read(fd,&c,1)!=0) {
if (c!=',') sh++;
else {
if (max<sh) max=sh;
sh=0;}
} printf ("%d", max);
}
6 Написать функцию strend(s, t), которая выдает 1, если строка t
является окончанием строки s, и 0 в противном случае.
# include <stdio.h>
# include <string.h>
int strend (char*s, char *t) {
int i;
char *d;
d=t+strlen(t);
s=s+strlen(s);
for (i=0, i<strlen(t) i++) {
if (*s=*d) return 0;
s--;
d--;
}
return 1;
}
7 Написать функцию replace(s1, s2), которая формирует строку s2
из строки s1, заменой всех подпоследовательностей "ab" на "cd".
# include <stdio.h>
# include <string.h>
void replace(char *s1,char *s2) {
int i, flag=0;
for (i=0,i<strlen(s1),i++){
switch (*(s1+i)) {
case 'a': if (flag==1) *s2++='a';
*s2++='a';
flag=1;
break;
case 'b': if (flag==1) *--s2='c';
*(++s2++)='d';}
else *s2++='b';
break;
default: flag=0, *s2++=(s1+i);
break;
}
}
return;
}
Задания комиссий по практикуму 2001/2002, зимняя сессия
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
1.1 Написать на Си прогу, реализующую конвеер (Name1 | Name2). Вызов из ком-
ной строки PROGRAM Name1 Name2. Предусмотреть обработку ошибок
(отсутствие файлов, кол-во параметров) .
#include <stdio.h>
main( int argc, int **argv ) {
int fd[2];
if( argc<3 ){ printf( "Go and learn C!! \n" ); return 1; }
pipe(fd);
if( !fork() ) {
dup2( fd[1], 1 );
execvp( argv[1], argv[1], 0 );
printf( "%s not found\n", argv[1] );
return 1;
}
if( !fork() ) {
dup2( fd[0], 0 );
execvp( argv[2], argv[2], 0 );
printf( "%s not found\n", argv[2]);
return 1;
}
return 0;
}
1.2 Написать на Си прогу, обрабатывающую каждое четное возникновение сигнала
SIGTRAP форматированием двух сыновьих процессов, связанных каналом.
/* Предполагается: в условии задачи имеется в виду,
что при каждом четном получении сигнала SIGTRAP
отец ФОРМИРУЕТ НОВУЮ пару сыновей,
связанных каналом. */
#include <stdio.h>
#include <signal.h>
int fd[2];
// флаг четности поступившего сигнала
int flg;
void hand( int sig ) {
// восстановим перехват сигнала
signal( SIGTRAP, hand );
if( flg ) {
pipe(fd);
flg=0;
if( !fork() ) {
.... // здесь работает первый сын
}
if( !fork() ) {
.... // здесь работает второй сын
}
}
else flg=1;
}
main() {
flg=1;
signal( SIGTRAP, hand );
while( 1 );
return 0;
}
2.1 Дан текстовый файл с именем Name. Написать прогу, инвертирующую (запись
наоборот) данный файл без использования доп. рабочих файлов..
#include <stdio.h>
#include <fcntl.h>
int fd1, fd2;
char a, b;
long int p1, p2;
char *Name;
main() {
.... // будем считать, что здесь Name некоторым образом задается
fd1=open( Name, O_RDWR );
p1=0;
fd2=open( Name, O_RDWR );
p2=lseek( fd2, 0, SEEK_END );
while( p2-p1>0 ) {
read( fd1, &a, 1 );
read( fd2, &b, 1 );
lseek( fd1, -1, SEEK_CUR );
lseek( fd2, -1, SEEK_CUR );
write( fd1, &b, 1 );
write( fd2, &a, 1 );
lseek( fd2, -2, SEEK_CUR );
}
close( f1 ); close( f2 );
}
2.2 Написать прогу, которая свяжет каналом процесс-внук с правнуком, при
этом, процесс-внук имеет доступ к файлу Name2. Процесс внук должен
передать через канал процессу правнуку содержание файла Name2. Правнук
должен изменить (создать) файл Name3, чтобы тот содержал инвертированную
копию Name2. Рабочие файлы не использовать.
#include <stdio.h>
#include <fcntl.h>
int pp[2];
int fd1, fd2;
Файл скачан с сайта StudIzba.com
При копировании или цитировании материалов на других сайтах обязательно используйте ссылку на источник
Начать зарабатывать