- •Int main (void) {
- •Int main(void) {
- •Void f102(file* filein, double* y) {
- •Int main(void){
- •Int main (void) {
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void) {
- •Int main(void){
- •Int main(void) {
- •Int main(void) {
- •Int main(void) {
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
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);