Skip to content

Instantly share code, notes, and snippets.

@Levik
Created March 29, 2011 10:49
Show Gist options
  • Save Levik/892154 to your computer and use it in GitHub Desktop.
Save Levik/892154 to your computer and use it in GitHub Desktop.
lab4
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#define N 100
//удалить ненужные
using namespace std;
void main()
{
float a[N], m, raz, bliz;
int i, j, iraz, jraz;
srand(time(0));
for (i = 0; i < N; i++)
a[i] = rand()%9+rand()*3/10000; // вещественные (0, 10) ?
cout<<"Enter m: ";
cin>>m;
bliz = m;
for (i = 0; i < N; i++)
for (j = i++; j < N; j++)
{
if (fabs(a[i] - a[j] - m) < bliz)
{
raz = a[i] - a[j];
bliz = fabs(raz-m);
iraz=i;
jraz=j;
}
}
cout<<"blizhe vseh a[ "<<iraz<<" ] - a[ "<<jraz<<" ] = "<<raz;
getch();
}
@aXe1
Copy link

aXe1 commented Mar 31, 2011

  1. если камент на отдельной строке - то пиши его перед комментируемым кодом, если камент в той же строке - то в конце.
  2. не понятен алгоритм генерации рандомных чисел a[i] = rand()%9+rand()*3/10000;. но в нем точно есть одна ошибка - значение не приводится к типу float - изза этого получаются только целые числа.
  3. во втором цикле for (j = i++; j < N; j++) ты юзаешь инкеремент для инициализации. есть большая разница между записью i+1 и i++ - вторая запись эквивалентна i=i+1, т.е. ты лишний раз увеличиваешь i внутри цикла и проскакиваешь часть элементов.
  4. в задании есть странная строка определить 2 элемента, разница между которыми ближе всего к M. если понять влоб, то получится что есть разница в порядке сравнения элементов, например: a[0]=5 a[1]=-10 M=10, тогда fabs(a[0]-a[1]-M)=5, а fabs(a[1]-a[0]-M)=-25. мне кажется или ты не так задание написал, или препод слажал.. врядли от вас хотят концентрации на таких вещах, при том что вы только начали изучать язык. скорее имелось ввиду не разность, а расстояние между элементами, но может это и подстава спецом. в форке я исхожу из последнего.
  5. трабла с M<0 кроется в том, что ты инициализируешь bliz = m; так, а сравниваешь потом по модулю: if (fabs(a[i] - a[j] - m) < bliz). получается что при отрицательных числах эта строка никогда не срабатывает и iraz, jraz и raz остаются не инициализированными с мусорными значениями, которые ты потом и выводишь. учись пользоваться дебаггером - это очень важно.
  6. текст первого сообщения по-английски, а второго - транслитом :)
  7. лучше именовать переменные по-английски..
  8. ..и вообще всегда писть код так, как будто в нем будут разбираться и дописывать другие люди. к сожалению ни в С ни в С++ стандартом языка не закреплены правила оформления кода (code conventions), но есть несколько популярных. будет удобнее если ты сначала выберешь себе один из них и будешь привыкать. переучиваться - плохая тема. попсовые:
    • Google C++ Style Guide - гугл в представлении не нуждается) (в форке я старался придерживаться его)
    • Boost Library Requirements and Guidelines - одна из очень-очень распространенных библиотек
    • Geosoft C++ Programming Style Guidelines - чесно говоря незнаю почему, но их конвеншн тоже оч. популярен.
    • GNU GCC Coding Conventions - GNU законадатель моды в мире опен-сурс (полное название линукса - GNU/Linux).
    • Qt Coding Conventions - один из самых популярных C++ фреймворков - на нем построен абобовский софт, часть гугловского, куча опен-сурса, например среда рабочего стола KDE под пингвина. еще этот фреймворк портирован на кучу мобильных платформ.
  9. в задании не написано от 0 до 10 это включительно или где? в форке я подразумеваю, что [0;10). алгоритм выходит такой:
    1. берем остаток от деления рандома на 10 - получим рандомные целые числа [0;10)
    2. берем остаток от деления рандома на 10 в степени нужного кол-ва знаков после запятой - получим рандомные целые числа [0;колво_знаков_после_запятой)
    3. делим то что получилось в пред. пункте на 10 в степени кол-ва знаков полсе запятой - получим дробные числа [0;1)
    4. прибавляем к пункту 1 пункт 3
    5. a[i] = float(rand()%10) + float(rand()%100) / 100;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment