Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Pomogite!!!


Автор: mkuint 21.5.2005, 20:56
Ввести последовательность целых чисел. Найти в ней значение, которое ближе всего к среднему значению.



I eshe voprosik, nado napisat' fynkciu dlya perevorota stroki a potom vblzvat' ee v case, t.e. nazhimau '1' i mne perevora4ivaet stroky


Pomogite plz!!!!

Автор: NoeR 21.5.2005, 21:52
На Делфи пойдет? smile

Автор: chipset 21.5.2005, 22:12
М
 
1. Название темы должно отражать её суть.
2. Не должно быть более одного вопроса в одной теме.
3. Тема не соответствует разделу C++:Общие вопросы и перенесена поэтому отсюда

Автор: gepard 22.5.2005, 05:34
Цитата(mkuint @ 21.5.2005, 20:56)
вести последовательность целых чисел. Найти в ней значение, которое ближе всего к среднему значению.
Вот на Си:
Код

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

void main()
{
    int mass[10];
    double sred = 0;
    double nearest = 0;
    
    srand(time(0));
    for (int i = 0; i < 10; i++)
    {
        mass[i] = rand()%2500;
        sred += mass[i];
        printf("%d ", mass[i]);
    }
    printf("\n");
    sred /= 10;

    nearest = mass[0]    ;
    for (i = 0; i < 10; i++)
        if (fabs(sred - nearest) > fabs(sred - mass[i]))
            nearest = mass[i];
    
    printf("%f(%f)\n", sred, nearest);
}

Автор: Payne 22.5.2005, 11:18
Зря ты не написал, на каком языке тебе нужно все это реализовать. Ну ладно, вроде у тебя там в вопросе case проскочил, значит пишу на Delphi.

Цитата(mkuint @ 21.5.2005, 20:56)
I eshe voprosik, nado napisat' fynkciu dlya perevorota stroki a potom vblzvat' ee v case, t.e. nazhimau '1' i mne perevora4ivaet stroky

Надеюсь я правильно понял вопрос: если введена строка "Строка" то при перевороте должно получиться "акортС". Так? Значит, читай дальше.
Предлагаю такую функцию для переворота строки:

Код

function mirror (str: string): string;
var
  temp: string [1]; //эта переменная будет хранить один символ из строки
  i: integer; //счетчик цикла
begin
  for i := 1 to Length (str) do
  begin
    temp := copy (str, i+1, 1); //копируем символ с номером i+1 в temp
    delete (str, i+1, 1); //удаляем скопированный символ
    str := temp + str; //записываем скопированный символ в начало строки
  end;
  result := str;
end;

Теперь ты можешь юзать эту функцию где угодно, также и в case. Например, дана у тебя строковая переменная Text. Чтобы ее перевернуть, нужно написать mirror (Text).
Я в своей программе делал так:

Код

{обрабатываю нажатие клавиши на форме}
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case key of //если нажата клавиша...
    '1': begin //... "1", то вывести текст на канву...
           Text := mirror (Text);
           Form1.Canvas.TextOut(10, 150, Text);
         end;
  else //...иначе...
    begin //прибавить к переменной Text символ нажатой клавиши
      Text := Text + key;
      Form1.Canvas.TextOut(10,100,Text);
    end;
  end; //else
end;

Этот код был написан просто для проверки. На нем я просто проиллюстрировал, как ты можешь юзать функцию переворота строки.

Автор: Payne 22.5.2005, 17:41
Цитата(mkuint @ 21.5.2005, 20:56)
Ввести последовательность целых чисел. Найти в ней значение, которое ближе всего к среднему значению

Вот, написал небольшую прогу на Delphi, которая делает это:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit; //Сюда будем вводить числа
    Label1: TLabel; //Пояснение "Введите очередное число"
    Button1: TButton; //Кнопка "Добавить"
    Memo1: TMemo; //Список всех введенных чисел
    Button2: TButton; //Кнопка "Вычислить"
    Label2: TLabel; //Пояснение "Ближайшее к среднему значение"
    Edit2: TEdit; //Сюда выведем это значение
    Edit3: TEdit; //Здесь будет среднее значение. Т.к. я юзал тип Integer, то значение округляется
    Button3: TButton; //Кнопка "Очистить" - очищает все использованные переменные и поле Memo
    Label3: TLabel; //Пояснение "Среднее значение"
    procedure Button1Click(Sender: TObject); //С этим, думаю, все понятно...
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Val_Count: integer = 0; //количество введенных значений
  Middle_Val: integer = 0; //среднее значение
  Near_Val: integer; //ближайшее к среднему значение
  Values: array of integer; //динамический массив введенных значений

implementation

{$R *.dfm}

{добавление числа в Memo}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Inc (Val_Count); //увеличим счетчик введенных значений на единицу
  Memo1.Lines.Add (Edit1.Text);
  Edit1.Text := '0'; //для удобства очищаем поле Edit1...
  Edit1.SetFocus; //...и устанавливаем на него фокус ввода
end;

{рассчет}
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer; //счетчик циклов
begin
  SetLength (Values, Val_Count);
  for i := 0 to (Val_Count-1) do //в этом цикле мы заполним массив...
  begin
    Values[i] := StrToInt(Memo1.Lines[i]); //...для чего будем последовательно считывать строки в Memo
    Middle_Val := Middle_Val + Values[i]; //Заодно вычислять сумму элементов...
  end;
  Middle_Val := round (Middle_Val / Val_Count); //...а здесь вычислим среднее значение, поделив сумму на кол-во

  Edit3.Text := IntToStr(Middle_Val);
  Near_Val := Values[0]; //будем считать, что наиболее приближенное к среднему значение в массиве первое...

  for i := 0 to (Val_Count-1) do
  begin
    if abs (Middle_Val - Near_Val) >= abs (Values[i] - Middle_Val) then
      Near_Val := Values[i]; //...и будем сравнивать модули разностей... короче, думаю, можно разобраться :)
  end;
  Edit2.Text := IntToStr (Near_Val); //после всех вычислений выводим наиболее приближенное к ср. значение
end;

{очистка переменных и Memo}
procedure TForm1.Button3Click(Sender: TObject);
begin
  Middle_Val := 0;
  Val_Count := 0;
  Memo1.Clear;
  Edit1.Text := '0';
  Edit1.SetFocus;
  Edit2.Text := '0';
  Edit3.Text := '0';
end;
end.

Надеюсь, этот код тебе поможет smile .

Автор: mkuint 24.5.2005, 11:54
Если не сложно, можно написать на TurboC-ях!!!

Автор: gepard 24.5.2005, 14:39
Мой пример скомпиль в ТурбоСи. Должно прокатить.

Автор: mkuint 24.5.2005, 17:17
Цитата(gepard @ 24.5.2005, 14:39)
Мой пример скомпиль в ТурбоСи. Должно прокатить.

Твой то работает, но хотелось бы видеть, чтоб не рандомом выбирал числа, а чтоб вводились, я знаю что надо запихнуть ввод в цикл, запихиваю, но ннеправильно работает прога

Автор: gepard 25.5.2005, 04:27
Закежь, как запихиваешь...

Автор: mkuint 25.5.2005, 20:18
всё ок, спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)