Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zadachi_avtomatizirovannogo_zacheta.docx
Скачиваний:
1
Добавлен:
20.07.2019
Размер:
52.51 Кб
Скачать

Int main(void){

FILE* in;

FILE* out;

int ERROR;

double* A; int q,i; int N; double y;

out=fopen("output.txt","w"); if(out==NULL)return -1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return -1;}

q=fscanf(in, "%d", &N);

if (q!=1 || N<0) return -1;

A=(double*) malloc(N*sizeof(double)); assert(A!=NULL);

for(i=0; i<N; i++) q=fscanf(in, "%lf", &A[i]);

assert (q==1);

f201(A,N, &y, &ERROR);

if(ERROR==-1) return ERROR;

fprintf(out,"%lf ", y);

fclose(in); fclose(out); free(A);

return 0;

}

void f201(double A[], int N, double* y, int* err){

int i,n; double s;

assert(N>0);

for (i=0,n=0,s=0.0; i<N; i++)

if(A[i]>0.0) {n=n+1; s=s+A[i];}

if (n==0) *err=-1;else *err=0;

*y=(s+0.0)/n;

return;

}

/* file 202.c

202. Переставить элементы массива вещественных чисел в обратном порядке.

Ответ: последовательно записанные элементы преобразованного массива.

*/

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f202(double*, int);

Int main(void){

FILE* in;

FILE* out;

double* A; int q,i; int N;

out=fopen("output.txt","w"); if(out==NULL)return -1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return -1;}

q=fscanf(in, "%d", &N);

if (q!=1 || N<1) return -1;

A=(double*) malloc(N*sizeof(double));

for(i=0; i<N; i++) q=fscanf(in, "%lf", &A[i]);

assert (q==1);

f202(A,N);

for(i=0; i<N; i++) fprintf(out,"%lf ",A[i]);

fclose(in); fclose(out); free(A);

return 0;

}

void f202(double A[], int N){

double tmp;

int ind1=0, ind2=N-1;

assert(N>0);

while (ind1<ind2){

tmp=A[ind1]; A[ind1]=A[ind2]; A[ind2]=tmp;

ind1++; ind2--;

}

return;

}

Замечания. 1) При выводе чисел в файл out.txt они должны быть разделены пробелами, этот пробел предусмотрен в "%lf " . Если этот пробел будет опущен, то все числа сольются.

/* Задача 203. Суммирование: Anew[i]=A[0]+A[1]+...+A[i] */

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f203(double*, int);

Int main(void){

FILE* in;

FILE* out;

double* A; int q,i; int N;

out=fopen("output.txt","w"); if(out==NULL)return -1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return -1;}

q=fscanf(in, "%d", &N);

if (q!=1 || N<1) return -1;

A=(double*) malloc(N*sizeof(double));assert(A!=NULL);

for(i=0; i<N; i++) q=fscanf(in, "%lf", &A[i]);

assert (q==1);

f203(A,N);

for(i=0; i<N; i++) fprintf(out,"%lf ",A[i]);

fclose(in); fclose(out); free(A);

return 0;

}

void f203(double A[], int N){

int i;

assert (N>0);

for (i=1; i<N; i++) A[i]=A[i-1]+A[i];

return;

}

/* Задача 204. Циклический сдвиг вправо на 1: Anew[0]=A[N-1];Anew[i]=A[i-1] */

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f204(int*, int);

Int main(void){

FILE* in;

FILE* out;

int* A; int q,i; int N;

out=fopen("output.txt","w"); if(out==NULL)return -1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return -1;}

q=fscanf(in, "%d", &N);

if (q!=1 || N<1) return -1;

A=(int*) malloc(N*sizeof(int));

for(i=0; i<N; i++) q=fscanf(in, "%d", &A[i]);

assert (q==1);

f204(A,N);

for(i=0; i<N; i++) fprintf(out,"%d ",A[i]);

fclose(in); fclose(out); free(A);

return 0;

}

void f204(int A[], int N){

int i, tmp;

assert (N>0);

tmp=A[N-1];

for (i=N-1; i>0; i--) A[i]=A[i-1];

A[0]=tmp;

return;

}

Решение задачи 205 с подробными комментариями

При сдаче автоматизированного теста комментарии и часть assert’ов целесообразно опустить

Задача 205. Определить количество различных значений в массиве целых чисел. Ответ: одно число - искомое количество различных значений.

Для решения этой задачи, а также для решения задач 206 и 209 целесообразно предварительно упорядочить массив по неубыванию. Эту операцию будет выполнять функция f205sort. Тем самым в программе в одном файле 205.c будет три функции: main, f205, f205sort.

Сортирующая функция f205sort должна сделать массив неубывающим, то есть обеспечить, чтобы ни одна пара соседних элементов массива (x,y) не находилась в беспорядке:

void f205sort(int A[], int N){

#define Besporyadok(x,y) (x>y) /* Порядок <==> НЕубывание */

... ... ...

/* file 205.c */

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f205sort(int*, int);

void f205(int*, int, int*); int main(void){

FILE* in; FILE* out;

int* A;

int q, N, i;

int otvet;

out=fopen("output.txt","w"); if(out==NULL)return -1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return -1;}

q=fscanf(in, "%d", &N); if (q!=1 || N<1) return -1;

A = (int*) malloc(N*sizeof(int));

for(i=0; i<N; i++) q=fscanf(in,"%d",&A[i]);

assert (q==1);

f205(A,N,&otvet);

fprintf(out,"%d ",otvet);

fclose(in); fclose(out); free(A);

return 0;

}

void f205sort(int A[], int N){

#define Besporyadok(x,y) (x>y)

int i,j,tmp;

int ChisloBespor;

assert (N>0);

for (i=N-1; i>0; i=i-1) {

ChisloBespor=0;

for (j=0; j<i; j=j+1) {

if( Besporyadok(A[j],A[j+1]) ){

tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;

ChisloBespor++;

}

}

if(ChisloBespor==0) return;

}

return;

}

void f205 (int A[], int N, int* y){

int i, n, last;

assert(N>0);

f205sort(A,N);

last=A[0];

for(i=1,n=1;i<N;i++){

if( last<A[i] ) n++;

last=A[i];

}

*y=n;

return;

}

/* Задача 206. Какое значение встречается в массиве наибольшее число раз.

Oтсортируем массив по неубыванию с помощью функции f205sort и будем решать задачу для неубывающего массива, находя в нем постоянный участок максимальной длины за один проход от начала к концу. */

/* (*y,*ny)=(значение максимальной кратности, максимальная кратность) */

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f205sort(int*, int);

void f205(int*, int, int*); int main(void){

FILE* in; FILE* out;

int* A;

int q, N, i;

int otvet; /* переменная для получения ответа из функции f205 */

out=fopen("output.txt","w"); if(out==NULL)return 1;

in =fopen("input.txt" ,"r"); if(in==NULL){fclose(out);return 1;}

q=fscanf(in, "%d", &N); assert(q==1&&N>0); /* N прочитано успешно */

A = (int*) malloc(N*sizeof(int));/*выделение N*4 байт для массива А*/

for(i=0; i<N; i++) q=fscanf(in,"%d",&A[i]);

assert (q==1); /* все элементы массива А прочитаны успешно */

f205(A,N,&otvet);

fprintf(out,"%d ",otvet);

fclose(in); fclose(out); free(A);

return 0;

}

/* Сортировка массива целых чисел на том же месте по неубыванию.

Массив А считается отсортированным по неубыванию, если для любой пары

x, y соседних элементов массива выполнено нестрогое неравенство x<=y.

*/

void f205sort(int A[], int N){

#define Besporyadok(x,y) (x>y) /* Порядок <==> НЕубывание */

int i,j,tmp;

int ChisloBespor; /* Число беспорядков */

assert (N>0);

for (i=N-1; i>0; i=i-1) {

ChisloBespor=0;

for (j=0; j<i; j=j+1) {

if( Besporyadok(A[j],A[j+1]) ){

tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;

ChisloBespor++;

}

}

if(ChisloBespor==0) return;

}

return;

}

void f206(int A[], int N, int* y, int* ny){

int i, last, znach, dlina, maksdlina;

assert (N>0);

f205sort(A,N);

/* нахождение в неуб. массиве А[N] пост. участка макс. длины */

last=A[0]; znach=A[0]; dlina=1; maksdlina=1;

for (i=1; i<N; i++){

if (A[i]==last){

dlina++;

if(dlina>maksdlina){maksdlina=dlina;znach=A[i];}

}

else {znach=A[i]; dlina=1;}

last=A[i];

}

*y=znach; *ny=maksdlina;

return;

}

/* Задача 207. Удаление отрицательных элементов с уплотнением неотрицательных.

С помощью функции f207sort oтсортируем массив так, чтобы сначала шли неотрицательные элементы, затем – отрицательные.

Далее перебираем элементы от конца к началу и заменяем отрицательные элементы нулями; перебор прерывается, если обнаруживается неотрицательный элемент. */

/* Удаление отрицательных элементов с уплотнением неотрицательных.*/

#include <stdio.h>

#include <assert.h>

#include <stdlib.h>

void f207sort(int*, int);

void f207(int*, int);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]