Hirdetés

2024. április 25., csütörtök

Gyorskeresés

Hozzászólások

(#851) Gregorius válasza yash (#850) üzenetére


Gregorius
őstag

Felteszem a VS 2008 SP1-et már telepítetted. Ha nem, pótold.
Az alapok:
1. Végy egy projektet
2. Adj hozzá egy új elemet: LINQ to SQL Classes. (Az ADO.NET Entity Data Model is hasonló célú, de a LINQ to SQL könnyebb és gyorsabb egyszerű adatbáziskezelésre, bár van benne néhány kellemetlenség, amit egyre fárasztóbb körbelőni, ahogy bonyolódik az alkalmazásod.) Ne felejts el nevet adni a fájlnak, legyen mondjuk EShop.dbml.
3. Kapsz egy üres felületet. Tanács szerint nyisd meg a Server Explorert, ha itt nem látod az adatbázisod, akkor fent ott van a "Connect to Database" gombóc, azzal hozzá kell adni. Majd ugyanebben az ablakban maradva kiválogatod, hogy az adatbázisokból mivel akarsz foglalkozni és egyszerűen ráhúzod az üres felületre. Mentés, bezárás.

És ennyi, az infrastruktúra egyik fele készen van. A következő módon tudsz pl. egy tábla tartalmából listát csinálni:

List<Customers> customers;
using( var db = new EShopDataClasses() )
{
customers = db.Customers.ToList();
}

A WPF oldal egy kicsit gáz, ugyanis habár a WPF-nek ezerszer jobb (lesz) az adatkötése (mihelyst rendes designer támogatás is lesz hozzá), utolsó értesüléseim szerint a WPF még nem rendelkezik olyan szofisztikált griddel, mint a WinForms. (A CodePlexen már van valami előzetes változat, amibe csak beledobod az adatot és mindent elintéz, de még nem az igazi) Úgyhogy inkább dolgozzunk azzal, amink van és csináljunk egy egyszerű megjelenített listát, amiben még csak lépkedni sem lehet kurzorral.
Ha WPF appot hoztál létre, akkor elvileg már van egy Window1.xaml-ed, használjuk ezt. Fejléc is kell, úgyhogy egy StackPanelben egymás alá rakjuk a fejlécet és egy ItemsControlt, ami a lista elemeit jeleníti meg. (Haladóknak van HeaderedItemsControl, de ott stílusokkal is kell vacakolni.) Kissé fapados és kézihajtányos, de erre a célra most jó lesz.
Lévén szeretnénk ha a fejléc és a tartalom nem csúszna el egymástól, mindkét helyen egy gridet fogunk használni közös méretezéssel. Az egyszerűség kedvéért most csak két oszlopot csinálok meg. A fejléc grid így néz ki:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Customer ID" />
<TextBlock Grid.Column="1" Text="Company name" />
</Grid>

A tartalomsablon szinte azonos vele:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding CustomerID}" />
<TextBlock Grid.Column="1" Text="{Binding CompanyName}" />
</Grid>

Ahol a Binding mondja meg, hogy oda majd a CustomerID illetve a CompanyName mező kerül. A fix méretezés kicsit gáz, rá lehet venni a grideket, hogy együtt méreteződjenek, de az már a haladó kurzus része.
Az egész összeépítve:

<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Customer ID" />
<TextBlock Grid.Column="1" Text="Company name" />
</Grid>
<ItemsControl Name="DataList" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding CustomerID}" />
<TextBlock Grid.Column="1" Text="{Binding CompanyName}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>

Itt két dolog van, amit még nem érintettem: az ItemsControlon a Name teszi lehetővé, hogy kódból hivatkozzunk rá, továbbá még meg kell adni az ItemsControlnak, hogy az elemeit honnan vegye. Ez legyen egyszerűen {Binding}, akkor a saját DataContext-jéből veszi az elemeket, azt pedig kódból máris beállítjuk a főablak Loaded eseménykezelőjében, itt ér össze a WPF és a fentebb lekért adat:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
using( var db = new EShopDataContext() )
{
this.DataList.DataContext = db.Customers.Take(10).ToList();
}
}

És már készen is vagyunk, el lehet indítani, lehet csodálkozni vagy borzonkodni a gagyi adatlistánkon. Hogy ne hányja tele a képernyőt csak az első 10 rekordot kéri le a fenti kód. Ha az összes kell, egyszerűen töröld ki a Take(10)-et, viszont akkor úgy kell módosítani a layoutot is, hogy működjön a scrollozás.

Ha esetleg komolyabb adatkezelő projektbe fogsz, akkor a WPF-et a helyedben inkább hanyagolnám és maradnék WinForms alatt, ott használható az ArchElf által emlegetett DataGridView is, azt meg úgy szabhatod testre, ahogy tetszik.

(#852) babyanigirl válasza Gregorius (#849) üzenetére


babyanigirl
csendes tag

#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
FILE *fp=fopen("olvas.txt","r+" );
FILE *f=fopen("ir.txt", "w");
int szam;
char ch,kar;

printf("Az eredeti szoveg: ");

while (!feof(fp)){
ch=fgetc(fp);
printf("%c", ch);
}
printf("\nBetuszamolas vegrehajtasa: i=igen n=nem: ");
scanf("%c",&szam);

if (szam==105) {
fp=fopen("olvas.txt","r+" );

}
}

printf("\n") ;
system("pause");
fclose(fp);
fclose(f);
return 0;

sajnos csak eddig jutottam bekérem a szöveget kiíratom, de hogy utána az" if "után mit kéne írni azt nem tudom, mondjuk gondoltam vmi "sizeof" tömbös karakter számlálásra de vhogy az sem jött össze, mert nem tudtam tömbbe rakni. Látszik, sajnos nagyon amatőr vagyok benne.

(#853) Lortech válasza babyanigirl (#852) üzenetére


Lortech
addikt

Ez itt egy C kód, nem C#, tulajdonképpen miben is kéne írni?

Thank you to god for making me an atheist

(#854) yash válasza Lortech (#853) üzenetére


yash
senior tag

Nekem is pont ez jutott eszembe :)

(#855) ArchElf válasza Gregorius (#848) üzenetére


ArchElf
addikt

Asszem ideje feltolnom egy VS.NET 2008 Express-t... Úgy érzem nagyon lemaradtam.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#856) DelArco válasza ArchElf (#855) üzenetére


DelArco
aktív tag

remek program nem fogsz benne csalódni!
a gyengébb közepes gépeket úgy megeszi hogy öröm nézni :) az egyetemen kockázatos vállalkozás pl egy helpet lehívni mert könnyen vége szakadhat a fejlesztések :)
de azért karaj cucc.

Bár van másik topic is erre de azért megkérdem itt mert ide is tartozik félig:
Van egy vkinek ilyen MS-es MCP vizsgája?
70-536,70-526 vagy talán 70-505 érdekelne.

Youth hides the key to salvation

(#857) Lortech válasza DelArco (#856) üzenetére


Lortech
addikt

Vistán nálam gyengébb gépen is kapkodta a lábát, bizonyos esetekben még gyorsabbnak tűnt mint a 2005.
Nekem 536 és 529, miért?

Thank you to god for making me an atheist

(#858) DelArco válasza Lortech (#857) üzenetére


DelArco
aktív tag

én xp-n használom csak a 2008-at bár itthon elég jó is. mondjuk lehetne gyorsabb is de a célnak egyelőre megfelel.
meg most jobban viszagondolva a suliban még csak 2005 van sry :)

Csak azért kérdeztem a vizsgákat mert gonodlkozom valami ilyesmin azt mondják megéri tanluni rá mert elég sokat ér.
Aztán gondoltam megkérdek vki olyat akinek már van hogy neki mi a véleménye ezekről a vizsgákról. Inkább arra lennék kíváncsi ohgy munkakeresésnél menniyre jó pont az ilyen vizsga.
Azt vágom hogy nehéz megcsinálni őket azt már olvastam elég sok helyen viszont azt is hogy nincs sok ember akinek MCTS képesítéssel rendelkezik ami elég nagy előny lehet.

Youth hides the key to salvation

(#859) Lortech válasza DelArco (#858) üzenetére


Lortech
addikt

Előny minden papír pályakezdőknél, mert átlag végzett emberkék nem nagyon tudnak mit felmutatni a diplomájukon kívül, és ezzel esélyesebb megcsípni egy jobb helyet, előrébb kerülhetsz a sorban. Én java fejlesztőként dolgozom most, úgyhogy végül nem sok hasznát vettem magának a képesítésnek, de amíg felkészültem a vizsgára, sok újat tanultam, és jobban megmaradtak a dolgok.

Thank you to god for making me an atheist

(#860) DelArco válasza Lortech (#859) üzenetére


DelArco
aktív tag

Értem köszi a választ!
Még a felkészülésről kérdeznék kicsit ha szabad.
Magad tanultál vagy részt vettél valami iylen méregdrága Számalk vagy netakadémia tanfolyamon?
Ami beszámolókat olvastam neten az derült ki hogy simán fel lehet készülni ilyensmi kurzusok nélkül is.
Egyelőre megvan pdf-ben a könyv az 536-hoz azt nézegetem aztán ha lesz pénzem majd megveszem mindenképp mert úgy mégiscsak jobb meghát gondolom azért a hozzá járó CD se hátrány ha megvan.

Egyébéknt én is igy gondolkozom hogy megéri diploma mellé beszerezni valami iylesmi papírt mert ezzel nagyobb esélyed lehet. Van hogy még a diplománál is többet ér egy-egy ilyen.

Youth hides the key to salvation

(#861) Benmartin válasza babyanigirl (#852) üzenetére


Benmartin
senior tag

szerintem nem kellene minden topikban feltenned a kérdést, kezd egy kicsit erőszakosnak tűnni. ráadásul itt sokkal elnézőbbek újoncokkal, nem úgy mint a prog.hu-n (ahol látom el is utasítottak).

(#862) Lortech válasza DelArco (#860) üzenetére


Lortech
addikt

Kiemelten tanították a fősuli keretében a .NET-et, és rengeteget programoztam .NET-ben a kötelezők mellett is, de konlkrétan a vizsgára saját felkészülés volt kizárólag. Megfelelő .NET-es alapokkal fel lehet tisztességesen készülni magadtól is. Könyvek jók a vizsgára, CD melléklet annyira nem érdekes, emlékeim szerint azok a kérdések vannak rajta, amik a fejezetek végén már egyébként is ott vannak, meg ezek a kérdések egyébként is lényegesen könnyebbek, egyszerűbbek a vizsgakérdéseknél.

Thank you to god for making me an atheist

(#863) DelArco válasza Lortech (#862) üzenetére


DelArco
aktív tag

köszi a választ! :R
nekem még nagyon odébb van egy ilyen vizsga de mostmár legalább több infóm van róla.

Youth hides the key to salvation

(#864) yash válasza DelArco (#863) üzenetére


yash
senior tag

En junius vegen megyek majd vizsgazni ebbol: 70-528

(#865) Syncmaster


Syncmaster
csendes tag

sziasztok egy olyan kérdésem lenne, hogyan lehet megvalósitani azt.. hogy egy comboboxba megjelenítsem a meghajtokat?

Mint pl a totalcommanderbe:
[link]

[ Szerkesztve ]

(#866) Lortech válasza Syncmaster (#865) üzenetére


Lortech
addikt

System.IO.Directory.GetLogicalDrives(); metódussal megkapod a logikai meghajtók neveit, a kapott string tömböt végigiterálod és hozzáadod a comboboxhoz.

[ Szerkesztve ]

Thank you to god for making me an atheist

(#867) Syncmaster válasza Lortech (#866) üzenetére


Syncmaster
csendes tag

köszi szépen :) meghajtók neveit hogyan lehetne még odavarázsolni?, lényegében majd ugy akarom használni mint pl a totalcommanderbe is h kiválasztom és akkor szépen megjeleníti a mappákat stb..

[ Szerkesztve ]

(#868) Syncmaster


Syncmaster
csendes tag

hi.. egy olyan problémám lenne.. 2 monitorom van.. másodlagos monitorra kivetítettem egy formot.. a formon van egy webbrowser és azt szeretném megvalósítani hogy gombnyomásra ide akarom kivetiteni azt amit én a form1 webbrowserjébe látok.. mindent publickáltam mindent elérek probáltam elég sokmindent.. volt h kiirta kevés a memória.. de megjelnni sose jelent meg.. köszi a válaszotokat előre is..

(#869) yash válasza Syncmaster (#867) üzenetére


yash
senior tag

En magam csinaltam neked egy kis peldat... kis logikvala ra lehet jonni mindenre, amugy eletem elso meghajtokat kezelo programja, Help file nelkul rajottem siman, sajat logikaval, szoval ha hasznalod az agyad, azert annyira nem nehez am! (mod: az Osztaly neve utal ra, hogy eppen masnak akartam neki allni :) , eppen most tanulom a nyelvet csak :B )

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace AutomaticProperties
{
class Program
{
static void Entrance()
{

for (int i = 0; i < DriveInfo.GetDrives().Length; i++)
{
if (DriveInfo.GetDrives()[i].IsReady)
{
Console.WriteLine("Drive: {0} Volume label: {1}", DriveInfo.GetDrives()[i], DriveInfo.GetDrives()

[i].VolumeLabel);
}
else
{
Console.WriteLine("Drive {0} is not ready an can not be read!",DriveInfo.GetDrives()[i]);
}
}
Console.ReadLine();
}

static void Main(string[] args)
{
try
{
Entrance();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
}
}

[ Szerkesztve ]

(#870) yash


yash
senior tag

Miniprogramozo versenyt hirdetek (jatek)!

A fodij az, hogy mindenki megcsillogtathatja a kepessegeit, es megmutathatja nekunk, hogy o bizony a legjobb es tud valamit, amit mi nem :) Tehat gyakorlatilag semmi, a lenyeg, hogy agytreningezunk.

A feladat a kovetkezo: primszam kiszamitasa elore elkeszitett kodminta alapjan. A cel az, hogy a meglevo kodot ugy alakitsuk at ASM betetek nelkul es az eredeti szovegeket es funkcionalitast megtartva, hogy a kod a leheto leggyorsabban fusson le. Eredetileg egy szalra van tervezve, de profi programozok vihetnek bele tobbszalu programozast is (peldaul megfelezik a szamtartomanyt, es ket szalon megy a vizsgalat egyszerre). A programnak egyetlen fizikai gepen kell tudnia futni (halozatban szamitas most nem cel). Tovabba a minel kisebb .exe meret is cel, a gyorsasagon felul erre is lehet figyelni (de nem kotelezo). A hibakezelesen lehet modositani, de az eredeti formatum boven megteszi. Tehat a lenyeg a minel optimalizaltabb kod, az eredeti funkciok megtartasa mellett. A leggyorsabb kod a nyertes (azonos hardveren tesztelve), azonos sebessegek mellett a tomorebb kod nyer!

(A teszteles egy fizikailag ketmagu processzoron lesz tesztelve 2 GHz-en.)

Akkor lassuk hat vegre az eredeti forraskodot:

using System;

namespace TestCon
{
class Program
{
static void Main(string[] args)
{
try
{
startApp();
}
catch (FormatException e)
{
Console.WriteLine("\n\nPozitiv egesz szamokat lehet csak megadni.");
endApp();
}
catch (Exception e)
{
Console.WriteLine("\n\nHiba tortent.");
endApp();
}
}

private static void endApp()
{
Console.WriteLine("\n\nA kilepeshez nyomjon le egy billentyut!");
Console.ReadKey();
}

private static void startApp()
{
Int64 szam;
Console.Write("Primszamvizsgalat. Kerem a vizsgalando szamot: ");
szam = Int64.Parse(Console.ReadLine());
if (szam > 1)
{
Console.WriteLine("\nPrimszamitas folyamatban...\n");
if (isPrimeWithCount(szam))
Console.WriteLine("Primszam.");
else
Console.WriteLine("Nem primszam.");
}
else
{
Console.WriteLine("\n\nA vizsgalatot csak egynel nagyobb pozitiv egesz szamokra lehet elvegezni!");
}
endApp();
}

private static bool isPrimeWithCount(Int64 szam)
{
bool val = true;
int counter = 0;
Console.Write("\nOsztoi: ");
for (Int64 i = 2; i < szam; i++)
{
if (szam % i == 0)
{
val = false;
counter++;
Console.Write("{0} ", i);
}
}
if (counter == 0)
Console.Write("nincs\n\n");
else
Console.Write("\n\n{0} osztoja van. ", counter);
return val;
}
}
}

[ Szerkesztve ]

(#871) Jester01 válasza yash (#870) üzenetére


Jester01
veterán

1) akkor az osztók számát is ki kell írni?
2) max mekkora szám lehet a bemenet? (az int64 elég rémísztő ott)
3) mennyi memória van?
4) akarunk-e több számot is ellenőrizni?

Jester

(#872) yash válasza Jester01 (#871) üzenetére


yash
senior tag

1) igen ki kell (kulonben nagyon egyszeru lenne olyan kodot irni, ami az elso osztonal kilep egy break-kel a for-bol pl
2) az Int64 remiszto, de pont emiatt lehet vele jatszani, ha valaki gyorsabb algoritmust tud ket reszre bontott Int32-vel, ugy is neki lehet allni, tehat jo otlet
3) 2GB RAM all rendelkezesre, szukseg eseten virtualis memoria szinten ennyi es fix.
4) eleg egy szamot ellenorizni

hajra! ;)

[ Szerkesztve ]

(#873) ArchElf válasza yash (#872) üzenetére


ArchElf
addikt

Osztók helyett gyöktényezők száma is ér? :)

AE

:mod: hülyeség törölve

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#874) ArchElf válasza ArchElf (#873) üzenetére


ArchElf
addikt

Amúgy a leggyorsabb egy előre leszámolt int 32 prím-sorral lenne (de mondjuk még egy int16 prímsor is tudna gyorsítani a dolgon).
Computed values rulz :)

AE

:mod: marhára unatkozhatsz :)

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#875) yash válasza ArchElf (#874) üzenetére


yash
senior tag

megcsinalhatod ugy is :) nekem mindegy, de akkor a merete kicsit nagy lesz, es elverezhetsz a meret kriteriumon

(#876) ArchElf válasza yash (#875) üzenetére


ArchElf
addikt

A teljes Int32 prím-tábla belefér 512MB memóriába (sallangok nélkül persze)...
Már számolja is a gép, bár nem tudom mikorra leszek kész vele...

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#877) yash válasza ArchElf (#876) üzenetére


yash
senior tag

Int64-en is varjuk a megoldasod :)

(#878) lewisfm válasza ArchElf (#846) üzenetére


lewisfm
aktív tag

WPF-ben a ListView tud úgy működni, mint egy teljes értékű DataGrid, fejlécestől, rekordostól, rendezési lehetőséggel. Net 3.5 SP1-től pedig az alternate style lehetősége is adott.

(#879) ArchElf válasza yash (#877) üzenetére


ArchElf
addikt

Amennyiben egy Int64-nek nincs Int32-es gyöke, úgy prímszám... :)
Ez a megoldás az Int64-es kérdésre :D
Kicsit részletesebben: a gyökkeresést elég elkezdeni a szám négyzetgyökétől lefelé, mivel bár lehetnek afeletti gyökei is, de ahhoz tartoznak négyzetgyök alattiak. Amennyiben azok megvannak, úgy megkapjuk a négyzetgyök felettieket is. Amennyiben nincs négyzetgyök alatti gyöke, biztos nincs afeletti sem.
Az Int64 pedig ugyebár Int32*Int32... :)

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#880) yash válasza ArchElf (#879) üzenetére


yash
senior tag

es hova mented? txt fajlba? :) vegzett mar a keresessel? :)

csupan 4294967296 szamra kell primkeresest vegezned :) el fog tartani egy darabig. nekem 9 szamjegyet sem volt erom vagig varni :)

[ Szerkesztve ]

(#881) ArchElf válasza yash (#880) üzenetére


ArchElf
addikt

Most végzek a 11-el :)
Az első sor (7) kb 1.3 óráig tartott, a következő már csak 47 percig :D

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#882) yash válasza ArchElf (#881) üzenetére


yash
senior tag

Leallitottad a hatterben futo Media Playert? :D

(#883) ArchElf válasza yash (#882) üzenetére


ArchElf
addikt

Amikor debug módban futtattam az első prímszámítás (7-es sor) 23 órát akart futni. :(
De release módban végigszámolja az összes 7-el osztható számot az int32 tartományon. Látom ám már hogy egy idő után az IO nagyobb korlát lesz, mint a számolás.
Ehh, memory steram-en, kellene számoltatni...

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#884) ArchElf válasza ArchElf (#883) üzenetére


ArchElf
addikt

Wow MemoryStream 2 p :D
Éreztem én azt az IO korlátot...

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#885) ArchElf válasza ArchElf (#884) üzenetére


ArchElf
addikt

Pff, baromi sok prímszám van (nem is gondoltam, hogy ennyi lesz)...

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#886) ArchElf válasza ArchElf (#885) üzenetére


ArchElf
addikt

Szupergyors lett... Egészben becsatolni sajna nem tudom (képfájlként esélyem sincs).
Ha érdekel átküldöm este :)

AE

:mod: túl nagy lett, egy postba nem fér el

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#887) ArchElf


ArchElf
addikt

using System;
using System.Collections.Generic;
using System.IO;

namespace TestCon
{
class Program
{
static string PBIN = "prime.bin";
static long PLEN = 1024 * 1024 * 512;
static MemoryStream MPSTREAM;
static FileStream PSTREAM;
static byte[] B235DATA = new byte[] {
0x82, 0x28, 0x8a, 0xa0, 0x20,
0x8a, 0x22, 0x28, 0x88, 0xa2,
0x08, 0x0a, 0xa2, 0x28, 0x82 };
static string PBMD5 = "75b7c17fa77f8d12017cf69fca36c626";
static int B235LENGTH = 15;

static void Main(string[] args)
{
try
{
PSTREAM = File.Open(PBIN, FileMode.OpenOrCreate, FileAccess.ReadWrite);
if (!checkmd5())
{
build();
loadbase();
build2();
}
else
loadbase();
PSTREAM.Close();
startApp();
}
catch (FormatException)
{
Console.WriteLine("\n\nPozitiv egesz szamokat lehet csak megadni.");
endApp();
}
catch (Exception)
{
Console.WriteLine("\n\nHiba tortent.");
endApp();
}
}

private static bool checkmd5()
{
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
md5.Initialize();
PSTREAM.Position = 0;
byte[] bmd5 = md5.ComputeHash(PSTREAM);
PSTREAM.Position = 0;
string st = "";
foreach (byte b in bmd5)
st += b.ToString("x2");
return (st == PBMD5);
}

private static void build()
{
long flength = PLEN / B235LENGTH;
for (long ix = 0; ix < flength; ix++)
PSTREAM.Write(B235DATA, 0, B235LENGTH);
PSTREAM.Write(B235DATA, 0, ((int)PLEN % B235LENGTH));
}

private static void loadbase()
{
MPSTREAM = new MemoryStream();
MPSTREAM.Capacity = 512 * 1024 * 1024;
byte[] bl = new byte[1024];
PSTREAM.Position = 0;
MPSTREAM.Position = 0;
for (int ix = 0; ix < 512 * 1024; ix++)
{
PSTREAM.Read(bl, 0, 1024);
MPSTREAM.Write(bl, 0, 1024);
}
MPSTREAM.Position = 0;
}

private static void build2()
{
// first byte mark
// 10101100 : 0xac
MPSTREAM.Seek(0, SeekOrigin.Begin);
MPSTREAM.WriteByte((byte)0xac);
int pbx, pby;
for (int ix = 7; ix < UInt16.MaxValue; ix++)
{
if ((pbx = GetPBit(ix)) == 1)
{
for (long iy = ix; iy < UInt32.MaxValue; iy++)
{
if ((pby=GetPBit(iy))==1)
{
long ip = (((long)ix) * iy);
if (ip <= ((long)UInt32.MaxValue))
ClearPBit(ip);
else
break;
}
else if (pby == -1)
iy = (((iy >> 3) + 1) << 3) - 1;
}
}
else if (pbx == -1)
ix = (((ix >> 1) + 1) << 1) - 1;

}
PSTREAM.Position = 0;
MPSTREAM.WriteTo(PSTREAM);
}

private static int GetPBit(long ix)
{
if (ix > UInt32.MaxValue) return -2;
int px = (int)(ix >> 3);
int pp = (int)(ix & 0x07);
MPSTREAM.Seek(px, SeekOrigin.Begin);
byte pb = (byte)MPSTREAM.ReadByte();
MPSTREAM.Seek(-1, SeekOrigin.Current);
if (pb == 0) return -1;
return ((pb >> pp) & 0x01);
}

private static void ClearPBit(long ix)
{
int px = (int)(ix >> 3);
int pp = (int)(ix & 0x07);
MPSTREAM.Seek(px, SeekOrigin.Begin);
byte pb = (byte)MPSTREAM.ReadByte();
MPSTREAM.Seek(-1, SeekOrigin.Current);
byte pm = (byte)((0x01 << pp) ^ 0xff);
pb = (byte)(pb & pm);
MPSTREAM.WriteByte(pb);
}

private static void endApp()
{
Console.WriteLine("\n\nA kilepeshez nyomjon le egy billentyut!");
Console.ReadKey();
}

private static void startApp()
{
Int64 szam;
Console.Write("Primszamvizsgalat. Kerem a vizsgalando szamot: ");
szam = Int64.Parse(Console.ReadLine());
if (szam > 1)
{
Console.WriteLine("\nPrimszamitas (új) folyamatban...\n");
if (isPrimeWithCountNew(szam))
Console.WriteLine("Primszam.");
else
Console.WriteLine("Nem primszam.");
}
else
{
Console.WriteLine("\n\nA vizsgalatot csak egynel nagyobb pozitiv egesz szamokra lehet elvegezni!");
}
endApp();
}

private static bool isPrimeWithCountNew(Int64 szam)
{
Console.WriteLine("Osztoi:");
List<long> osztok = new List<long>();
int result_x;
if ((result_x=GetPBit(szam)) != 1)
{
long bc = szam;
Int64 ix = 2;
while (true)
{
if (GetPBit(bc) == 1)
{
osztok.Add(bc);
break;
}
long sq = (long)Math.Floor(Math.Sqrt(bc));
if ((sq * sq == bc) && (GetPBit(sq) == 1))
{
osztok.Add(sq);
osztok.Add(sq);
break;
}
bool mul = false;
while (ix <= sq)
{
int result;
if ((result = GetPBit(ix)) == 1)
{
if (bc % ix == 0)
{
bc /= ix;
mul = true;
osztok.Add(ix);
break;
}
}
if (result == -1)
ix = (((ix >> 3) + 1) << 3);
else
ix++;
}
if (!mul)
{
if (bc != szam)
osztok.Add(bc);
break;
}
}
}
if (osztok.Count == 0)
{
Console.WriteLine("nincsenek");
return true;
}
else
{
Console.WriteLine("{0} prímtényezőre osztható, melyek a következők:", osztok.Count);
foreach (long l in osztok)
Console.Write("{0} ", l);
Console.WriteLine();
return false;
}
}
}
}

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#888) ArchElf válasza ArchElf (#887) üzenetére


ArchElf
addikt

Kicsit karcsúsítottam, így belefért egy hozzászólásba. Sajnos így kimaradt egy csomó státusz jelentés - Console.WriteLine("Éppen ezt, vagy csinálom"); - a legenerálás alatt, így csak az üres képernyőt látja az ember egy jó ideig.
Az első futásnál legenerálja az 512MB-os fájlt - ez kb 10 perc egy 2GHz-es gépen -, utána már gyorsan - kb 8-10 mp alatt - indul.
Kicsit dagályos néhol még a kód, nem nagyon törődtem a rövidséggel.

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#889) ArchElf válasza ArchElf (#888) üzenetére


ArchElf
addikt

Na jó, benéztem azt a 8-10 mp-et. Kb. 1 perc alatt indul.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#890) yash válasza ArchElf (#888) üzenetére


yash
senior tag

Koszonjuk szepen a megfejtest, eddig te vagy az elso :) Igazabol, egy kommentekkel mespekelt verzionak is tudnank orulni, ha van szabadidod! Ha van vmi publikus ftp szervered vagy http, ahonnan le tudnank tolteni a magyarazatokkal ellatott forraskodot, annak nagyon tudnek orulni! Eleg nehez megerteni ezt a hash logikas kodot. Esetleg a felhasznalt forrastanulmanyokat is csatolhatnad!

:R

mod: az 1 perc az lehet kicsit lassu lesz statisztikai alapon. Egy 9 szamjegyu szamrol az en verziom ha jol emlekszem 5-6 masodperc alatt mondja meg, hogy prim-e. INT64_MAX-szal meg nem probaltam, lehet mindjart adok neki egy kort...

mod2: most keszul a prime.bin-em :) nemsokara meglatom mit tud a te verziod. azert az a 530 MB RAM megeves nem semmi forditaskor :) Ebbol is latszik, milyen piti feladahtoz milyen sok otlet lehetseges, es korantsem biztos, hogy meg van hozza minden gepen a szukseges eroforras!

[ Szerkesztve ]

(#891) ArchElf válasza yash (#890) üzenetére


ArchElf
addikt

Az 1 p az nem a számítás, hanem a program indítása.
Mindenesetre ez most sem mérvadó, mert most látom, hogy 11 óra óta fut a mailbox-jaim és a home folderem indexelése, és az elég sok IO-t eszik. Szóval lehet hogy emiatt indul lassan a program. A prímtényezőkre bontást megcsinálja már 2-3mp alatt. Ha nem csak egyszer kellene számolni, akkor szupergyorsnak lehetne minősíteni.
Amúgy szóban itt is tudom kommentelni.
build() + build2()
A PBIN fájl feladata: Minden BIT egy egy számot jelent a számsorban az 0-UInt32 tartományban. A fájl generálásnál az alapötlet az volt, hogy végig feltöltöm 0xff értékkel és aztán 2-től az összes prímszámra az összes szorzóra kinullázom a biteket. A prímszám úgy jön ki, hogy ha kinullázom az 2 összes szorzatát (kivéve saját magát), akkor a sorban következő szám a 3 lesz. Kinullázom az összes 3-ast (kivéve a 3-at), így a 4 már ki lesz nullázva, a következő szám az 5. Az 5-ösöket is kinullázom, a 6 már nulla, jön a 7, utána a 8-9-10 már kész, jön a 11... és így tovább. Másrészt a szorzókat is úgy választom meg, hogy csak az eddig ki nem nullázott számokkal szorzok. Pl 11 nál az első szorzó a 11 lesz (hiszen ezalatt már mindent leszoroztunk), 12-vel nem kell szorozni (hiszen az 2*2*3), a következő a 13 lesz... így elég "gyorsan" legenerálja az UInt32-es sort. Náhány perc alatt.
Mivel azonban gyorsítani szeretném a számolást tudom hogy a 2-3-5 szorzatai (bájtokban) egy 15 bájtból álló sorozatot alkotnak, elég ha ezzel inicialzálom az 512MB-os tömböt és a számolást a 7-esnél kezdem (a 2-3-5-7 kezdősorozat már 105 bájt hosszú, és nem volt kedvem ezt mind bepötyögni és leellenőrizni).
A hash függvény arra kellett, hogy a jól (!) legenerált PBIN fájlt leellenőrizzem, hiszen ez tartalmazza az összes prímet 2-UInt32 -ig.
folyt...

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#892) yash válasza ArchElf (#891) üzenetére


yash
senior tag

RAR 30%-osra becsli (most alltam csak neki) a bin fajl tomoriteset. Nem tudom, lehet jol jarnal egy tomoritesi algoritmus beiktatasaval, akkor az 512 MB-s fajjlt gyorsabban huzza be a lemezrol, es ha on-the-fly elegy gyorsan ki lehet bontani, hamarabb indulhatna talan a program. Persze ez reszletkerdes, csak erdekessegkeppen megemlitem! Neha ez is tud gyorsitani jelentosen a dolgokon! (PDA szinkronizacional teszteltem egyszer, hogy egy 100 megas compact SQL adatbazis 12 oras rekordonkenti attoltese helyett a teljes adatbazis egy fajlkent valo, tomoritett atvitele 5 perc :) szoval azert van kulonbseg sok esetben! van egy ingyenes nagyon egyszeru kis (home hasznalatra ingyenes) ZIP framework, purely written in C#: ComponentAce ZipForge.NET. Par sor az extra kod, esetleg probald felhasznalni!

(#893) yash


yash
senior tag

147,4 MB compressed (RAR). ZIP-pel sem lehet sokkal rosszabb. 10MB/s IO sebessegnel szeritnem lehet ertelme a dolognak.

(#894) ArchElf válasza yash (#893) üzenetére


ArchElf
addikt

folyt.
A program működése közben az egész fájl MemoryStream-ben van (loadbase()) és az összes keresési művelete abból hajtja végre. Ez nagyságrenekkel nagyobb, mint a file IO. Mondjuk látszik is a teljesítményen (az első megvalósításom File IO alapú volt, ott a 7-es sort 1.5-2 óra körül akarta megcsinálni MemorySteram-ből megvolt 1:34 perc alatt).

A programot folytatandó: A bit-kódolás az eredeti byte kódolás alapján történik, pl az első 3 byte:

a c| 2 8| 8 a|...
--------+--------+--------+...
10101100|00101000|10001010|...
--------+--------+--------+...
|111111 |22221111|...
76543210|54321098|32109876|...

Kicsit fejére fordítottnak tűnik, de ezt a bitkódolás miatt van (számolni egyszerűbb így, mintha bitsorrendben lenne - amúgy meg ha little-endian rendszerben néznénk, jól rakná ki a sort).

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#895) ArchElf válasza ArchElf (#894) üzenetére


ArchElf
addikt

folyt.
prímszámítás kommentezve:

private static bool isPrimeWithCountNew(Int64 szam)
{
Console.WriteLine("Osztoi:");

// Lista az osztók tárolására
List<long> osztok = new List<long>();
int result_x;

// Ha nem nyilvántartott prímszám akkor elkezdjük keresni
if ((result_x=GetPBit(szam)) != 1)
{
// keresési érték = kezdőérték
// elsőször egyenlő a számmal
long bc = szam;

// prím keresés első lépésének inicializálása
Int64 ix = 2;

// Addig iterálunk, míg minden gyököt meg nem találunk,
// vagy a sor végére nem érünk
while (true)
{
// amennyiben a keresési érték prímszám eltároljuk és kilépünk a ciklusból
// ez nem lehet az eredetileg keresett szám,
// mert akkor az előző feltételnél nem jutottunk volna be ide
if (GetPBit(bc) == 1)
{
osztok.Add(bc);
break;
}
// a négyzetgyökének veszzük a keresési kezdőértéknek
// kezdeti eseben az első iteráció a kezdeti szám négyzetéig keres
// ha eddig nincs találat a szám prímszám és > UInt32
long sq = (long)Math.Floor(Math.Sqrt(bc));

// ha a keresési kezdőérték prím és a négyzete kiadja a
// a keresett keresési kezdőértéket
// kétszer berakjuk a listába és kilépünk a ciklusból
if ((sq * sq == bc) && (GetPBit(sq) == 1))
{
osztok.Add(sq);
osztok.Add(sq);
break;
}

// osztási sort elkezdjük, addig megyünk,
// amíg a négyzetgyököt el nem érjük
bool mul = false;
while (ix <= sq)
{
int result;
// amennyiben az ix (keresési lépés) prímszám,
// megpróbálunk osztani vele
if ((result = GetPBit(ix)) == 1)
{
// ha sikerül az osztás maradék nélkül,
// a keresési kezdőértéket elosztjuk a
// keresési lépéssel és újrakezdjük külső ciklust
// a találta osztót a listához adjuk
// megjelöljük, hogy volt sikeres osztás
if (bc % ix == 0)
{
bc /= ix;
mul = true;
osztok.Add(ix);
break;
}
}
// amennyiben az keresőszámhoz tartozó tartományban (8 szám - 1 byte)
// nincs prím, úgy előre lépünk 8-at
if (result == -1)
ix = (((ix >> 3) + 1) << 3);
// minden más esetben növeljük a keresőszámot 1-el
else
ix++;
}
// ha nem találtunk osztót
if (!mul)
{
// ha a keresőszám != a keresett számmal,
// akkor a keresőszám > UInt32 és prím
// hozzáadjuk a listához
if (bc != szam)
osztok.Add(bc);
// kilépünk a külső ciklusból
break;
}
}
}
if (osztok.Count == 0)
{
Console.WriteLine("nincsenek");
return true;
}
else
{
Console.WriteLine("{0} prímtényezőre osztható, melyek a következők:", osztok.Count);
foreach (long l in osztok)
Console.Write("{0} ", l);
Console.WriteLine();
return false;
}
}
}

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#896) ArchElf válasza ArchElf (#895) üzenetére


ArchElf
addikt

Ehh :O
Megoldottam az egészet, gyorsabban 512 MB memória nélkül is...
Egyszerű matek. Úgy tűnik a sok memória és a sok számítás meg feltétel lasabbá teszi az egészet, mint az egyszerű számítgatás.

private static bool isPrimeWithCountNewSingular(Int64 szam)
{
Console.WriteLine("Osztoi:");

// Lista az osztók tárolására
List<long> osztok = new List<long>();

long bc = szam;
Int64 ix = 2;
bool search = true;
while (search)
{
long lr;
long sq = (long)Math.Floor(Math.Sqrt(bc));
if ((lr = GetPrimes(szam, ref bc, ref ix, ref search, sq)) != 0)
osztok.Add(lr);
}
if (osztok.Count == 0)
{
Console.WriteLine("nincsenek");
return true;
}
else
{
Console.WriteLine("{0} prímtényezőre osztható, melyek a következők:", osztok.Count);
foreach (long l in osztok)
Console.Write("{0} ", l);
Console.WriteLine();
return false;
}
}

private static long GetPrimes(long szam, ref long bc, ref Int64 ix, ref bool search, long sq)
{
long oszto = 0;
bool mul = false;
while (ix <= sq)
{
if (bc % ix == 0)
{
bc /= ix;
mul = true;
oszto = ix;
break;
}
ix++;
}
if (!mul)
{
if (bc != szam)
oszto = bc;
search = false;
}
return oszto;
}

FCK... mást nem akarok mondani.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#897) ArchElf válasza ArchElf (#896) üzenetére


ArchElf
addikt

Találtam egy példát, ahol gyorsabb az előre leszámolt :)

Primszamvizsgalat. Kerem a vizsgalando szamot: 998877665544332111

Primszamitas (új) folyamatban...

Osztoi:
nincsenek
Primszam.
Számítás időtartama: 27917 ms

Primszamitas (math) folyamatban...

Osztoi:
nincsenek
Primszam.
Számítás időtartama: 71188 ms


A kilepeshez nyomjon le egy billentyut!

:D

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#898) yash válasza ArchElf (#897) üzenetére


yash
senior tag

csinald meg ket szalon :) minden masodikat szamoljon a masodik szal, hogy prim-e, lehet felezi a keresesi eredmenyed idoben is! es akkor mar osszevetheto lesz!

(#899) ArchElf válasza yash (#898) üzenetére


ArchElf
addikt

Túl kevés ebben a számítás (és nem elég nagy a számtartomány), hogy gazdaságosan párhuzamosítható legyen.
Ja és mind a két módszer párhuzamosítható, így mind a kettő gyorsabb lesz :)

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#900) Jester01


Jester01
veterán

És hány darab prím van Int32-ben? Gondolom megnézted nem éri-e meg jobban magukat a prímeket tárolni (akár delta kódolással).

Jester

Copyright © 2000-2024 PROHARDVER Informatikai Kft.