Tråd för nuvarande och framtida frågor i Visual Studio 2017

Permalänk

Tråd för nuvarande och framtida frågor i Visual Studio 2017

Jag skapade en tråd för ett tag sedan där jag sökte hjälp för att välja språk att börja programmera i.

Jag landade i C# och har laddat ner Visual Studio Community 2017 v15.9.7. Jag hittade en guide för att bygga en enkel miniräknare i Windows Forms, och här är min första fråga. Han sätter "equal knappen" som "standard" för att den ska markeras när man trycker enter. Detta görs via en funktion i properties som heter AcceptButton där man sedan väljer den knapp som ska tilldelas den funktionen.

Problemet är att jag inte har AcceptButton i 2017 versionen, vad jag kan se iallafall. Hur löser jag detta? Har googlat men det verkar bara beröra gamla versioner av VS.

Tack.

Permalänk
Medlem

Windows Forms är rätt uråldrigt och utvecklas knappast längre (vilket man förstås kan se som en bonus). AcceptButton finns kvar, jag kollade nyss, på en Form - inte på en Button, som det varit länge. Titta under Misc i properties window. En googling hittar lätt svaret på sådana frågor.

Permalänk

Okej, tack! Jag googlade AcceptButton C# Visual Studio 2017 men jag fick bara träffar gällande tidigare versioner.

Vad bör jag rikta in mig på istället för Windows Forms då? Ge mig gärna ett bra exempel på en tutorial för nybörjare på YouTube!

Permalänk
Medlem
Skrivet av RobinJacobsson:

Okej, tack! Jag googlade AcceptButton C# Visual Studio 2017 men jag fick bara träffar gällande tidigare versioner.

Vad bör jag rikta in mig på istället för Windows Forms då? Ge mig gärna ett bra exempel på en tutorial för nybörjare på YouTube!

Är du helt ny med programmering skulle jag rekommendera console applications tills att du är väldigt bekväm med grundläggande syntax och hur OOP i C# fungerar, jag hade fokuserat på det åtminstone 2-3 månader.

Bob Microsoft C# Tutorial
Där har du en bra beginners tutorial som går igenom det grundläggande. Efter det beror det lite på vad det är du vill utveckla, .NET Core och webbutveckling är det jag sitter mest med.
WinForms kan du köra ett tag efter console om du vill öva lite på event hantering och så är det kanske lite roligare att ha ett GUI än att sitta med console. Kan då börja dra in Entity Framework och någon databas, t.ex. MSSQL. Så kan du ladda ner Northwind, en färdig databas med mycket data som man kan leka runt med.

Brackeys C# Tutorial
Annan pedagogisk tutorial av en Unity programmerare, så exemplerna efterliknar spel (vilket kan vara kul om man relaterar till det). Är också grundläggande på beginner nivå.

Permalänk

Är C# det enda som typ "säljs" nu när det kommer till Visual Studio? Minns att C# var typ det bästa språket. Men tittar man på statistik så växer VB.NET mer än någonsin nu. Varför?

Permalänk

Nu blev detta samma ämne som min andra tråd, men jag är bekant med variabeltyper, if, for, switch, funktioner (metoder i c#) från PHP, och klasser ska jag titta lite mer på, men är inte det ungefär samma sak som en metod? Något som man kan anropa och skicka med argument i?

Men det kanske är smartphoneapplikationer jag ska inrikta mig på? Kan man skriva och kompilera en kod som funkar till både Android och iOS eller skriver man olika kod för dom olika operativsystemen?

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av RobinJacobsson:

Nu blev detta samma ämne som min andra tråd, men jag är bekant med variabeltyper, if, for, switch, funktioner (metoder i c#) från PHP, och klasser ska jag titta lite mer på, men är inte det ungefär samma sak som en metod? Något som man kan anropa och skicka med argument i?

Men det kanske är smartphoneapplikationer jag ska inrikta mig på? Kan man skriva och kompilera en kod som funkar till både Android och iOS eller skriver man olika kod för dom olika operativsystemen?

En klass skulle man kunna beskriva som en "Sak".

Exempelvis:

public class Car { public void Drive() { Console.WriteLine("Vroom vroom"); } }

En klass kan man skapa instanser av, så för att kunna använda Drive() så måste jag först skapa en instans av en Car

Car myCar = new Car(); // Skapa en ny bil myCar.Drive(); // Kör den bilen

Självklart så går det att göra mycket mer än så med klasser, men det var ett enkelt exempel bara

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk

Ja, det har jag sett i en tutorial på Youtube nu också.
Jösses vad jag kommer att skratta åt det här om ett tag, men jag är inte säker på att jag förstår vart jag behöver det, och varför man inte kan använda sig av en funktion.

Kan du ge mig ett exempel på en enkel kod där man "behöver" en klass och en instans?

Permalänk
Medlem
Skrivet av RobinJacobsson:

Ja, det har jag sett i en tutorial på Youtube nu också.
Jösses vad jag kommer att skratta åt det här om ett tag, men jag är inte säker på att jag förstår vart jag behöver det, och varför man inte kan använda sig av en funktion.

Kan du ge mig ett exempel på en enkel kod där man "behöver" en klass och en instans?

Att arbeta med klasser och relaterade koncept brukar man kalla "Objektorienterad programmering" eller kort OOP. En samling idéer, koncept, och språkfunktioner som OOP kallas "paradigm". OOP paradigmen är i grund och botten baserat på tänket att data och funktionalitet är sammanvävt, och man får då klasser och objekt. Exempel på OOP språk är Java och C#. En annan paradigm är "imperativ programmering", vilken handlar om att man modellerar program som en serie av instruktioner som modifierar maskinens tillstånd. Exempel på imperativa språk är C och PHP. Den tredje vanliga paradigmen är "funktionell programmering", i vilken man beskriver program som kompositioner av funktioner.

Dessa paradigmer har dock inte helt strikta definitioner, och få språk kan sägas vara 100% av en enda paradigm. Till exempel Java är inte ett renrasigt OOP språk, utan har väldigt många imperativa aspekter, och har på senaste tid till och med fått ett par funktionella element.

Paradigmer är olika sätt att angripa problem. Olika sätt att bygga mentala och konkreta modeller. Vissa gillar OOP för att det matchar deras världsbild väl. "En bil är ett objekt, och har som beteende att den kan köra. Intuitivt!". Andra föredrar imperativ programmering, för det matchar hur en datormaskin faktiskt exekverar en sekvens av instruktioner. Ännu andra föredrar funktionell programmering, för det är närmre matematiken och lämpar sig bättre för att logiskt resonera kring program.

För att svara mer direkt på din fråga: Det finns inga problem där man måste använda klasser och instanser (i.e. OOP). Vissa använder det alltid, för det är vad de är vana vid eller det passar deras mentala modell bäst. Andra använder olika paradigmer, beroende på problemdomän. Personligen använder jag främst funktionell programmering med Haskell, för jag gillar tänket och garantierna som paradigmen och språket ger mig.

Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

Permalänk

Tack för info!

Jag har laddat ner MySQLWorkbench 8.0, tänkte försöka sätta upp en enkel databaskoppling och se om jag kan få ut nån data. Men hur gör jag för att administrera en databas/tabell som jag precis har skapat? Jag kan inte hitta vart jag insert'ar data till min tabell?

Permalänk

En annan fråga, jag försöker lista saker från min databas, och den klagar på att jag inte skickar något argument när jag anropar QueryEmployee(); i min main-metod. Jag förstår ju att jag inte gör det, men vad bör jag skicka för argument?

Edit: Lyckades lista ut att det var "conn" den förväntade sig...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Common;
using Tutorial.SqlConn;
using MySql.Data.MySqlClient;

namespace ConnectMySql
{

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Getting Connection ...");
MySqlConnection conn = DBUtils.GetDBConnection();

try
{
Console.WriteLine("Openning Connection ...");

conn.Open();

Console.WriteLine("Connection successful!");
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}

Console.Read();

//Listar alla anställda från metoden QueryEmployee
QueryEmployee();
Console.ReadKey();

}

private static void QueryEmployee(MySqlConnection conn)
{
string sql = "Select idID, FNamncol, ENamncol from enamn";

// Create command.
MySqlCommand cmd = new MySqlCommand();

// Set connection for command.
cmd.Connection = conn;
cmd.CommandText = sql;

using (DbDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{

while (reader.Read())
{
// Get index of Column Emp_ID in query statement.
int empIdIndex = reader.GetOrdinal("Emp_Id"); // 0

long empId = Convert.ToInt64(reader.GetValue(0));

// Index of Emp_ID = 1
string empNo = reader.GetString(1);
int empNameIndex = reader.GetOrdinal("Emp_Name");// 2
string empName = reader.GetString(empNameIndex);

// Index of column Mng_Id.
int mngIdIndex = reader.GetOrdinal("Mng_Id");

long? mngId = null;

// If a column is nullable always check for DBNull...
if (!reader.IsDBNull(mngIdIndex))
{
mngId = Convert.ToInt64(reader.GetValue(mngIdIndex));
}
Console.WriteLine("--------------------");
Console.WriteLine("empIdIndex:" + empIdIndex);
Console.WriteLine("EmpId:" + empId);
Console.WriteLine("EmpNo:" + empNo);
Console.WriteLine("EmpName:" + empName);
Console.WriteLine("MngId:" + mngId);

}
}
Console.ReadKey();
}

}

}
}

Permalänk
Medlem
Skrivet av RobinJacobsson:

En annan fråga, jag försöker lista saker från min databas, och den klagar på att jag inte skickar något argument när jag anropar QueryEmployee(); i min main-metod. Jag förstår ju att jag inte gör det, men vad bör jag skicka för argument?

Edit: Lyckades lista ut att det var "conn" den förväntade sig...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Common;
using Tutorial.SqlConn;
using MySql.Data.MySqlClient;

namespace ConnectMySql
{

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Getting Connection ...");
MySqlConnection conn = DBUtils.GetDBConnection();

try
{
Console.WriteLine("Openning Connection ...");

conn.Open();

Console.WriteLine("Connection successful!");
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}

Console.Read();

//Listar alla anställda från metoden QueryEmployee
QueryEmployee();
Console.ReadKey();

}

private static void QueryEmployee(MySqlConnection conn)
{
string sql = "Select idID, FNamncol, ENamncol from enamn";

// Create command.
MySqlCommand cmd = new MySqlCommand();

// Set connection for command.
cmd.Connection = conn;
cmd.CommandText = sql;

using (DbDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{

while (reader.Read())
{
// Get index of Column Emp_ID in query statement.
int empIdIndex = reader.GetOrdinal("Emp_Id"); // 0

long empId = Convert.ToInt64(reader.GetValue(0));

// Index of Emp_ID = 1
string empNo = reader.GetString(1);
int empNameIndex = reader.GetOrdinal("Emp_Name");// 2
string empName = reader.GetString(empNameIndex);

// Index of column Mng_Id.
int mngIdIndex = reader.GetOrdinal("Mng_Id");

long? mngId = null;

// If a column is nullable always check for DBNull...
if (!reader.IsDBNull(mngIdIndex))
{
mngId = Convert.ToInt64(reader.GetValue(mngIdIndex));
}
Console.WriteLine("--------------------");
Console.WriteLine("empIdIndex:" + empIdIndex);
Console.WriteLine("EmpId:" + empId);
Console.WriteLine("EmpNo:" + empNo);
Console.WriteLine("EmpName:" + empName);
Console.WriteLine("MngId:" + mngId);

}
}
Console.ReadKey();
}

}

}
}

Kom ihåg att lägga [code][/code]-taggar runt kod så att den blir läsbar

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk

Ja, jag hittade ingen kod-tagg så jag antog att det inte fanns någon sådan funktion. Jag ska tänka på det i fortsättningen!

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av RobinJacobsson:

Ja, jag hittade ingen kod-tagg så jag antog att det inte fanns någon sådan funktion. Jag ska tänka på det i fortsättningen!

Kan passa på att plugga Better Sweclockers. Underlättar väldigt mycket, och den har ett mörkt tema

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk

Jag har satt ribban ganska högt på mitt första projekt, men jag skulle vilja sätta ihop ett program som är relaterat till arbetet.

Vi har 6 olika avdelningar och cirka 30 medarbetare, vissa hanterar inte alla avdelningar och oftast man vill inte vara på samma ställe som gårdagen. Vi har ett par stycken som alltid gör samma sak. Gruppledaren sitter varje dag och skriver nya scheman, kartlägger vart alla har varit under gårdagen och måste manuellt "slumpa" fram nya postitioner, vilket jag tycker är extremt onödigt tidskrävande.

Exempel
Avdelning 1 omfattar 3 personer
Avdelning 2 omfattar 6 personer
Avdelning 3 omfattar 4 personer
Avdelning 4 omfattar 1 personer
Avdelning 5 omfattar 5 personer
Avdelning 6 omfattar 1 personer
Övrigt/förbättringar omfattar resterande personer

Min vilja är att få fram en kod där denne själv kan lägga in/ta bort medarbetare i MySQL och ange vilka stationer dom hanterar och är tillgängliga att slumpas till.

Säg att det finns ett okänt antal medarbetare som listas i en databas med id, fname, lname, lastsection, currentsection.
Varje dag ska man kunna slumpa/generera nya avdelningar pga krav på rotation för varje medarbetare, och man vill inte hamna på samma plats där man var förra dagen. Och alla medarbetare kan inte vara på alla 6 stationer, så jag tänker att man vill skapa en tabell som heter "sections" där varje avdelning har en kolumn och så ett id som binder varje rad till medarbetarna, där man kan sätta 1 eller 0 för om man kan hantera den avdelningen.

Jag tänker bland annat att man vill skapa en string array där varje avdelning finns listad, för att kunna presentera slumpgeneratorns utfall.

Hur kan man tänka sig att själva motorn för denna slumpmässiga placering kan se ut? Vill man börja med att slumpa en medarbetare till en avdelning och sedan gå vidare genom att slumpa nästa osv osv baserat på tidigare utfall? Men jag tänker att den måste även ta hänsyn till vart man var förra dagen och något säger mig att om man slumpar såhär så kan det bli lite lustigt i slutet när alla är utplacerade och det råkar bli så att den som är kvar har som enda alternativ att vara på samma plats som gårdagen eftersom alla positioner redan är låsta. Kodexempel mottages gärna!

Permalänk
Medlem
Skrivet av RobinJacobsson:

Jag har satt ribban ganska högt på mitt första projekt, men jag skulle vilja sätta ihop ett program som är relaterat till arbetet.

Vi har 6 olika avdelningar och cirka 30 medarbetare, vissa hanterar inte alla avdelningar och oftast man vill inte vara på samma ställe som gårdagen. Vi har ett par stycken som alltid gör samma sak. Gruppledaren sitter varje dag och skriver nya scheman, kartlägger vart alla har varit under gårdagen och måste manuellt "slumpa" fram nya postitioner, vilket jag tycker är extremt onödigt tidskrävande.

Exempel
Avdelning 1 omfattar 3 personer
Avdelning 2 omfattar 6 personer
Avdelning 3 omfattar 4 personer
Avdelning 4 omfattar 1 personer
Avdelning 5 omfattar 5 personer
Avdelning 6 omfattar 1 personer
Övrigt/förbättringar omfattar resterande personer

Min vilja är att få fram en kod där denne själv kan lägga in/ta bort medarbetare i MySQL och ange vilka stationer dom hanterar och är tillgängliga att slumpas till.

Säg att det finns ett okänt antal medarbetare som listas i en databas med id, fname, lname, lastsection, currentsection.
Varje dag ska man kunna slumpa/generera nya avdelningar pga krav på rotation för varje medarbetare, och man vill inte hamna på samma plats där man var förra dagen. Och alla medarbetare kan inte vara på alla 6 stationer, så jag tänker att man vill skapa en tabell som heter "sections" där varje avdelning har en kolumn och så ett id som binder varje rad till medarbetarna, där man kan sätta 1 eller 0 för om man kan hantera den avdelningen.

Jag tänker bland annat att man vill skapa en string array där varje avdelning finns listad, för att kunna presentera slumpgeneratorns utfall.

Hur kan man tänka sig att själva motorn för denna slumpmässiga placering kan se ut? Vill man börja med att slumpa en medarbetare till en avdelning och sedan gå vidare genom att slumpa nästa osv osv baserat på tidigare utfall? Men jag tänker att den måste även ta hänsyn till vart man var förra dagen och något säger mig att om man slumpar såhär så kan det bli lite lustigt i slutet när alla är utplacerade och det råkar bli så att den som är kvar har som enda alternativ att vara på samma plats som gårdagen eftersom alla positioner redan är låsta. Kodexempel mottages gärna!

Var försiktig så att det inte blir för mycket för tidigt. Du borde ta en titt på datanormalisering så att inte din databas blir en enda stor röra. Sen skulle jag också rekommendera att du skapar modellobjekt som representerar din data, med tillhörande relationer. Då måste du också tänka på hur dina databasrelationer ser ut, om de är 1-1, 1-N eller N-M och fundera på hur det bör lösas.

Till .NET finns även Entity Framework, vilket är ett verktyg för att underlätta databashantering. Dock kan det vara bra att öva på SQL för att förstå hur tabeller och relationer hänger ihop innan man abstraherar bort det

Skickades från m.sweclockers.com

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Legendarisk

@RobinJacobsson: Skulle föreslå att du väntar med databasen och istället fokuserar på hur du löser problemet med att tilldela Arbetare med olika Kunskaper och Preferenser (som kan beräknas utifrån önskemål, senaste placering etc.) olika Stationer. Hur skulle processen se ut utan någon kod alls? Eller om du tog bort preferenser ur ekvationen?

Tips: Du kan dela upp varje avdelning i enskilda roller som måste fyllas (Avdelning 1 skulle alltså bli 3 roller, Avdelning 2 bli 6 roller etc.), och sedan rita upp vilka roller som kan fyllas av vilka personer. Hur genererar och poängsätter du giltiga kombinationer (manuellt)?

Visa signatur

Abstractions all the way down.

Permalänk
Skrivet av Biberu:

@RobinJacobsson: Skulle föreslå att du väntar med databasen och istället fokuserar på hur du löser problemet med att tilldela Arbetare med olika Kunskaper och Preferenser (som kan beräknas utifrån önskemål, senaste placering etc.) olika Stationer. Hur skulle processen se ut utan någon kod alls? Eller om du tog bort preferenser ur ekvationen?

Tips: Du kan dela upp varje avdelning i enskilda roller som måste fyllas (Avdelning 1 skulle alltså bli 3 roller, Avdelning 2 bli 6 roller etc.), och sedan rita upp vilka roller som kan fyllas av vilka personer. Hur genererar och poängsätter du giltiga kombinationer (manuellt)?

En intressant tanke, jag vet att arbetsledaren börjar med att placera ut ett par stycken genom att titta på gårdagens schema.
Men mot slutet kan det ju bli så att dom sista personerna som ska schemaläggas, att bara dom platser som dom var på dagen innan finns lediga igen. Då måste man ju byta ut någon som man redan placerat. Vore det det smartaste sättet att lösa det även med kod? Jag tycker att det verkar lite "dumt", eller osmidigt kanske jag ska säga. Jag tänker att det måste ju finnas ett sätt att generera något när man har alla data som behövs, istället för att gissa sig fram och placera om dom sista om det skulle visa sig att dom redan varit på den avdelningen som är sist kvar för tilldelning.

Kan man påverka en random() att luta mot ett visst värde? Säg att jag har random(1, 2) och vill att den 60% av gångerna genererar 2?
Eller får man göra en mer högupplöst random typ 1-100 och tolka 1-60 som ett utfall?

Jag tänker att man kanske vill använda sig av en variabel för varje avdelning som gör den mer eller mindre attraktiv för tilldelning beroende på tidigare dagens placeringar och hur dom första utkasten av random sett ut.

Permalänk
Medlem
Skrivet av RobinJacobsson:

Kan man påverka en random() att luta mot ett visst värde? Säg att jag har random(1, 2) och vill att den 60% av gångerna genererar 2?
Eller får man göra en mer högupplöst random typ 1-100 och tolka 1-60 som ett utfall?

C# verkar tyvärr bara ha de mest grundläggande verktygen för att generera slumptal i standardbiblioteket, d.v.s. Random är det enda som finns och genererar slumptal med en likformig fördelning (d.v.s. alla tal är lika sannolika). Om du bara vill välja mellan två tal så kan du som du är inne på använda t.ex. Random.NextDouble för att generera ett tal mellan 0.0 och 1.0:

int i = random.NextDouble() > 0.6 ? 2 : 1;

Man kan också förlänga den tekniken till fler utfall genom att bara ha en stor if-sats som kollar vilken delmängd det genererade talet hamnar inom, men vill man kunna ha väldigt många utfall så kanske man får börja kolla på mer avancerade metoder.

Man kan även göra sin egen Random-klass genom att ärva från Random och överlagra Random.Sample, som är metoden som Random använder internt.

Permalänk

Jag tog ett papper och en penna och ritade ut några avdelningar och personer och testade olika kombinationer genom att manuellt slumpa och dra streck mellan avdelning - person. Detta är mina slutsatser:

En tabell för avdelningar, en kolumn "lediga platser"
En tabell för anställda, en kolumn "avdelning_igår" och "avdelning_tilldelad"

Detta kom jag fram till:

Slumpa fram en anställd tex #4 (ex slumpa ett ID nr)

Slumpa och uppdatera fält avdelning_tilldelad för denna anställde. Prioritera en med flest lediga platser.

Slumpa fram en ny anställd #6 som inte har egenskapen avdelning_igår = tidigare anställd (#4) avdelning_tilldelad

Kolla när det bara är 2 anställda kvar att tilldela en avdelning så att ingen riskerar att få samma avdelning som förra dagen.

Vad säger ni?

Permalänk
Legendarisk

@RobinJacobsson: Du kan generera upp kombinationer av arbetare och stationer utan att slumpa något alls. Har lite ont om tid så jag hoppas att det blir förståeligt, men här är en enkel metod för att undersöka alla möjligheter. Ponera att du har tre arbetare och tre stationer, och att alla inte kan arbeta överallt, ungefär så här:

Om varje kant i grafen viktas med arbetarens preferens (och den kan du slumpa, variera beroende på tidigare placering eller liknande) så kan du representera det i en matris på det här sättet:

| S1 S2 S3 ---+--------- A1 | 1 1 0 A2 | 2 1 1 A3 | 8 0 2

För att generera en kombination så kan du börja med att ta den första stationen S1, och se att den går att kombinera med tre arbetare: A1, A2 och A3, samt deras preferenser:

[(A1,S1,1)] ; Lista med (arbetare, station, preferens) [(A2,S1,2)] ; Ignorerar i exemplet [(A3,S1,8)] ; Ignorerar i exemplet

Nu har du två stationer kvar i din lista, så för varje kombination du redan har hittat lägger du till de nya. För den första listan blir det då:

[(A1,S1,1),(A1,S2,1)] ; A1 redan vald. [(A1,S1,1),(A2,S2,1)] ; Ok [(A1,S1,1),(A3,S2,0)] ; A3 får inte.

Nu har du tre nya listor från den första, men bara en är giltig att fortsätta med. En station återstår:

[(A1,S1,1),(A2,S2,1),(A1,S3,0)] ; A1 redan vald. [(A1,S1,1),(A2,S2,1),(A2,S3,1)] ; A2 redan vald. [(A1,S1,1),(A2,S2,1),(A3,S3,2)] ; Ok

Nu har du en möjlig kombination: Alla stationer är tillsatta med arbetare, och om du summerar preferenserna så får du ett värde på 4, det kan du ta som den totala belåtenheten. Genererar du resten av kombinationerna på samma sätt så kommer du hitta fler möjliga alternativ, och kan välja den med högst belåtenhet.

Visa signatur

Abstractions all the way down.

Permalänk

Oklarheter

Vad är tex 8 0 2 här under? Är det förslag på preferenser för A3? Där 0 är icke lämpad för S2 och 8 inneb'r att den absolut kan vara l'mpad för S1 tex?
Och vad menar du med att genomsnittsvärdet blir 4 i din förra post?

Om varje kant i grafen viktas med arbetarens preferens (och den kan du slumpa, variera beroende på tidigare placering eller liknande) så kan du representera det i en matris på det här sättet:

| S1 S2 S3
---+---------
A1 | 1 1 0
A2 | 2 1 1
A3 | 8 0 2

Permalänk
Legendarisk
Skrivet av RobinJacobsson:

Och vad menar du med att genomsnittsvärdet blir 4 i din förra post?

Om du har valt att placera Arbetare 1 på Station 1 (A1,S1), Arbetare 2 på Station 2 (A2,S2) och Arbetare 3 på Station 3 (A3,S3) så blir summan av deras preferenser 4 (1 + 1 + 2), men det finns andra kombinationer som är värda mer, t.ex. (A2,S1), (A1,S2), (A3,S3) med 5 (2 + 1 + 2). Om du använder en summa, ett genomsnitt eller någon annan metod för att bedöma belåtenheten spelar ingen roll för exemplet, poängen är först och främst att du vill hitta alla möjligheter och sedan välja den bästa.

Observera att du måste veta hur lösningen ser ut innan du kan uttrycka den i kod, och att inget av det här behöver någon databas ännu.

Skrivet av RobinJacobsson:

Vad är tex 8 0 2 här under? Är det förslag på preferenser för A3? Där 0 är icke lämpad för S2 och 8 inneb'r att den absolut kan vara l'mpad för S1 tex?

Precis så. 0 skulle innebära att arbetaren inte är kvalificerad för stationen, 1 att den är det, och 8 att den av någon anledning är väldigt föredragen.

Visa signatur

Abstractions all the way down.

Permalänk

Ja okej då förstår jag, och det verkar vara en bra lösning. Så detta borde funka även på avdelningar som rymmer olika antal medarbetare, jag tänker eftersom en avdelning kräver tex 6st människor och en annan kanske bara kräver 1.

Permalänk
Legendarisk
Skrivet av RobinJacobsson:

Så detta borde funka även på avdelningar som rymmer olika antal medarbetare, jag tänker eftersom en avdelning kräver tex 6st människor och en annan kanske bara kräver 1.

Ja, bara skapa en station per människa som behöver vara på avdelningen:

Visa signatur

Abstractions all the way down.

Permalänk

Okej! Hur kan det tänkas gå till rent kodmässigt? Jag kan anta att jag behöver använda en matris/array. Har funderat lite, och här är min tanke

int x; int y; int z; int antal_arbetare_from_mysql int antal_stationer_from_mysql int[] Array = new int[]; int[,] 2DArray = new int[antal_arbetare, 2]; int[, ,] 3DArray3 = new int[antal_arbetare, 2, 2] for (x = 1; x <= antal_arbetare; x++) { //spara preferenser för varje arbetare (ex a1,a2,a3) i en tex ?array? som vi kallar pref_a där station = 1 Array[antal_arbetare] = pref_a; for (y = 1; y <= antal_arbetare; y++) { //pref_b = aktuella arbetarens preferens (y = id från MySQL) från MySQL där station = 2 2DArray[Array[antal_arbetare], y] = [pref_a, pref_b]; for (z = 1; z <= antal_arbetare; z++) { //pref_b = aktuella arbetarens preferens (y = id från MySQL) från MySQL där station = 3 //detta blir totala preferensen för kombinationen arbetare i tre kombinationer 3DArray[Array[antal_arbetare], 2DArray[antal_arbetare, y], z]= [pref_a, pref_b, pref_c]; } } }

Antalet for-loopar motsvarar antalet stationer som finns. Jag vet inte om jag är på rätt väg, jag har precis börjat med C# och har typ skrivit ut hello world så ha lite tålamod...

Jag vet inte hur denna koden reagerar dock när det skiljer antal på stationer tex...

En sak missar jag, i ditt exempel blir den vinnande kombinationen där a1, s1, 1. Men det finns en a3 med preferens 8 för s1, vore inte det den vinnande kombinationen förutsatt att det inte finns en preferens 0 i lösningen?

Skickades från m.sweclockers.com

Permalänk
Legendarisk

@RobinJacobsson: Du höjde ribban rejält från hello world, glöm inte bort att ha kul under tiden bara! Ingen kod, bara ett par råd: Försök att arbeta igenom ett par små tabeller manuellt för att lära känna problemet innan du försöker uttrycka det i kod. (Gör du det så kommer du förresten snart märka hur många kombinationer det blir om du inte kan tämja det på något sätt!) Eller omvänt: Om du t.ex. är intresserad av att lära dig arbeta med databaser så försök att hitta något där problemet är mer känt och du kan fokusera på verktyget, det blir lätt mycket med allt på samma gång. Lycka till!

Skickades från m.sweclockers.com

Visa signatur

Abstractions all the way down.

Permalänk

Varför kan jag inte skapa en jagged array?

Jag vill testa utan databasen först och vill skapa en array för anställda, och för varje anställd ska det finnas egenskaper som säger om den ska finnas tillgänglig för en viss station, tillgängligheten beskrivs som 1 eller icke tillgänglig, 0. Det finns alltså för tillfället 5 olika stationer.

Kommentarsraden är felet jag får på just den raden.

int[][] personer_preferens = new int[3][]; personer_preferens[0] = new int[5]; personer_preferens[1] = new int[5]; personer_preferens[2] = new int[5]; personer_preferens[3] = new int[5]; personer_preferens[0] = new int[] { 1, 0, 1, 1, 0, }; //System.IndexOutOfRangeException 'Indexet låg utanför gränserna för matrisen' personer_preferens[1] = new int[] { 1, 0, 0, 0, 1, }; personer_preferens[2] = new int[] { 0, 1, 1, 1, 0, }; personer_preferens[3] = new int[] { 0, 1, 0, 1, 1, };

Här är min kod, är jag och nosar på lösningen?

En sak jag tänker på är att jag borde väl göra en loop som återskapar alla dom här looparna som är baserad på antal stationer?

Så om jag har tex 5 stationer totalt så kräver väl det även 5 st for-loopar som testar olika kombinationer. Nu har jag bara 3.

class Program { static void Main(string[] args) { //Antal personer varje avdelning rymmer int[] pers_per_avd = new int[10]; pers_per_avd[0] = 2; pers_per_avd[1] = 4; pers_per_avd[2] = 6; pers_per_avd[3] = 5; pers_per_avd[4] = 2; //Antal anställda totalt int ant_pers = 19; //Antal avdelningar int ant_avdelningar = 5; /*Avdelningar 0 = Avd 1 1 = Avd 2 2 = Avd 3 3 = Avd 4 4 = Avd 5 */ string[] avdelningar = new string[] { "Avd 1", "Avd 2", "Avd 3", "Avd 4", "Avd 5" }; /*Namn 0 = Pelle 1 = Anna 2 = Mikael 3 = Sara 4 = Johan 5 = Linda 6 = Markus */ string[] namn = new string[] { "Pelle", "Anna", "Mikael", "Sara", "Johan", "Linda", "Markus"}; //variabler för att köra for-looparna int i; int j; int k; int l; int m; int new_i = 0; int new_k = 0; int new_m = 0; //antal avdelningar totalt int ant_avd = 5; //räknare som finns placerad i varje loop för att presentera totalt antal kombinationer i slutet int o = 0; //antal avdelningar for (i = 0; i < ant_avd; i++) { o++; Console.WriteLine("[1]Avdelning: " + avdelningar[i]); Console.WriteLine("Personer per denna avdelning: " + pers_per_avd[i] + "\n"); //antal personer per ovanstående avdelning for(j = 0; j < pers_per_avd[i]; j++) { new_i = i + 1; o++; Console.WriteLine("[" + new_i + "][x][x]-Anställd: " + j); //antal avdelningar 2 for (k = 0; k < ant_avd; k++) { o++; //om avdelning inte är lika med första loopens avdelning if (k != i) { Console.WriteLine("\n[2]Avdelning: " + avdelningar[k]); Console.WriteLine("----Personer per denna avdelning: " + pers_per_avd[k]); //antal personer per ovanstående avdelning for (l = 0; l < pers_per_avd[k]; l++) { new_k = k + 1; o++; Console.WriteLine("\n[" + new_i + "][" + new_k + "][x]---Anställd: (" + l + ")" + namn[l]); //antal avdelningar 3 for (m = 0; m < ant_avd; m++) { o++; //om avdelning inte är lika med andra loopens avdelning if (m != k && m != i) { Console.WriteLine("\n------[3]Avdelning: " + avdelningar[m]); Console.WriteLine("-------Personer per denna avdelning: " + pers_per_avd[m]); //antal personer per ovanstående avdelning for (int n = 0; n < pers_per_avd[m]; n++) { new_m = m + 1; o++; Console.WriteLine("[" + new_i + "][" + new_k + "][" + new_m + "]-----Anställd: (" + n + ")" + namn[n]); } } } } } } } Console.WriteLine("\n" + o + " antal kombinationer!"); Console.WriteLine("\n\n"); } Console.ReadKey(); } }

Permalänk

Mitt största problem är hur jag ska göra för att jämföra kombinationer av placeringar nu när det är olika antal på varje station. När det var 3 stationer och 3 anställda tex var det lättare, då hade jag bara en loop för varje station.

class Program { static void Main(string[] args) { //Antal personer varje avdelning rymmer int[] pers_per_avd = new int[10]; pers_per_avd[0] = 2; pers_per_avd[1] = 4; pers_per_avd[2] = 6; pers_per_avd[3] = 5; pers_per_avd[4] = 2; //Antal anställda totalt int ant_pers = 19; //Antal avdelningar int ant_avdelningar = 5; /*Avdelningar 0 = Avd 1 1 = Avd 2 2 = Avd 3 3 = Avd 4 4 = Avd 5 */ string[] avdelningar = new string[] { "Avd 1", "Avd 2", "Avd 3", "Avd 4", "Avd 5" }; /*Namn 0 = Pelle 1 = Anna 2 = Mikael 3 = Sara 4 = Johan 5 = Linda 6 = Markus */ string[] namn = new string[] { "Pelle", "Anna", "Mikael", "Sara", "Johan", "Linda", "Markus" }; //preferenser för varje arbetare och vilka avdelningar den kan vara på int[][] ans_pref = new int[19][]; ans_pref[0] = new int[5]; ans_pref[1] = new int[5]; ans_pref[2] = new int[5]; ans_pref[3] = new int[5]; ans_pref[4] = new int[5]; ans_pref[5] = new int[5]; ans_pref[6] = new int[5]; ans_pref[7] = new int[5]; ans_pref[8] = new int[5]; ans_pref[9] = new int[5]; ans_pref[10] = new int[5]; ans_pref[11] = new int[5]; ans_pref[12] = new int[5]; ans_pref[13] = new int[5]; ans_pref[14] = new int[5]; ans_pref[15] = new int[5]; ans_pref[16] = new int[5]; ans_pref[17] = new int[5]; ans_pref[18] = new int[5]; ans_pref[0] = new int[] { 0, 1, 1, 0, 1 }; ans_pref[1] = new int[] { 1, 0, 1, 1, 0 }; ans_pref[2] = new int[] { 1, 1, 0, 0, 0 }; ans_pref[3] = new int[] { 1, 0, 1, 1, 1 }; ans_pref[4] = new int[] { 0, 1, 1, 0, 0 }; ans_pref[5] = new int[] { 0, 0, 0, 1, 1 }; ans_pref[6] = new int[] { 0, 1, 1, 0, 1 }; ans_pref[7] = new int[] { 0, 0, 1, 1, 1 }; ans_pref[8] = new int[] { 1, 0, 0, 0, 0 }; ans_pref[9] = new int[] { 1, 0, 1, 1, 1 }; ans_pref[10] = new int[] { 1, 1, 1, 1, 0 }; ans_pref[11] = new int[] { 1, 0, 1, 1, 0 }; ans_pref[12] = new int[] { 0, 1, 1, 0, 1 }; ans_pref[13] = new int[] { 0, 0, 1, 1, 0 }; ans_pref[14] = new int[] { 1, 1, 0, 0, 0 }; ans_pref[15] = new int[] { 0, 1, 1, 1, 0 }; ans_pref[16] = new int[] { 0, 1, 1, 0, 0 }; ans_pref[17] = new int[] { 0, 0, 0, 0, 1 }; ans_pref[18] = new int[] { 1, 1, 0, 0, 1 }; //variabler för att köra for-looparna int a; int b = 0; int i; int j; int k; int l; int m; int new_i = 0; int new_k = 0; int new_m = 0; //antal avdelningar totalt int ant_avd = 5; //räknare som finns placerad i varje loop för att presentera totalt antal kombinationer i slutet int o = 0; //antal avdelningar for (i = 0; i < ant_avd; i++) { o++; Console.WriteLine("[1]Avdelning: " + avdelningar[i]); Console.WriteLine("Personer per denna avdelning: " + pers_per_avd[i] + "\n"); //Kolla antal i ans_pref med 1 for (a = 0; a <= ant_pers; a++) { if (ans_pref[i][i] == 1) { b++; } } //antal personer per ovanstående avdelning for (j = 0; j < pers_per_avd[i]; j++) { new_i = i + 1; //om preferensen för arbetaren == 1, dvs kolla att arbetaren j är tillgänglig för stationen i if (ans_pref[j][i] == 1) { o++; Console.WriteLine("[" + new_i + "][x][x]-Anställd ID: " + j); } //antal avdelningar 2 for (k = 0; k < ant_avd; k++) { o++; //om avdelning inte är lika med första loopens avdelning if (k != i) { Console.WriteLine("\n[2]Avdelning: " + avdelningar[k]); Console.WriteLine("----Personer per denna avdelning: " + pers_per_avd[k]); //antal personer per ovanstående avdelning for (l = 0; l < pers_per_avd[k]; l++) { new_k = k + 1; //om preferensen för arbetaren == 1, dvs kolla att arbetaren l är tillgänglig för stationen k if (ans_pref[l][k] == 1) { o++; Console.WriteLine("\n[" + new_i + "][" + new_k + "][x]---Anställd ID: (" + l + ")" + namn[l]); } //antal avdelningar 3 for (m = 0; m < ant_avd; m++) { o++; //om avdelning inte är lika med andra loopens avdelning if (m != k && m != i) { Console.WriteLine("\n------[3]Avdelning: " + avdelningar[m]); Console.WriteLine("-------Personer per denna avdelning: " + pers_per_avd[m]); //antal personer per ovanstående avdelning for (int n = 0; n < pers_per_avd[m]; n++) { new_m = m + 1; //om preferensen för arbetaren == 1, dvs kolla att arbetaren n är tillgänglig för stationen m if (ans_pref[n][m] == 1) { o++; Console.WriteLine("[" + new_i + "][" + new_k + "][" + new_m + "]-----Anställd ID: (" + n + ")" + namn[n]); } } } } } } } } Console.WriteLine("\n" + o + " antal kombinationer!"); Console.WriteLine("\n\n"); } Console.ReadKey(); } }

Permalänk

Verkar inte vara alltför het tråd, vore tacksam om någon kunde hjälpa!

Jag har försökt hitta ett annat sätt att lösa mitt problem, och jag undrar:

Hur tar jag reda på hur många av mina arrays element som har blivit tilldelade ett värde?
Testade med array.Length och Count men det visade bara hur många element jag tilldelat min array.
Jag har löst det genom en for-loop, men det måste väl finnas en bättre lösning?

Och så undrar jag, hur tilldelar jag en jagged array värden i en loop från variabler?

int[][] utfall = new int[18][]; for(villkor) { utfall[antal] = new int[5]; utfall[antal][a] = 1; }