Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Ei pitäisi olla umpikujat ongelma kun aina otetaan kaikki haarat (naapurit) talteen niin aina
Tuo Zighin esittämä tapa ymmärtää tuonkin ja hylkää sen koska naapurit katsotaan jokaiselle ykköselle vain neljään suuntaan jolloin ei koskaan päästä siihen toiseen neljän ryhmään ja todetaan että lopputulos oli 4.Entä jos on kaksi 4 palan neliötä kiinni vain kulmittain, kuten aloitusviestin punainen yläoikea? Siinä kun lähtee käymään sitä 2x2 palaa ympäri niin kaikki on kunnossa, mutta ei olekaan.
Tuo Zighin esittämä tapa ymmärtää tuonkin ja hylkää sen koska naapurit katsotaan
vertaileminen. Ihan mielenkiinnosta, mihinkäs olet tuota juttua käyttämässä?
visit_cell(current):
mark_visited(current)
nl = find_unvisited_neighbours()
if len(nl) == 0:
return
for n in nl:
visit_cell(n)
R = 0
alue = [R,R,R,R,R,R,R,R,R,R,
R,0,0,0,0,0,0,0,0,R,
R,0,1,1,1,0,0,0,0,R,
R,0,0,0,1,1,1,0,0,R,
R,0,0,1,1,0,0,0,0,R,
R,0,0,0,0,0,0,0,0,R,
R,0,0,0,0,0,0,0,0,R,
R,0,0,0,0,0,0,0,0,R,
R,0,0,0,0,0,0,0,0,R,
R,R,R,R,R,R,R,R,R,R]
# Oikea, ylös, vasen, alas
suunnat = [1,-10,-1,10]
# Etsitään kuvion vasen ylänurkka ja aloitetaan siitä
alkupaikka = alue.index(1)
# Ensimmäisen palan yläpuolella ja vasemmalla on aina "seinä"
# Lähdetään kulkemaan alaspäin pitäen oikeaa kättä seinää vasten
alkusuunta = 3
# Asetetaan paikka ja suunta alussa
paikka = alkupaikka
suunta = alkusuunta
# Kerätään löydetyt palat listaan
palat = [alkupaikka]
while(True):
# Katsotaan pääseekö haluttuun suuntaan liikkumaan
if alue[paikka + suunnat[suunta]] == 1:
# Siirrytään seuraavalle palalle
paikka += suunnat[suunta]
# Listätään mahdollinen uusi pala listaan
if paikka not in palat:
palat.append(paikka)
# Käännytään oikealle (oikean käden sääntö)
suunta -= 1
if suunta < 0:
suunta = 3
# Jos ei pääse jatketaan etsintää
else:
# Käännytään vasemmalle
suunta += 1
if suunta > 3:
suunta = 0
# Lopeteteaan jos kaikki 8 palaa on löydetty
if len(palat) == 8:
break
# Lopetetaan jos on palattu takaisin alkupisteeseen
if suunta == alkusuunta and paikka == alkupaikka:
break
if (len(palat) == 8):
print("Kuvio koostuu 8 yhtenäisestä palasta!")
else:
print("Kuviossa on vain "+str(len(palat))+" palaa...")
| Ja tuo ade07 koodi, näyttää toimivan hienosti. Siirtelin ja kääntelin tuota aluetta ja aina tuli oikea vastaus. Tosin tuota ohjelman antamaa palaute viestiä voisi vaihtaa, koska aluetta voi laajentaa, ja viesti pysyy samana; Kuvio koostuu 8 yhtenäisestä palasta! |
Python:
|
fill char: 1
visited: list
visit: list
visit.add ( index of first element that is fill char )
while visit:
current = visit.pop
if current not in visited:
visited.add( current )
for element in left, right, up, down
if element is fill char
visit.add( index of element )
return visited
size = width * height
board = [0,...]
fill_board
visited = []
visit = []
# find index of first element that is not empty
visit.append( ... )
while visit:
cur_index = visit.pop()
if cur_index not in visited:
visited.add(cur_index)
# for element in left, right, up and down
# if element is not empty
# add index to nodes
for i in (-1, 1, -width, width):
next_index = cur_index + i
if 0 <= next_index < size: # discard invalid indexes
if board[next_index] == 1:
visit.append(next_index)
Hei! Kiitos vastauksesta ja testailusta
Ja tuo ade07 koodi, näyttää toimivan hienosti.
Siirtelin ja kääntelin tuota aluetta ja aina tuli oikea vastaus.
Tosin tuota ohjelman antamaa palaute viestiä voisi vaihtaa, koska aluetta voi laajentaa,
ja viesti pysyy samana; Kuvio koostuu 8 yhtenäisestä palasta! Python:R = 0 alue = [R,R,R,R,R,R,R,R,R,R, R,0,0,0,0,0,0,0,0,R, R,0,0,1,1,0,1,0,0,R, R,0,0,0,1,1,1,0,0,R, R,0,0,0,0,1,1,0,0,R, R,0,0,0,0,0,0,0,0,R, R,0,0,0,0,0,0,0,0,R, R,0,0,0,0,0,0,0,0,R, R,0,0,0,0,0,0,0,0,R, R,R,R,R,R,R,R,R,R,R]
# Lopeteteaan jos kaikki 8 palaa on löydetty
#if len(palat) == 8:
# break
Kuviossa on vain 25 palaa...
Hei! Esimerkissäsi, jos Y on täysi kaikki palat käydään tuon oikean käden säännön mukaan läpi vastapäivään. Jos Y on tyhjä tilannetta varten koodissa on ovela kikka. Kun lähdetään oikeasta yläreunasta kiertämään alaspäin, joudutaan tuota oikealle lähtevää haaraa varten palaamaan lähtöpaikan ohi. Siksi tuossa koodissa alkupaikan lisäksi tallennetaan alkusuunta ja lopetusehto onkin:Eihän tuo seinän seuraus toimi tällaiselle kuviolle:
XXX
XYX
XX
Missä Y voi joko olla tyhjä tai täysi. Saatan tosin olla väärässäkin...
if suunta == alkusuunta and paikka == alkupaikka:
break
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 6x6.py
#
# https://www.geeksforgeeks.org/find-number-of-islands/
# Ohjelma saarten laskemiseen 2D-matriisissa
class Graph:
def __init__(self, row, col, graph):
self.ROW = row
self.COL = col
self.graph = graph
# 2D matriisin apufunktio DFS()
# Se huomioi kaikki 8 naapuri solua, siis kulmat myös.
# Tämä tosin on helppo muuttaa sellaiseksi, ettei
# kulmia oteta huomioon, kuten tässä on tehty.
def DFS(self, i, j):
if i < 0 or i >= len(self.graph) or j < 0 or j >= len(self.graph[0]) or self.graph[i][j] != 1:
return
# merkitään se vierailuksi
self.graph[i][j] = -1
# Toisto 8:lle naapurisolulle
# tai nyt muokattuna 4:lle naapurisolulle
#self.DFS(i - 1, j - 1)
self.DFS(i - 1, j)
#self.DFS(i - 1, j + 1)
self.DFS(i, j - 1)
self.DFS(i, j + 1)
#self.DFS(i + 1, j - 1)
self.DFS(i + 1, j)
#self.DFS(i + 1, j + 1)
# Pää funktio joka laskee saarten määrän.
def countIslands(self):
count = 0 # Saarten määrä nollaksi (0), ja tarkistetaan jokainen solu
for i in range(self.ROW):
for j in range(self.COL):
if self.graph[i][j] == 1: # Vierailematon solu on 1, ja osa uutta saarta
self.DFS(i, j) # Vieraillaan saaren jokaisessa solussa
count += 1 # ja lisätään saarten määrää.
return count
graph = [
[0,1,1,1,1,1],
[0,1,0,0,0,1],
[0,1,0,1,0,1],
[0,1,0,0,0,1],
[0,1,1,1,1,1],
[0,0,0,0,0,0]
]
row = len(graph)
col = len(graph[0])
g = Graph(row, col, graph)
print("Saarten määrä on:", g.countIslands())
# Tämän koodi on muokattu alkuperäisestä Shivam Shrey kirjoittamasta
# https://www.geeksforgeeks.org/find-number-of-islands/
Kun olen viime aikoina innostunut opettelemaan golang-kieltä, en malta olla näyttämättä hieman muokattua go-versiota tästä hauskasta pikku tehtävästä. Pythonistalle go on helppo opittava, ja eduista mainittakoon vahva tyypitys, joka nopeuttaa toimivan ohjelman aikansaantia huomattavasti, sekä oikea kääntäjä, joka tuottaa itseriittoisia kompakteja binäärejä. Joku saattaa pitää etuna sitäkin, että kielessä ei ole luokkia eikä siis ole kiusausta väkisin vääntää simppeliä koodia "objekti-orientoituneeseen" muotoon.Löysin sivun jolla tämä pähkinä on ratkaistu, mutta viivyttelin sen jakamisen kanssa, muutaman päivän, jotta mielenkiinto omaa ratkaisun löytämiseen ei katoaisi.
Python:#!/usr/bin/env python # -*- coding: utf-8 -*- # # 6x6.py # # https://www.geeksforgeeks.org/find-number-of-islands/ # Ohjelma saarten laskemiseen 2D-matriisissa class Graph: def __init__(self, row, col, graph): self.ROW = row self.COL = col self.graph = graph # 2D matriisin apufunktio DFS() # Se huomioi kaikki 8 naapuri solua, siis kulmat myös. # Tämä tosin on helppo muuttaa sellaiseksi, ettei # kulmia oteta huomioon, kuten tässä on tehty. def DFS(self, i, j): if i < 0 or i >= len(self.graph) or j < 0 or j >= len(self.graph[0]) or self.graph[i][j] != 1: return # merkitään se vierailuksi self.graph[i][j] = -1 # Toisto 8:lle naapurisolulle # tai nyt muokattuna 4:lle naapurisolulle #self.DFS(i - 1, j - 1) self.DFS(i - 1, j) #self.DFS(i - 1, j + 1) self.DFS(i, j - 1) self.DFS(i, j + 1) #self.DFS(i + 1, j - 1) self.DFS(i + 1, j) #self.DFS(i + 1, j + 1) # Pää funktio joka laskee saarten määrän. def countIslands(self): count = 0 # Saarten määrä nollaksi (0), ja tarkistetaan jokainen solu for i in range(self.ROW): for j in range(self.COL): if self.graph[i][j] == 1: # Vierailematon solu on 1, ja osa uutta saarta self.DFS(i, j) # Vieraillaan saaren jokaisessa solussa count += 1 # ja lisätään saarten määrää. return count graph = [ [0,1,1,1,1,1], [0,1,0,0,0,1], [0,1,0,1,0,1], [0,1,0,0,0,1], [0,1,1,1,1,1], [0,0,0,0,0,0] ] row = len(graph) col = len(graph[0]) g = Graph(row, col, graph) print("Saarten määrä on:", g.countIslands()) # Tämän koodi on muokattu alkuperäisestä Shivam Shrey kirjoittamasta # https://www.geeksforgeeks.org/find-number-of-islands/
package main
import "fmt"
var areas = [][] int {
{0,1,1,1,1,1},
{0,1,0,0,0,1},
{0,1,0,1,0,1},
{0,1,0,0,0,1},
{0,1,1,1,1,1},
{0,0,0,0,0,0},
{0,1,1,0,0,0},
}
func countIslands() int{
var count = 0 // löytyneiden saarten lkm
var expand func(int, int)
// DepthFirstSearch...
expand = func (i int, j int){
// ollaanko vielä kartalla?
if i < 0 || i >= len(areas) || j < 0 || j >= len(areas[0]) {return}
// onko alue kuiva ja vapaa?
if areas[i][j] != 1 {return}
// juu on, siis otetaan käyttöön
// ja liitetään saareen numero 'count'
areas[i][j] = -count
// tutkitaan naapurialueet
expand(i - 1, j)
expand(i, j - 1)
expand(i, j + 1)
expand(i + 1, j)
}
for i, row := range areas {
for j, area := range row{
if area == 1{
// löytyi käymätöntä kuivaa maata,
// eli uusi saari
count++
// tutkitaan voiko laajentua
expand(i, j)
}
}
}
return count
}
func main() {
fmt.Println("Saarten määrä on:", countIslands())
// tulostetaan eräänlainen kartta
for _, row := range areas{
for _, area := range row {
fmt.Printf("%2d", -area)
}
fmt.Println()
}
}
Tuossa ja esikuvissaan on kuitenkin sellainen vika, että se ei erota saarta mantereesta. Eli ei osaa hylätä sellaisia ykkösiä, joiden joka puolella on nollia. Tässäpä olisi näiltä osin parannettu ratkaisu, vaihteeksi pythoniksi:Kun olen viime aikoina innostunut opettelemaan golang-kieltä, en malta olla näyttämättä hieman muokattua go-versiota tästä hauskasta pikku tehtävästä.
areas = [
[0,1,1,1,1,1],
[0,1,0,0,0,1],
[0,1,0,1,0,1],
[0,0,0,0,0,0],
[0,1,1,1,1,1],
[1,0,0,0,0,0],
[0,1,1,0,1,0],
]
def continents():
count = 0 # Löytyneiden mannerten määrä
def expand(i, j, root):
nonlocal expanding
# ollaanko vielä kartalla?
if i < 0 or i >= len(areas) or j < 0 or j >= len(areas[0]):
return
# onko alue kuiva ja uusi
if areas[i][j] != 1: return
# jos on, liitetään mantereeseen
areas[i][j] = -count
# yritetään laajentua joka suuntaan
expanding = not root # laajentuminen on onnistunut
for k in range(i-1, i+2):
for l in range(j-1, j+2):
if i != k or j != l:
expand(k, l, False)
for i, row in enumerate(areas):
for j, area in enumerate(row):
if area == 1:
# löytyi uutta maata
# saariko vai manner?
# veikataan mannerta
count += 1
expanding = False
expand(i, j, True)
if not expanding:
# eipä ollut mantereen alku,
# vettä joka puolella
# pyyhitään kartalta
count -= 1
areas[i][j] = 0
return count
if __name__ == "__main__":
print("Mantereiden määrä on:", continents())
for row in areas:
for area in row:
print("%2d" % -area, end="")
print()
#include <iostream>
#include <math.h>
#include <Windows.h>
#include <string>
int numMuunnin();
int valinnanMuunto(std::string);
void kone(int);
void voittaja(int, int);
int main()
{
// Tulostuksen ääkköset :
setlocale(LC_ALL, "");
std::string pelaajanValinta;
int pelaaja;
int koneenValinta;
int kierrokset = 0;
int voitot = 0;
int koneenVoitot = 0;
//Kysytään käyttäjältä kuinka monta kierrosta halutaan pelata?
std::cout << "Kuinka monta kierrosta haluat pelata?" << std::endl;
std::cout << "Anna kierrokset >";
std::cin >> kierrokset;
//Kysytään käyttäjän valinta
for (int kierros = 1; kierros <= kierrokset; kierros++)
{
std::cout << "Kierros numero:" << kierros << "/" << kierrokset << std::endl;
std::cout << "\nValitse kivi, paperi tai sakset:";
std::cin >> pelaajanValinta;
std::cout << "\nSinun valintasi on: " << pelaajanValinta << "\n";
//Aliohjelmat
koneenValinta = numMuunnin();
pelaaja = valinnanMuunto(pelaajanValinta);
kone(koneenValinta);
voittaja(koneenValinta, pelaaja);
}
}
int numMuunnin()
{
std::srand(time(0));
int randomi = rand() % 3 + 1;
return randomi;
}
int valinnanMuunto(std::string pelaaja1)
{
int merkinkoodi = 0;
if (pelaaja1 == "kivi")
merkinkoodi = 1;
else if (pelaaja1 == "paperi")
merkinkoodi = 2;
else if (pelaaja1 == "sakset")
merkinkoodi = 3;
return merkinkoodi;
}
void kone(int pelaaja2)
{
if (pelaaja2 == 1)
{
std::cout << "Kone valitsi kiven\n";
}
else if (pelaaja2 == 2)
{
std::cout << "Kone valitsi paperin\n";
}
else if (pelaaja2 == 3)
{
std::cout << "Kone valitsi sakset\n";
}
}
void voittaja(int pelaaja1, int pelaaja2)
{
if ((pelaaja1 == 1 && pelaaja2 == 2) || (pelaaja1 == 2 && pelaaja2 == 3) || (pelaaja1 == 3 && pelaaja2 == 1))
{
std::cout << "\nSinä voitit pelin! \n\n";
}
else if ((pelaaja1 == 1 && pelaaja2 == 3) || (pelaaja1 == 2 && pelaaja2 == 1) || (pelaaja1 == 3 && pelaaja2 == 2))
{
std::cout << "\nTietokone voitti pelin! \n\n";
}
else
{
std::cout << "\nTasapeli\n\n";
}
}
tulos = voittaja(koneenValinta, pelaaja);
if (tulos == 1) {
voitot++;
} else if (tulos == -1) {
koneenVoitot++;
}
tulos = voittaja(koneenValinta, pelaaja);
tilanne += tulos;
void voittaja(int pelaaja1, int pelaaja2, int& voitot1, int& voitot2)
{
if ((pelaaja1 == 1 && pelaaja2 == 2) || (pelaaja1 == 2 && pelaaja2 == 3) || (pelaaja1 == 3 && pelaaja2 == 1))
{
std::cout << "\nSinä voitit pelin! \n\n";
voitot2++;
}
else if ((pelaaja1 == 1 && pelaaja2 == 3) || (pelaaja1 == 2 && pelaaja2 == 1) || (pelaaja1 == 3 && pelaaja2 == 2))
{
std::cout << "\nTietokone voitti pelin! \n\n";
voitot1++;
}
else
{
std::cout << "\nTasapeli\n\n";
}
}
voittaja(koneenValinta, pelaaja, koneenVoitot, voitot;
/*
* kivi-paperi-sakset.cpp
*
*/
#include <iostream>
/* #include <math.h> */
/* #include <Windows.h> */
/* #include <string> */
int numMuunnin();
int valinnanMuunto(std::string);
void kone(int);
void voittaja(int, int);
int kierros = 0;
int kierrokset = 0;
int voitot = 0;
int koneenVoitot = 0;
void voittaja(int pelaaja1, int pelaaja2) {
if (
(pelaaja1 == 1 && pelaaja2 == 2) ||
(pelaaja1 == 2 && pelaaja2 == 3) ||
(pelaaja1 == 3 && pelaaja2 == 1))
{
voitot = voitot + 1;
std::cout << "\nSinä voitit tämän kierroksen!\n"
<< "Tilanne on nyt koneen voitot: " << koneenVoitot
<< " sinun voitot: " << voitot << "\n\n"; }
else if (
(pelaaja1 == 1 && pelaaja2 == 3) ||
(pelaaja1 == 2 && pelaaja2 == 1) ||
(pelaaja1 == 3 && pelaaja2 == 2))
{
koneenVoitot = koneenVoitot + 1;
std::cout << "\nKone voitti tämän kierroksen!\n"
<< "Tilanne on nyt koneen voitot: " << koneenVoitot
<< " sinun voitot: " << voitot << "\n\n"; }
else {
std::cout << "\nTämä kierros päättyi tasapeliin!\n"
<< "Tilanne on nyt koneen voitot: " << koneenVoitot
<< " sinun voitot: " << voitot << "\n\n"; }
if (kierros == kierrokset) {
std::cout << "\n\nPeli päättyi!\n";
if (koneenVoitot > voitot) {
std::cout << "Koneen voittoon, lukemin : "
<< koneenVoitot << "/" << voitot << "\n\n\n";
}
else if (voitot > koneenVoitot) {
std::cout << "Sinun voittoon, lukemin : "
<< voitot << "/" << koneenVoitot << "\n\n\n";
}
else {
std::cout << "tasapeliin, lukemin : "
<< voitot << "/" << koneenVoitot << "\n\n\n";
}
}
}
int main() {
// Tulostuksen ääkköset :
setlocale(LC_ALL, "");
std::string pelaajanValinta;
int pelaaja;
int koneenValinta;
//Kysytään käyttäjältä kuinka monta kierrosta halutaan pelata?
std::cout << "Kuinka monta kierrosta haluat pelata?" << std::endl;
std::cout << "Anna kierrokset > ";
std::cin >> kierrokset;
std::cout << "\n";
//Kysytään käyttäjän valinta
for (kierros = 1; kierros <= kierrokset; kierros++) {
std::cout << "KIERROS NUMERO: " << kierros << "/" << kierrokset << std::endl;
std::cout << "Valitse kivi, paperi tai sakset: ";
std::cin >> pelaajanValinta;
std::cout << "Sinun valintasi on: " << pelaajanValinta << "\n";
//Aliohjelmat
koneenValinta = numMuunnin();
pelaaja = valinnanMuunto(pelaajanValinta);
kone(koneenValinta);
voittaja(koneenValinta, pelaaja);
}
}
int numMuunnin() {
std::srand(time(0));
int randomi = rand() % 3 + 1;
return randomi;
}
int valinnanMuunto(std::string pelaaja1) {
int merkinkoodi = 0;
if (pelaaja1 == "kivi") merkinkoodi = 1;
else if (pelaaja1 == "paperi") merkinkoodi = 2;
else if (pelaaja1 == "sakset") merkinkoodi = 3;
return merkinkoodi;
}
void kone(int pelaaja2) {
if (pelaaja2 == 1) { std::cout << "Kone valitsi kiven\n"; }
else if (pelaaja2 == 2) { std::cout << "Kone valitsi paperin\n"; }
else if (pelaaja2 == 3) { std::cout << "Kone valitsi sakset\n"; }
}
cout << "Press Enter to Continue";
cin.ignore();#include <unistd.h> // sleep(2);
#include <iostream>
/*
* HUOM Näytön tyhjennys
* Linux: system ("clear");
* Windows: system ("CLS");
*/
using namespace std;
int main() {
int Oma_valinta = 0;
int Omat_voitot = 0;
int Koneen_valinta = 0;
int Koneen_voitot = 0;
bool OK = true;
while (OK != false) {
system ("clear");
cout << "\n\n\n";
cout << "\t\033[31mVALITSE [1,2,3,4]\033[0m\n";
cout << "\t\033[31m=================\033[0m\n";
cout << "\t\033[32m1 - Kivi\033[0m\n";
cout << "\t\033[32m2 - Paperi\033[0m\n";
cout << "\t\033[32m3 - Sakset\033[0m\n";
cout << "\t\033[32m4 - Lopetus\033[0m\n";
cout << "\n\t\033[36mAnna valintasi ja paina Enter: \033[0m";
cin >> Oma_valinta;
switch (Oma_valinta) {
case 1: cout << "\n\n\tValitsit\t KIVEN\n\t"; cout.flush(); sleep(1); break;
case 2: cout << "\n\n\tValitsit\t PAPERIN\n\t"; cout.flush(); sleep(1); break;
case 3: cout << "\n\n\tValitsit\t SAKSET\n\t"; cout.flush(); sleep(1); break;
case 4: cout << "\n\n\tValitsit\t LOPETUKSEN\n\t"; cout.flush(); OK = false; break;
default: cout << "\n\n\tVirheellinen valinta.\n\tYritä uudestaan!"; cout.flush(); sleep(1); break;
}
if (Oma_valinta == 1 || Oma_valinta == 2 || Oma_valinta == 3) {
srand(time(0));
Koneen_valinta = rand() % 3 + 1;
switch (Koneen_valinta) {
case 1: cout << "Kone valitsi\t KIVEN\n"; cout.flush(); sleep(1); break;
case 2: cout << "Kone valitsi\t PAPERIN\n"; cout.flush(); sleep(1); break;
case 3: cout << "Kone valitsi\t SAKSET\n"; cout.flush(); sleep(1); break;
}
if (
(Oma_valinta == 1 && Koneen_valinta == 2) ||
(Oma_valinta == 2 && Koneen_valinta == 3) ||
(Oma_valinta == 3 && Koneen_valinta == 1))
{
Omat_voitot = Omat_voitot + 1; cout << "\n\tSinä voitit tämän kierroksen!\n\n";
}
else if (
(Oma_valinta == 1 && Koneen_valinta == 3) ||
(Oma_valinta == 2 && Koneen_valinta == 1) ||
(Oma_valinta == 3 && Koneen_valinta == 2))
{
Koneen_voitot = Koneen_voitot + 1; cout << "\n\tKone voitti tämän kierroksen!\n\n";
}
else {
cout << "\n\tTämä kierros päättyi tasapeliin!\n\n";
}
cout << "\t\033[31mTILANNE NYT:\033[0m\n"
<< "\t\033[33mKoneen voitot: \033[0m" << Koneen_voitot << "\n"
<< "\t\033[33mSinun voitot: \033[0m" << Omat_voitot << "\n\n"; cout.flush();
cout << "\n\tOdota peli jatkuu 5 sekunnin kuluttua ."; cout.flush(); sleep(1);
cout << "."; cout.flush(); sleep(1);
cout << "."; cout.flush(); sleep(1);
cout << "."; cout.flush(); sleep(1);
cout << "."; cout.flush(); sleep(1);
Oma_valinta = 0;
}
}
return 0;
}
Hiukan asiaan liittyen, ihmetyttää ja kummastuttaa C++:san sleep( ) komento. Ennen komentoa olevat tulostukset tulostuvat vasta sleep( ) komennon jälkeen, no tuossa auttaa tuo cout.flush( ); joka näyttää pakottavan suorituksen etenemisen niin kuin se on kirjoitettu. Mutta tämä alla oleva ei kyllä jää odottelemaan jos sleep( ) käskyä on käytetty.
#include <iostream>
using namespace std;
int main () {
char abc[] = "abcdefghijklmnopqrsštuvwxyzžåäö";
char ABC[] = "ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ";
int j = sizeof(abc);
for(int i = 0; i < j; i++) {
cout << abc[i] << ABC[i];
}
return 0;
}
OK, kiitän ja kumarran,
mutta tässä olisi toinen kysymys, kuinka nämä merkit saadaan tulostumaan oikein, nyt tulostuu tällaista:
"aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsS�š�tTuUvVwWxXyYzZ�ž��å��ä��ö�"
C++:#include <iostream> using namespace std; int main () { char abc[] = "abcdefghijklmnopqrsštuvwxyzžåäö"; char ABC[] = "ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ"; int j = sizeof(abc); for(int i = 0; i < j; i++) { cout << abc[i] << ABC[i]; } return 0; }
Nyt tuli sellainen ongelma, että en edes tiedä, miten tätä pitäisi debugata. Selaimen konsoliin ei tule mitään virhettä, kuten ei myöskään palvelimen logiin. Ainakin useimmilla sivuilla toiminto toimii, mutta tässä ei: SuomiSF - Sinisalo, Johanna: Ennen päivänlaskua ei voi
Eli pitää kirjautua admin/admin, sen jälkeen ylläpitovalikosta "Muokkaa sivua" ja klikkaa "Palkinnot"-tekstin perässä olevaa plussaa. Pitäisi aueta modaali, mutta ainoastaan tuo modaalin aiheuttama sivun tummennus tapahtuu, modaali ei aukea. Inspectorista päätellen se ei siis aukea ollenkaan. Ja siis muilla testatuilla sivuilla toimii. En keksi mikä tuossa teoksessa on eri tavalla.
(Tuo on testiserveri, jonka kanta resetoituu johonkin aikaan yöllä, joten vahinkoa ei pysty aiheuttamaan.)
Toistakymmentä muuta sivua kokeilin ja nyt löytyi toinen, jossa käy samoin: SuomiSF - Paasilinna, Arto: Ukkosenjumalan poika. Ja lisää: SuomiSF - Paasilinna, Arto: Maailman paras kylä, SuomiSF - Paasilinna, Arto: Hirnuva maailmanloppu. Että kyllähän noita näyttää olevan. Ensisilmäyksellä vaikuttaisi, että kyse on teoksista joilla on useampi painos, mutta noistakin useimmat tuntuvat aukeavan.
Hei! Testailin koodiasi Windows 10 alustalla MinGW-W64 g++ 8.1.0 kääntäjällä. Komentorivin "cmd.exe" fonttina minulla on "Lucida Console". Alkuperäinen tulostus näytti minullakin väärältä:OK, kiitän ja kumarran,
mutta tässä olisi toinen kysymys, kuinka nämä merkit saadaan tulostumaan oikein, nyt tulostuu tällaista:
"aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsS�š�tTuUvVwWxXyYzZ�ž��å��ä��ö�"
#include <iostream>
#include <fcntl.h> // _O_U16TEXT, _O_U8TEXT
#include <io.h> // _setmode
int main() {
_setmode(_fileno(stdout), _O_U16TEXT);
wchar_t abc[] = L"abcdefghijklmnopqrsštuvwxyzžåäö";
wchar_t ABC[] = L"ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ";
int j = sizeof(abc) / sizeof(abc[0]);
for (int i = 0; i < j; i++) {
std::wcout << abc[i] << ABC[i];
}
}
Tuohon merkkijonon pituuteen on sellainen funktio kuin wcslen().Merkkijonon pituutta ei enää saa suoraan sizeof() funktiolla, sillä yksi merkki on nyt kahden tavun mittainen. Viimeiseksi ulostulona pitää käyttää "std::wcout" ia "std::cout" sijasta.
Totta. Nuissa aiemmissa koodipätkissä on tosiaan bugit tuohon liittyen. sizeof() funktio antaa kyseisessä tapauksessa tekstille varatun muistialueen koon. Nyt tuossa for loopissa käydään koko muistialue mukaan luettuna merkkijonon terminointimerkki null "\0" (tai sen leveä versio tuossa wchar_t tyypissä). Tekstin muistialueet voivat olla paljon pidemmät kuin mitä sen hetkinen tekstisisältö vaatii. Esimerkiksi, kun tekstiä luetaan syötteeltä, tekstille on varattu vain jokin maksimikoko ja itse tekstiosio päätetään tuolla terminointimerkillä.Ai niin, pitää vielä lisätä se, että sizeof():ia ei muutenkaan saa käyttää merkkijonon pituuden lukemiseen. Siihen tarkoitukseen on strlen(). sizeof():n arvo määritetään käännösaikana.
sizeof abc / sizeof abc[0]; // kääntyy
sizeof abc / sizeof(wchar_t); // kääntyy
sizeof abc / sizeof wchar_t; // ei käänny
//#include <sys/io.h>
//#include 'dmlite.h'
//#include 'any.h'
//#include 'pool.h'
//#include <sys/uio.h>
//#include <unistd.h>
//#include <linux/types.h>
//#include <linux/init.h>
//#include <linux/bug.h>
//#include <linux/err.h>
//#include <asm/io.h>
//#include <asm/page.h>
//#define _LINUX_IO_H
//#include <linux/types.h>|
Koodi:
|
C++:
|
During program startup, the equivalent of std::setlocale(LC_ALL, "C"); is executed before any user code is run.
Ainakin tällä hetkellä siellä on markup hieman sekaisin. Ylimääräisiä </a> tageja, sekä ainakin yksi ylimääräinen </div>Ei saakeli, edelleen tuolta löytyy popovereita, joiden leveys on väärä, vaikka olen määritellyt max-width: 100% !important; ja container: body (kuten SO:ssa opetettiin). Mitään logiikkaa en keksi, enkä myöskään sitä, miten näkisin noiden popovereiden CSS:n. Esimerkiksi Derlethin "Cthulhun jäljet" on väärin, kun yläpuolella oleva Delanyn Nova on oikein. Ei tuo edes tunnu oikein sisältöönkään liittyvän, milloin menee oikein ja milloin väärin.
E. Ainoa keino saada tuo toimimaan on laittaa min-width pikseleinä. Mutta näköjään tuota popoverin aktivointiokoodia ei sitten voi siirtää omaan tiedostoon vaan pitää kopipeistata tuo jokaiselle sivulle. Kun nimittäin yritin, niin lakkasi koko homma taas toimimasta.
Kiitän ja kumarranHei! Tuo _setmode() on tosiaan vain Windowsin komentoriviä koskeva asetus. Testasin koodia Fedora 34 linux ympäristössä, g++ 11.2.1 kääntäjällä ja gnome terminaalilla. Terminaalin asetuksissa on valittu järjestelmän vakio fontti (DejaVu Sans Mono?) ja merkistöksi Unicode - UTF-8. locale komennon ulostulo ja koodimuutos ovat:
Koodi:$ locale LANG=fi_FI.UTF-8 LC_CTYPE="fi_FI.UTF-8" LC_NUMERIC="fi_FI.UTF-8" LC_TIME="fi_FI.UTF-8" LC_COLLATE="fi_FI.UTF-8" LC_MONETARY="fi_FI.UTF-8" LC_MESSAGES="fi_FI.UTF-8" LC_PAPER="fi_FI.UTF-8" LC_NAME="fi_FI.UTF-8" LC_ADDRESS="fi_FI.UTF-8" LC_TELEPHONE="fi_FI.UTF-8" LC_MEASUREMENT="fi_FI.UTF-8" LC_IDENTIFICATION="fi_FI.UTF-8" LC_ALL= C++:#include <iostream> #include <locale> int main() { std::setlocale(LC_CTYPE, ""); wchar_t abc[] = L"abcdefghijklmnopqrsštuvwxyzžåäö"; wchar_t ABC[] = L"ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ"; int j = std::wcslen(abc); for (int i = 0; i < j; i++) { std::wcout << abc[i] << ABC[i]; } }
std::setlocale() tyhjällä merkkijonolla asettaa ympäristön vakio kielen ja alueen muotoilun. LC_CTYPE llä asetetaan merkistön tyyppi. Tuohon tyhjän merkkijonon tilalle voi laittaa jonkun UTF-8 tyypin, jos järjestelmän vakio ei ole UTF-8 tyyppinen kuten minulla oli.
Edit: std::setlocale - cppreference.com Tuolta löytyi tieto miksi tuo locale pitää käsin asettaa koodissa:
Tietäisikös joku neuvoa jotain hyvää itseopiskelumateriaalia microservices-arkkitehtuureista? Microservices-arkkitehtuurin pohjalta rakennettu verkkopalvelu siis kiinnostaa. Verkkosivujen backendin rakentaminen esim. jonkun php-kielellä toteutetun MVC-kirjaston varaan on enemmän tai vähemmän tuttua, mutta microservices-periaatteella rakennettu verkkopalvelu ei.
Hei! Tuossa tehtävässä taitaa olla tarkoitus tutustua listoihin. Luo tyhjä lista loopin ulkopuolella ja täytä sitä loopin sisällä sitä mukaa kun käyttäjä antaa arvoja. Keskiarvolle taitaa löytyä suoraan valmis metodi listatyypistä.Pieniä pulmia koulun tehtävien kanssa (koulun kalvoista ei mitään apua), eli pitäs tehdä tämmöinen tehtävä:
Yritin tuonne (vanhan tehtävän pohjalle jossa laskettiin syötettyjen lukujen neliöt) pohjalle tehdä tuota uudempaa tehtävää mutta en saa toimimaan tuonne while loopissa sitä että lasketaan keskiarvo ja sitä mukaa kun käyttäjä lisää numeroita keskiarvo muuttuu. Eli loopissa täytyy säilyttää arvot ja ne päivittyy sitä mukaa kun käyttäjä lisää numeroita.Create a program which is able to calculate and output (as double value, with 3 decimals) the
average value of the integer numbers given by the user. New numbers are asked until the user
enters a negative value, for example -1.
Console.WriteLine("Give the first number to calculate average from or skip the whole thing by entering -1");
int n = Convert.ToInt32(Console.ReadLine());
while(n >= 0)
{
Console.WriteLine(n*n);
Console.WriteLine("Give a new number to calculate a square from or end with -1");
n = Convert.ToInt32(Console.ReadLine());
}
Tuo siis on se aiempi tehtävä esimerkkinä
Käytämme välttämättömiä evästeitä, jotta tämä sivusto toimisi, ja valinnaisia evästeitä käyttökokemuksesi parantamiseksi.