Olisi tuossa tarkoituksena saada tehtyä ohjelma joka kysyy henkilötunnuksen (11 merkkiä muodossa 090675-678X) . Tunnuksen viimeinen merkki määräytyy seuraavalla säännöllä. Ohjelma tutkii syötetyn tunnuksen oikeellisuuden ja ilmoittaa, onko tunnus oikea vai ei.
Tarkistusmerkki on numero tai kirjain. Se saadaan jakamalla syntymäajan ja yksilönumeron muodostama yhdeksännumeroinen luku 31:llä, jolloin tarkistusmerkki määräytyy jakojäännöksen mukaan seuraavasti:
Jakojäännös Tarkistusmerkki
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 A
11 B
12 C
13 D
14 E
15 F
16 H
17 J
18 K
19 L
20 M
21 N
22 P
23 R
24 S
25 T
26 U
27 V
28 W
29 X
30 Y
OLISIKO neuvoja tämän ohjeman toteutukseen?
-kitos kaikille hyvän vastauksen antajille-
Tarkistusmerkki on numero tai kirjain. Se saadaan jakamalla syntymäajan ja yksilönumeron muodostama yhdeksännumeroinen luku 31:llä, jolloin tarkistusmerkki määräytyy jakojäännöksen mukaan seuraavasti:
Jakojäännös Tarkistusmerkki
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 A
11 B
12 C
13 D
14 E
15 F
16 H
17 J
18 K
19 L
20 M
21 N
22 P
23 R
24 S
25 T
26 U
27 V
28 W
29 X
30 Y
OLISIKO neuvoja tämän ohjeman toteutukseen?
-kitos kaikille hyvän vastauksen antajille-
Vastaukset 24
Vanhimmat
Miten ois että teet 31 merkkisen char-taulukon ja jaat tuon 9 numeroisen luvun 31:llä, otat taulukosta merkin jakojäännöksen osoittaman indeksin kohdalta?
Se, että se tarkastaa onko annettu tunnus OK? Olisiko koodia, jolla toteutta tuo, kun tämän tytön taidot eivät siihen riitä??
jollei taitosi riitä siihen ? Sulla nousee tie kuitenkin pystyyn seuraavassa tehtävässä...
#include
int main(void)
{
const char * p ="0123456789ABCDEFHJKLMNPRSTUVXY";
char s[20];
scanf("%s",&s);
char tark= toupper(s[10]);
memmove(&s[6],&s[7],4);
s[9]='\0';
int stun=atoi(&s);
if (p[stun % 31]==tark) printf("Tarkiste oikein"); else printf("Tarkiste väärin");
return 0;
}
skratta inte!
Hyi sinua teet karhunpalveluksen vaan tekemällä liian valmista ;)
sehän on vielä pahasti kesken:)
Kaivataan lisätietoa kyseisestä ohjelmasta, kun tämän tytön taidot ovat aika rajalliset! Tuo edellinen koodinpätkä tuotti kolme erroria! ;)
mitä virheitä?
täällä. Et opi mitään, jos et itse viitti.
Sorry vaan.
Jos tulee tämän tapaisia virheitä(mulla borland): "Warning W8065 test.c 12: Call to function 'toupper' with no prototype in function main", niin kyse on siitä ettei kääntäjä tiedä mistä kyseinen funktio löytyy.
Olkoonkin yksi kotitehtävä etsiä noiden vaatimat header-tiedostot ;) Vinkki: Google
Sitten toinen juttu mistä kääntäjäni itki oli että eräiden muuttujien esittely oli väärässä paikassa. elikkä: "Declaration is not allowed here in function main" ja rivinnumero.
Ratkaisu: siirrä kyseisten muuttujien esittely mainin alkuun missä muutkin esittelyt on. Jätä kuitenkin muuttujien asettaminen entiselle paikalleen.
Tiedoksi että tuo koodi ei ole kovinkaan kaunista, antaisin sille arvosanaksi ehkä 2...se esimerkiksi kaatuu kun käyttäjä antaa vääränlaisia syötteitä.
Unohda koko esimerkkikoodi. "Jätkät kusettaa sua" tekstillä voi kuvata ko koodia.
En kirjoita ratkaisua, sillä pelkästään kopioimalla et opi ohjelmointia. Mieti mahdollista ratkaisuun johtavaa toteutusta, kokeile, lue teoriaa ja ohjeita. Ja ennen kaikkea, hanki sellainen kääntäjä joka sisältää online helpin ja opettele käyttämään sitä. on tärkein näppäin aloittelevalle ohjelmoijalle - ja myös kokeneelle.
Sen verran kuitenkin hellyn, että kirjoitan muutaman vihjeen erääksi ratkaisuksi.
- Tee taulukko johon sijoitat tutkittavan sotun
- Tee valmiiksi alustettu taulukko sos.turvanumeron tarkistusmerkeistä (onko esimerkissäsi 31. merkki oikein?)
- Määrittele osoitin merkkijonomuuttujaan. Myöhemmin luet tutkittavan sotun merkit, - ilman 7. -merkkiä -, tämän muuttujn arvoksi.
- Valitse sotu-taulukosta 11. merkki [10] erillisen char-muuttujan arvoksi
- Lue kahdella for-silmukalla sotun merkit 1..6 ja 8..10 merkkijonomuuttujaan
- Muuta merkkijonomuuttuja pitkäksi luvuksi atol() funktiolla
- Laske edellä muodostetusta luvusta 31:n jakojäännös
- Vertaa jakojäännöstä sotun 11. merkkiin
- Vertailun perusteella näet onko tunnus muodostettu oikein
kääntyi c:llä c :lla 3 virhettä.
lisäksi W puuttuu
mihinkäs laskun voisi lähettää vai meneenkö se koulun piikkiin ;)
C :lla tosiaan!!
Ei se ole ongelma jos ekalla käännöksellä tulee muutama virhe, siinä koneessa on näppäimistö, jolla virheet voi korjata. Se on ohjelmoijan jokapäiväistä työtä korjata kääntäjän _kohteliaasti_ selväkielisesti ilmoittamia virheitä. Kai sitä nyt tytöilätäkin voi odottaa edes jonkin sortin yrittämistä.
...turhanpäiväiset kommentit ja mielipiteet voi esittää jossain muualla kuin tässä ketjussa!!
Jos kysyttän apua, vastataan siihen ja jätetään turhat nälvimiset pois!
mutta tässä tapauksessa joku teettää vanhaa
ohjelmoinnin opiskelun perusteisiin liittyvää
tehtävää täällä eli lunttaa.
Tai sitten kyseinen "Jaana" on pelkkä provo,
missä hän hyvin onnistui.
Muuten vastataan, kun kysytään ja ei kait sitä
nyt aina tartte olla niin pipo tiukalla.
Kumpi oli suurempi provo 'Jaana'n kysymys, vai 'cee'n siihen ehdottama ratkaisukoodi?
Jos Jaana teettää täällä jotain töitänsä?!
Se ei varmaan oikeuta muita nälvimään siitä!
Mielestäni kysymykseen voi vastata, mutta ei ruveta arvostelemaan kyselijän motiiveja yms.!
cee:n koodi dokumentoimatonta spagettia.
Eli ei sillä kylläkään mitään pisteitä
olis mistään tullut.
Onhan se hienoa, että ohjelmoimaan opetteleva
kopioi vastaukset täältä.
Perin juurin Cool.
On tyhjänpäivästä pelleilyä alkaa vaatimaan
sukuselvitystä, motiivia tai murehtia vastaajien "karhunpalveluksia" jos joku vaivautuu kirjoittamaan asiallisen kysymyksen palstalle. FLUG-maailma on asia erikseen, siellä on rikollista kysyä palstoilla asiaa, johon joku on jossain päin maailmaa vastannut joskus historiassa tai kysyä ratkaisua ongelmaan, jota et ole itse miettinyt vähintään viittä vuotta...:)
Jopa kakkosen ? Aika paljon, ellei mitta-asteikko ole 1-10 ..
esimerkiksi sotu 999999-999e menee läpi!
Elikkäs 2 on hieman liikaa, vai onko 99 mätäkuu?
Ei mene läpi ellei viimeinen merkki ole f(=15)!
9999999991==15;