- •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, *out;
int* A; /* Описание имени массива A[] */
int q,N,i;
int lev,prav, chislo_dyr; /* для получения ответа из f209 */
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); /* все элементы массива А прочитаны успешно */
f209(A,N,&lev,&prav,&chislo_dyr);
if(chislo_dyr==0) fprintf(out,"%d %d",lev,prav);
if(chislo_dyr >0) fprintf(out,"%d ",-1);
fclose(in); fclose(out); free(A);
return 0;
}
< реализация функции void f209(...){...} >
< реализация функции void f205sort(...){...} >
/* конец файла 209.c */
/* Задача 210. Является ли массив «парным»: А[0]+A[2]+...=A[1]+A[3]+...? */
void f210(int A[], int N, int* y){
int i, s0=0,s1=0;
assert (N>1);
for (i=0; i+1<N; i=i+2) {s0=s0+A[i]; s1=s1+A[i+1];}
/* если индекс последнего элемента четен, то этот элемент не
учитывается в цикле и его нужно добавить к s0 вне цикла: */
if(N%2==1)s0=s0+A[N-1];
if(s0==s1)*y=1;
if(s0!=s1)*y=0;
return;
}
Задача 211. Является ли массив «счастливым», то есть существует ли его разбиение на две непустые части такие, что
A[0]+A[1]+...A[k-1]=A[k]+A[k+1]+...+A[N-1]?
Идея решения.Если массив "счастливый", то суммы в левой и правой частях равны, а значит удвоенная левая часть равна общей сумме.
/* Является ли массив «счастливым», то есть существует k такое, что
A[0]+A[1]+...A[k-1]=A[k]+A[k+1]+...+A[N-1]? */
void f211(int A[], int N, int* addr_k, int* addr_S){
int i,k,s,Slev;
assert (N>1);
for (i=0,s=0; i<N; i++) s=s+A[i];
Slev=A[0];
for(k=1; k<N; k++){
if(2*Slev==s){*addr_k=k; *addr_S=Slev; return;}
Slev=Slev+A[k];
}
*addr_k=-1;
return;
}
Задача 212. Сортировка массива вещественных чисел по неубыванию.
Функция f212 получается из функции 205sort заменой типов величин А и tmp с int на double в строках 1 и 3. Остальные строки не меняются.
/* Сортировка вещественного массива по неубыванию */
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void f212sort(double*, double);
void f212(double*, double, double*);
Int main(void){
FILE* in; FILE* out;
double* A; // Описание имени массива 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); assert(q==1&&N>0); /* N прочитано успешно */
A = (double*) malloc(N*sizeof(double));
for(i=0; i<N; i++) q=fscanf(in,"%lf ",&A[i]);
assert (q==1); /* все элементы массива А прочитаны успешно */
f212(A,N,&otvet);
fprintf(out,"%lf ",otvet);
fclose(in); fclose(out); free(A);
return 0;
}
/* Сортировка массива целых чисел на том же месте по неубыванию.
Массив А считается отсортированным по неубыванию, если для любой пары
x, y соседних элементов массива выполнено нестрогое неравенство x<=y.
*/
void f212sort(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 f212(double A[], int N){
#define Besporyadok(x,y) (x>y) // Порядок <==> НЕубывание
int i,j; double 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;
}
Функции f213, f214 и f215 отличаются от функции f212 только двумя первыми строками. В задаче 215 используется библиотечная функция double fabs( double x), вычисляющая модуль вещественного числа. Поэтому в начало файла с решением задачи 215 необходимо добавить строку #include <math.h>
Задача 213. Переставить элементы массива вещественных чисел таким образом, чтобы в начале массива оказались неотрицательные элементы, идущие по возрастанию, а в конце масси-
ва — отрицательные элементы, идущие по убыванию.
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void f213sort(double*, double);
void f213(double*, double, double*);