Wypisanie parzystych liczb z podanego zakresu.

0

Witam! Czy ktoś mógłby wrzucić chociaż mniej więcej zarys takiego programiku?

Napisać program, który będzie wypisywał na ekranie tylko liczby parzyste bądź tylko liczby nieparzyste, z określonego przedziału liczbowego w zależności od argumentów podanych w wywołaniu funkcji.

Wszelkie sugestie mile widziane.

0

Pobierasz końce przedziału, robisz pętlę w której sprawdzasz czy liczba jest parzysta czy nieparzysta (http://www.math.edu.pl/parzystosc), no i wyświetlasz.

0

Ja bym to zrobił inaczej. Sprawdzasz czy początek przedziału to liczba parzysta - jeżeli nie to od początek+1 rozpoczynasz pętlę for inaczej startujesz od wartości początek. Pętle wykonujesz aż do końca zadanego przedziału zwiększając licznik zawsze o 2.

czyli np.

  int poczatek = 5, koniec= 100;
  if (poczatek % 2 != 0) poczatek++;
  for (int i = poczatek; i <= koniec; i = i+2) 
     // no i sobie wypisujesz
0

Dobra powiem szczerze jestem totalnym laikiem w programowaniu. chciałem ten problem rozwiązać 2gim podanym tu sposobem ale nie za bardzo potrafię sprawę doprowadzić do końca. Mam coś takiego i jest tu na pewno masa błędów.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Zadanie_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int czyParzysta(int poczatek = 5, koniec = 10;)
        {
            if (poczatek % 2 != 0) poczatek++;
            for (int i = poczatek; i <= koniec; i = i+2) 
            {
            
            }
            return i;
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Liczby parzyste: " + czyParzysta();
        }
    }
}
0

A jakie błędy wyrzuca Ci kompilator??

0

Error 1 Default parameter specifiers are not permitted
Error 2 Identifier expected

i podkreśla znaki równości w funkcji czyParzysta

0

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Zadanie_1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private int czyParzysta(int poczatek , int koniec)
    {
        if (poczatek % 2 != 0) poczatek++;
        for (int i = poczatek; i <= koniec; i = i+2) 
        {
         
        }
        return poczatek;
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Liczby parzyste: " + czyParzysta(5,10);
    }

    private void label1_Click(object sender, EventArgs e)
    {
    
    }
}

}

Dobra mam już coś takiego. Programik zwraca mi 6 Problem w tym jak zmusić go do tego żeby wyrzucał mi kilka cyfr parzystych?

wiem, że chodzi o te okolice:

if (poczatek % 2 != 0) poczatek++;
for (int i = poczatek; i <= koniec; i = i+2)
{

        }
        return poczatek;

bo w obecnej sytuacji zwraca liczbę poczatek, która wywołuje funkcję powiekszoną o 1. Jak go teraz zmusić, żeby wypisał kolejne cyfry do liczby "koniec" ?

0

@up
Już coraz lepiej ;]
Musisz gdzieś zapisać parzyste liczby z określonego przedziału, proponuję użyć typu tablicowego, czyli np int[];
Wiesz czym jest tablica??

0

Kwestię wypisania zostawiłem już Tobie - myślałem, że sobie z tym poradzisz... Wrzuć sobie np. listBox na formę i w ciele pętli daj sobie listBox1.Items.Add(i); (oczywiście listBox1 to przykładowa nazwa). Ogólnie tą funkcję bym przerobił na typu void, bo bezsensu jest zwracanie "początku".

0

dzięki
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Zadanie_1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private int czyParzysta(int poczatek , int koniec)
    {
        if (poczatek % 2 != 0) poczatek++;
        for (int i = poczatek; i <= koniec; i = i+2) 
        {
           listBox1.Items.Add(i);   
        }
        return poczatek;
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Liczby parzyste: " + czyParzysta(Convert.ToInt32(textBox1.Text),
        Convert.ToInt32(textBox2.Text));
    }

    private void label1_Click(object sender, EventArgs e)
    {
    
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }
}

}

Już działa :-)

0

lubimy optymalizację:

if ((poczatek & 0x1) == 0) { }

0
KrystianD napisał(a)

lubimy optymalizację:

if ((poczatek & 0x1) == 0) { }
Nie ma co zaprzątać sobie głowy takimi pierdołami, kompilator zrobi to za nas.

0

A cóżto za kompilator masz? mój nic sam nie zoptymalizował...

W tym wypadku, operacja bitowa jest prawie 4.5x szybsza niż dzielenie modulo. Przy pojedyńczych wywołaniach to tam nie ma znaczenia, ale jak zależy na wydajności to trzeba pamiętać, a jak wiadomo, dzielenie nie należy do najszybszych działań. Dlatego lepiej pisać tak zawsze, tym bardziej, że to nie boli :)

0

Pewnie ma taki jak wszyscy, z Microsoftu. I jestem w stanie sie zalozyc, ze tak wlasnie to zoptymalizowal :) Po czym wnosisz, ze jednak nie?

0

Po skompilowaniu odlookałem program Reflector'em, w którym było wiadć jak na dłoni, że '%' został :) i kod wykonywany z '%' był ok 4.5x wolniejszy od tego z '&'.

Oczywiście, sprawdzałem w trybie Release.

0

Ale to na poziomie najdalej IL, a nie wlasciwego kodu wynonywalnego...

0

Mówię, że wykonywanie kodu z dzieleniem modulo było 4.5x wolniejsze od operacji bitowych... a to już było na poziomie kodu wykonywalnego... Po prostu nie zoptymalizował i już.

1 użytkowników online, w tym zalogowanych: 0, gości: 1