Задачи на СИ.


гильдия Бойцы (Новичок)[39] гильдия Собиратели (Адепт)[1289] MeloD Информация
Назад к темам раздела.
2011-03-07 14:04:41 гильдия Столичные Шахтеры (Гранд Элита)[424294] Рассвет Новой Эры (Герой Легенд) гильдия Королевские Лабоходы (Ученик)[278] Yakoot1 Информация
я мож тоже вечером гляну чонить)
 
2011-03-08 01:37:21 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Первая задача
#include <stdio.h>//библиотека ввода вывода
#include <math.h>//библиотека математических функций
#define MAXN 99

void main(void)
{
FILE *fpIn=NULL;//Указатель на файл с исходными данными
FILE *fpOut=NULL;//Указатель на файл результата
int N=0;//реальное количество чисел в входном файле
float Numb[MAXN];//массив действительных чисел максимального размера
short unsigned int i=0;//счетчик цикла
float Summ=0;//Счетчик суммы для среднего арифметического
float Pro=1;//Счетчик произведения для среднего геометрического
float SrArifm=0;//Для среднего арифметического
float SrGeom=0;//Для среднего геометрического
float Dispers=0;//Для дисперсии
//=========================================================================
for(i=0;i<MAXN;i++) Numb[i]=0.0;//обнуляем елементы массива
//=========================================================================
puts("====Opening files...");
fpIn=fopen("data.txt","r");//открываем для чтения исходный файл
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
fpOut=fopen("result.txt","w");//открываем для записи файл результата
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
//=========================================================================
puts("====Reading data from input file....");
fscanf(fpIn,"%d",&N);//считываем количество чисел
printf("Kol of Numbers N=%dn",N);//выводим его на экран
puts("Data:");
for (i=0;i<N;i++) //для всех чисел
{
fscanf(fpIn,"%f",&Numb[i]);//считываем очередное число из файла
printf("%6.1f",Numb[i]);//выводим его на экран
Summ+=Numb[i];//добавляем его к сумме
Pro*=Numb[i];//домножаем его на произведение
}
puts("");//просто перевод строки
printf("Summa of all numbers Summ=%.3fn",Summ);
printf("Proizvedenie of all numbers Pro=%.3fn",Pro);
//=========================================================================
puts("====Reading data from input file....");
SrArifm=Summ/N;//вычисляем среднее арифметическое
SrGeom=sqrt(Pro);//вычисляем среднее геометрическое
printf("Srednee ariphmetishekoe = %.3fn",SrArifm);
printf("Srednee geometricheskoe = %.3fn",SrGeom);
Summ=0;//используем ту же переменную суммы для нового счетчика
for (i=0;i<N;i++)
{
Summ+=(Numb[i]-SrArifm)*(Numb[i]-SrArifm);
}
Dispers=Summ/N;//вычисляем дисперсию (по формуле Е(Х—M)^2)
printf("Dispersiya = %.3fn",Dispers);
//=========================================================================
puts("====Writing data to the output file....");
fprintf(fpOut,"Srednee ariphmetishekoe = %.3fn",SrArifm);
fprintf(fpOut,"Srednee geometricheskoe = %.3fn",SrGeom);
fprintf(fpOut,"Dispersiya = %.3fn",Dispers);
fclose(fpIn);//закрываем файл исходных данных
fclose(fpOut);//закрываем файл результата
}
Как-то так. указаний на то, в каком виде выводится результат не нашел, оформил по своему усмотрению

тестировал на файле:
5
13 1.4 15 9.9 1.1
 
2011-03-08 14:54:05 гильдия Мудрецы (Мастер)[4964] гильдия Бойцы (Адепт)[2405] Only_True Информация
Ехх... Если б в паскале))
 
2011-03-08 18:23:12 гильдия Бойцы (Новичок)[39] гильдия Собиратели (Адепт)[1289] MeloD Информация
MrHide
Ууууууу!!! :о) спасибо
 
2011-03-08 18:42:15 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
MeloD
это одна пока... запустилась?
 
2011-03-08 18:56:17 гильдия Бойцы (Новичок)[39] гильдия Собиратели (Адепт)[1289] MeloD Информация
MrHide
 
2011-03-09 03:32:37 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Вторая задача

#include <stdio.h>//библиотека ввода вывода
#include <conio.h>
#include <math.h>//библиотека математических функций
#define MAXN 99

void main(void)
{
FILE *fpIn=NULL;//Указатель на файл с исходными данными
FILE *fpOut=NULL;//Указатель на файл результата
int N=0;//реальное количество чисел в входном файле
float Numb[MAXN];//массив действительных чисел максимального размера
float Tmp=0.0;//временная переменная для обмена значений
short unsigned int i=0,j=0;//счетчики цикла
char Choise='~';//для выбора сортировки
//=========================================================================
for(i=0;i<MAXN;i++) Numb[i]=0.0;//обнуляем элементы массива
//=========================================================================
puts("====Opening files...");
fpIn=fopen("data.txt","r");//открываем для чтения исходный файл
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
fpOut=fopen("result.txt","w");//открываем для записи файл результата
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
//=========================================================================
puts("====Reading data from input file....");
fscanf(fpIn,"%d",&N);//считываем количество чисел
printf("Kol of Numbers N=%dn",N);//выводим его на экран
puts("Data:");
for (i=0;i<N;i++) //для всех чисел
{
fscanf(fpIn,"%f",&Numb[i]);//считываем очередное число из файла
printf("%6.1f",Numb[i]);//выводим его на экран
}
puts("");//просто перевод строки
puts("Please press '1' if you want to sort up and '2' if you want to sort down...");
while (Choise!='1' && Choise!='2') Choise=getch();//считываем выбор направления сортировки

//=========================================================================
puts("====Start Of sorting....");
//Сортировка (методом пузырька)
for (j=0;j<(N-1);j++)
{
for (i=0;i<(N-1-j);i++)
{
if (Choise=='1')//если выбран вариант "1"
{//сортируем по возрастанию
if (Numb[i]>Numb[i+1])
{
Tmp=Numb[i];
Numb[i]=Numb[i+1];
Numb[i+1]=Tmp;
}
}
if (Choise=='2')//если выбран вариант "2"
{//сортируем по убыванию
if (Numb[i]<Numb[i+1])
{
Tmp=Numb[i];
Numb[i]=Numb[i+1];
Numb[i+1]=Tmp;
}
}
}
}
puts("Result:");
for (i=0;i<N;i++) //для всех чисел
{
printf("%6.1f",Numb[i]);//выводим его на экран
}
puts("");//просто перевод строки
//=========================================================================
puts("====Writing data to the output file....");
for (i=0;i<N;i++) //для всех чисел
{
fprintf(fpOut,"%.1f ",Numb[i]);//выводим его в файл
}
fclose(fpIn);//закрываем файл исходных данных
fclose(fpOut);//закрываем файл результата
}
 
2011-03-09 19:02:11 гильдия Бойцы (Новичок)[39] гильдия Собиратели (Адепт)[1289] MeloD Информация


MrHide урааа
 
2011-03-09 20:40:46 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
MeloD
Ну там общая часть (чтения данных) не меняется. Меняется только этап обработки. Ну и переменные некоторые добавляются...

Сейчас постараюсь третью посмотреть и, может быть, четвертую, Если напомните как вычислить значение производной будет проще...
 
2011-03-09 21:30:04 Информация
MrHide
не знаю суть задачи(файл удален уже, не скачать), но значение производной в точке - это тангенс угла наклона касательной к графику в этой точке
 
2011-03-09 21:46:02 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Degrot
угу, только боюсь не поможет, там многочлен заданный коэффициентами, его производная нужно
вот задача 4

MeloD писал(а):
https://i079.radikal.ru/1102/c3/f3eaa70cf9d2.jpg
https://s010.radikal.ru/i313/1102/ab/493fc2d37aa1x.jpg
https://s010.radikal.ru/i313/1102/ab/493fc2d37aa1.jpg


наверное придется все-таки вычислять производную каждого одночлена по формуле и подставлять туда аргумент
 
2011-03-09 21:59:11 Информация
MrHide
а, ну тут все более менее просто)
f(x)=a0+a1*x+a2*x^2...+an*x^n
тогда
f'(x)=a1+a2*2*x+a3*3*x^2...+an*n*x^(n-1)

как то так вроде
for (i=0;i<n;i++)
a[i] = a[i+1]*[i+1];
 
2011-03-09 22:39:05 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Degrot
ну да, примерно так
 
2011-03-09 22:44:50 Информация
MrHide
с нетерпением жду код)
 
2011-03-10 00:49:47 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Degrot
не так быстро ;)

Задача 3

#include <stdio.h>//библиотека ввода вывода
#include <conio.h>
#include <math.h>//библиотека математических функций
#include <string>
#include <stdlib.h>

using namespace std;
#define MAXN 99

void main(void)
{
FILE *fpIn=NULL;//Указатель на файл с исходными данными
FILE *fpOut=NULL;//Указатель на файл результата
int N=0;//реальное количество чисел в входном файле
float Numb[MAXN];//массив действительных чисел максимального размера
float fMax=0.0;//переменная для поиска максимума
float fMin=0.0;//переменная для поиска минимума
char strMax[300]="";//строка для хранения индексов максимальных элементов
char strMin[300]="";//строка для хранения индексов минимальных элементов
short unsigned int i=0,j=0;//счетчики цикла
//=========================================================================
for(i=0;i<MAXN;i++) Numb[i]=0.0;//обнуляем элементы массива
//=========================================================================
puts("====Opening files...");
fpIn=fopen("data.txt","r");//открываем для чтения исходный файл
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
fpOut=fopen("result.txt","w");//открываем для записи файл результата
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
//=========================================================================
puts("====Reading data from input file....");
fscanf(fpIn,"%d",&N);//считываем количество чисел
printf("Kol of Numbers N=%dn",N);//выводим его на экран
puts("Data:");
for (i=0;i<N;i++) //для всех чисел
{
fscanf(fpIn,"%f",&Numb[i]);//считываем очередное число из файла
printf("%6.1f",Numb[i]);//выводим его на экран
}
puts("");//просто перевод строки

//=========================================================================
puts("====Start Of find min and max....");
fMin=Numb[0];//изначально считаем минимумом первый элемент
fMax=Numb[0];//изначально считаем максимумом первый элемент
char TmpStr[10]="";//временная строка для преобразования индекса в текстовый вид
for (i=1; i<N; i++)
{
if(fMax<Numb[i])//если текущий элемент больше максимального
{
fMax=Numb[i];//делаем его максимальным
itoa(i+1,TmpStr,10);//преобразуем индекс в текст
strcpy(strMax,TmpStr);//сохраняем индекс нового максимума
}
else //иначе
{
if(fMax == Numb[i])//если текущий элемент совпадает с максимальным
{
itoa(i+1,TmpStr,10);//преобразуем его индекс в текст
strcat(strMax," ");//добавляем в строку индексов разделитель - пробел
strcat(strMax,TmpStr);//приписываем новый индекс к строке индексов максимальных элементов
}
}
if(fMin>Numb[i])//если текущий элемент меньше минимального
{
fMin=Numb[i];//делаем его минимальным
itoa(i+1,TmpStr,10);//преобразуем индекс в текст
strcpy(strMin,TmpStr);//сохраняем индекс нового минимума
}
else //иначе
{
if(fMin == Numb[i])//если текущий элемент совпадает с минимальным
{
itoa(i+1,TmpStr,10);//преобразуем его индекс в текст
strcat(strMin," ");//добавляем в строку индексов разделитель - пробел
strcat(strMin,TmpStr);//приписываем новый индекс к строке индексов минимальных элементов
}
}
}
puts("Result:");
printf("Maximalnue elementu: %s; ih znachenie:%6.2fn",strMax,fMax);
printf("Minimalnue elementu: %s; ih znachenie:%6.2fn",strMin,fMin);
//=========================================================================
puts("====Writing data to the output file....");
fprintf(fpOut,"Maximalnue elementu: %s; ih znachenie:%6.2fn",strMax,fMax);
fprintf(fpOut,"Minimalnue elementu: %s; ih znachenie:%6.2fn",strMin,fMin);
fclose(fpIn);//закрываем файл исходных данных
fclose(fpOut);//закрываем файл результата
}

тестировалась на файле:
7
13 1.4 1.1 15 9.9 15 1.1
 
2011-03-10 01:04:39 Информация
MrHide
зачем прибегать к строкам?
не проще ли будет найти max и min, а потом пройтись 2 раза по массиву и выписать все индексы чисел с соответствующими значениями?
 
2011-03-10 01:31:01 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
Degrot
на мой взгляд повторный проход - неэффективное решение.
при 100 числах разница в производительности будет ощутима

Задача 4

#include <stdio.h>//библиотека ввода вывода
#include <conio.h>
#include <math.h>//библиотека математических функций
#include <string>
#include <stdlib.h>
#include <time.h>
#include <complex>

using namespace std;
#define MAXN 99

void main(void)
{
FILE *fpIn=NULL;//Указатель на файл с исходными данными
FILE *fpOut=NULL;//Указатель на файл результата
int N=0;//реальное количество чисел в входном файле
float Numb[MAXN];//массив действительных чисел максимального размера
int X0=0;//переменная для случайного значения X0
float Y=0.0;//переменная для значения полинома в точке X0
float dY=0.0;//переменная для значения производной в точке X0
short unsigned int i=0,j=0;//счетчики цикла
srand( (unsigned)time( NULL ) );//инициализируем счетчик случайных чисел
//=========================================================================
for(i=0;i<MAXN;i++) Numb[i]=0.0;//обнуляем элементы массива
//=========================================================================
puts("====Opening files...");
fpIn=fopen("data.txt","r");//открываем для чтения исходный файл
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
fpOut=fopen("result.txt","w");//открываем для записи файл результата
if (fpIn==NULL)//проверяем что файл успешно открыт
{
puts("Error for opening file with starting data. Program will be close.");
return;//выходим в случае ошибки
}
else
{
puts("File with starting data was open sucsessfully.");
}
//=========================================================================
puts("====Reading data from input file....");
fscanf(fpIn,"%d",&N);//считываем количество чисел
printf("Kol of Numbers N=%dn",N);//выводим его на экран
puts("Data:");
for (i=0;i<N;i++) //для всех чисел
{
fscanf(fpIn,"%f",&Numb[i]);//считываем очередное число из файла
printf("%6.1f",Numb[i]);//выводим его на экран
}
puts("");//просто перевод строки

//=========================================================================
puts("====Start Of working....");
//выводим на экран исходный полином
puts("Polinom:");
for (i=0;i<N-1;i++) //для всех чисел
{
printf("%.1f*x^%d + ",Numb[i],i);//выводим одночлен на экран
}
printf("%.1f*x^%dn",Numb[N-1],N-1);//выводим последний одночлен на экран
//генерируем значение X0
int range_min=-10;//нижняя граница
int range_max=10;//верхняя граница
X0=(double)rand() / (RAND_MAX + 1) * (range_max - range_min)+ range_min;
//X0=1; //можно использовать для тестирования, просто подставляем нужное значение X0
//начинаем вычислять
puts("Proizvodnaia:");
for (i=1;i<N;i++) //первое слагаемое сознательно опускаем
{
Y+=Numb[i]*pow((float)X0,i);//прибавляем очередное слагаемое (одночлен) полинома
dY+=Numb[i]*i*pow((float)X0,i-1);//прибавляем очередное слагаемое (одночлен) производной
if(i!=N-1)printf("%.1f*x^%d + ",Numb[i]*i,i-1);//выводим одночлен производной на экран
}
printf("%.1f*x^%dn",Numb[N-1]*(N-1),N-2);//выводим последний одночлен производной на экран
Y+=Numb[0];//прибавляем в сумме обозначающей значение полинома в точке X0 первый одночлен, который мы пропустили ранее
puts("Result:");
printf("Znachenie polinoma v tochke X0=%d ravno:%6.2fn",X0,Y);
printf("Znachenie proizvodnoi v tochke X0=%d ravno:%6.2fn",X0,dY);
//=========================================================================
puts("====Writing data to the output file....");
fprintf(fpOut,"Znachenie polinoma v tochke X0=%d ravno:%6.2fn",X0,Y);
fprintf(fpOut,"Znachenie proizvodnoi v tochke X0=%d ravno:%6.2fn",X0,dY);
fclose(fpIn);//закрываем файл исходных данных
fclose(fpOut);//закрываем файл результата
}
 
2011-03-10 01:32:59 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
MeloD
остальные не сделаю т.к. начиная с 6й не помню мат аппарата да и времени нет...
 
2011-03-10 01:37:48 гильдия Столичные Шахтеры (Элита)[64262] yashchar Информация


MrHide
ыыыыыыыыыыыыы
 
2011-03-10 01:37:53 Информация
MeloD
зато я мат часть помню, но если пробую чтото сделать, то... MrHide уже догадывается, какой ужас получится
 
2011-03-14 22:53:11 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
MeloD
помогло?
 
2011-03-18 19:27:29 гильдия Бойцы (Новичок)[39] гильдия Собиратели (Адепт)[1289] MeloD Информация
MrHide
спасибо большое, я с этой учебой совсем на лигу забила.
Вы бесценны. Иду на почту писать секретик.
 
2011-03-18 19:30:33 гильдия Столичные Шахтеры (Элита)[131682] гильдия Алхимики (Элита)[194744] MrHide Информация
MeloD
иду =)
 
12