Segítség C-ből

Sziasztok,

Abszolút kezdő lennék ami a C-t illeti. Előtte object pascalban túrtam és kicsit át kell állítanom magam ehhez. Egy adott feladathoz kérném a segítséget, rávezetést, nagyon végső esetben megoldást.

Feladat:

Egy számokat tartalmazó vektorban határozza meg az első páros, illetve az első páratlan elem helyét!

Jelenleg odáig jutottam, hogy kiírja, hogy a vektor hányadik helyein szerepel páratlan/páros szám.
Íme:

int main()
{
int i, vektor[5]={2,5,25,66,54};

for (i=0; i<5; i++){

if (vektor[i] %2 != 0)

printf("Ez az elso paratlan szam ami %d. helyen szerepel!\n ", i+1);

else

printf("Ez az elso paros szam ami %d. helyen szerepel!\n ", i+1);

}

return 0;
}

Segítségeteket előre is köszönöm.
Próbálkoztam már while, do utasításokkal is. Lehet csak a feltételt nem tudom megadni normálisan.

Pufee

Hozzászólások

2db for ciklus es break ha megtaláltad..? Lehet rosszul értem mi a baj, de ha ez, akkor itt nem a C -vel van bajod hanem az algoritmusokkal! :)

int main()
{unsigned int i,flag;
int vektor[5]={2,5,25,66,54};

flag=i=0;while(i<5)
{

if ((vektor[i] %2 != 0)&& !(flag&1))
{// írd ki a páratlan szöveget, az indexet jegyezd meg
flag|=1;
}

if ((vektor[i] %2 == 0)&& !(flag&2))
{// írd ki a páros szöveget, az indexet jegyezd meg
flag|=2;
}

if((flag&3)==3)break;

i++;
}}

> Sol omnibus lucet.

10 perc mulva ugyis lesz aki begepeli a megoldast, aztan copy-paste, de addig is, C-tol fuggetlenul akar pascal-ban hogyan csinalnad? Merthogy nem a do -val meg a while-al meg az utasitasokkal van a baj hanem az algoritmussal. Pl valami ilyenre van szukseged:

voltparos=hamis
voltparatlan=hamis
a vektor minden X elemere
ha voltparos es voltparatlan => vege
ha X paros es nem voltparos
kiir X ; voltparos=igaz
ha X paratlan es nem voltparatlan
kiir X ; voltparatlan=igaz

vagy valami hasonlo, javitsd ahogy tetszik.
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.

Erősen a példádnál maradva:


$cat feladat.c 
int main()
{
    int i, j, k, vektor[5]={2,5,25,66,54};
    
    j=0;
    k=0;

    for (i=0; i<5; i++){

        if (vektor[i] %2 != 0 && j != 1) {
            printf("Ez az elso paratlan szam ami %d. helyen szerepel!\n ", i+1);
            j=1;
        }
        else {
            if (k != 1) {
                printf("Ez az elso paros szam ami %d. helyen szerepel!\n ", i+1);
                k=1;
            }
        }
    }

    return 0;
}

$ gcc feladat.c -o feladat
$./feladat 
Ez az elso paros szam ami 1. helyen szerepel!
Ez az elso paratlan szam ami 2. helyen szerepel!

c

Kicsit maskepp:

int main()
{
int i, p, vektor[5]={2,5,25,66,54};

p = vektor[0] % 2;
printf("Az elso %s szam 0 helyen szerepel!\n", p ? "paratlan" : "paros");

for (i=1; i<5; i++) {
if ((vektor[i] % 2) != p) {
printf("Az elso %s szam %d helyen szerepel!\n ", !p ? "paratlan" : "paros", i);
break;
}
}
return 0;
}

De mivel az 'illetve' az bolcsesz operator ;)


int main()
{
int vektor[5]={2,5,25,66,54};
printf("Az elso paros illetve paratlan szam 0 helyen szerepel!\n");

return 0;
}

szerk.: ez a 'code' formazo ize vajon miert nem mukodik?

Az érdekesség kedvéért csináld meg bit művelettel is!

Nekem is lenne egy kérdésem, ki, milyen módon fűzne össze "szabványos" (azaz NULL terminált) C stringeket úgy, hogy a végeredményben a NULL szeparáció is megmaradjon, azaz:
str1\0str2\0str3\0...

Ma kérdeztek tőlem ilyet, és bár voltak ötleteim, de valahogy éreztem, hogy kell lennie jobbnak is. :)

suckIT szopás minden nap! A javaisten bármikor lealázza a C-s webszervered grizzlyvel, pl.

Miről beszélünk?

Az snprintf(n, "%s\0%s", ...) azért nem jó, mert a formátum string közepén levő \0 karakternél abba fogja hagyni a formátum string olvasását, és a második paraméter stringet már nem is fogja nézni.

Az, amit idéztél, az meg arra vonatkozik, hogy az snprintf-nek a paraméterként adott n egy felső korlátot jelent, hogy hány byte-ot írhat a célterületre, és ebbe a célstring végére automatikusan odabiggyesztett \0 is beleértendő.

ndx=0;memset (nagy_string,0,nagy_str_hossz);
//
len=strlen(kis_string1);if(ndx+len>=nagy_str_hossz)goto EXIT;
memmove(&nagy_string[ndx],kis_string1,len);ndx+=len;ndx++;
//
len=strlen(kis_string2);if(ndx+len>=nagy_str_hossz)goto EXIT;
memmove(&nagy_string[ndx],kis_string2,len);ndx+=len;ndx++;
//
// és így tovább... Ha a kis_stringek száma
// ismert, akkor címük betehető egy tömbbe és szépen
// egy ciklusba meg lehet oldani. Menet közben ellenőrizni
// kell, hogy ndx ne legyen nagyobb nagy_str_hossznál.
// Ciklusban a goto helyett használható a break;
//

EXIT: ;

> Sol omnibus lucet.

na kezdődik... A GOTO egy utasítás. Használható.Van, ahol
javítja a láthatóságot. Például az általam fent írtakban is.
Ha szétszedem if..else utasításokra, akkor nézd meg hogy
mi lesz a kódból mondjuk 4 összfűzendő string után.
És mint írtam: ciklusban - break-elünk egyet, ami szintén
egy goto csak másképp hívják. Érdekes, hogy a break-et nem
utálják úgy.

> Sol omnibus lucet.

Néha kellhet. Én mondjuk még eddig mindig megvoltam nélküle, de elfogadom, hogy nem baj, hogy létezik. De attól még nem szép. Ahogy break-et sem illik túl gyakran használni ciklusban.
Viszont ha kezdőknek mutogatod még rászoknak. Az ő kódjukat meg tartsa karban az, aki rászoktatta őket... :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

huu deregnemprogramoltam.
tegyuk fel, hogy az elso elem nem '0' vagy a '0' tekintsuk parosnak.

int main()
{
int vektor[5]={2,5,25,66,54};
int i;
int b;

b = vektor[0]%2; // elso paros or paratlan ?

printf("az elso ");
if ( b==0 ) {
printf( "paros") ;
}
else {
printf( "paratlan");
}
printf(" szam a vektor 1. helyen figyel !") ;

// keressuk ami elter
for ( i=1 ; (i<5) && (vektor[i] %2 != b) ; i++);

// na volt olyan ?
if ( i == 5 ) {
printf ( "nincs " );
if ( b == 0 ) { printf( "paratlan"); }
else { printf ( "paros"); }
printf( " szam a vektorban !");
}
else {
switch b of {
case 0 : printf( "az elso paratlan szam a %d pozicioban figyel", i+1); break;
case 1 : printf( "az elso paros szam a %d pozicioban figyel", i+1); break;
default: break;
}
}

return 0;
}

"tegyuk fel, hogy az elso elem nem '0' vagy a '0' tekintsuk parosnak."

A 0 párosnak tekinthető, merthogy az. Ugyanis páros = osztható_kettővel. A 0 meg osztható.

Egyébként érdekes, hogy annak analógiájára, hogy a 0 se nem negatív, se nem pozitív, sokan levonják azt a (téves) következtetést, hogy a 0 se nem páros, se nem páratlan.

//FFFFFFFFFFFFFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUU

#include <stdio.h>

main(int argc, const char* argv[])
{
printf("%s",Az első helyen páros szám van: 2.);
printf("%s",A második helyen páratlan szám van: 5.);
reutrn(0);
}

Mivel ez a szál a C nyelv tanulásáról szól, megjegyeznék néhány apróságot, ami még nem szerepelt.

  1. A printf() függvény használatához a stdio.h-t be kell húzni
  2. A vektor méretét nem kell szögletes zárójelek között megadni, hogyha rögtön utána feltöltjük értékekkel
  3. A vektor méretének számítását érdemes a fordítóra bízni (ld. a lenti példát), mivel így nem szerepel többször az "5" mágikus szám (magic number)
  4. Érdemes elgondolkodni már ilyen egyszerű programok fejlesztésekor is a tesztelés mikéntjén. Igaz, ez már a fejlesztési módszertanok témája. Pl. ebben az esetben a szabványos kimenetet (standard output) fájlba át lehetne irányítani ( "./feladat >eredmeny.txt" vagy ha látni is akarod a kiírást + fájlba is legyen írva egyszerre: "./feladat |tee eredmeny.txt".
  5. Kell még egy elvárt eredmény is, amit kézzel vagy valamilyen más módszerrel mondjuk a referencia.txt-ben. tárolunk. Már csak össze kell hasonlítani a két fájlt: "diff -u -s referencia.txt eredmeny.txt". Aztán lehet gondolkodni azon, hogy követelmény-e, hogy más számsorokkal is jól működjön a program. Ezek lesznek a különböző tesztesetek, amikhez ugyancsak szükség lesz elvárt válaszra.

  6. Ha már a tesztelésnél tartunk, akkor érdemes kódlefedettséget (code coverage) is mérni, pl. a gcc "--coverage" kapcsolójával és a "gcov" eszközökkel. Fontos tudni, hogy 100% kódlefedettség amellett, hogy minden teszteset átment, még nem jelenti azt, hogy jól működik a program: a hiányzó feltételeket pl. nem találja meg.


#include <stdio.h>

#define ARRAY_SIZE(a)  (sizeof(a)/sizeof(*(a)))

int main() {
    unsigned int i;
    int vektor[] = { 2, 5, 25, 66, 54 };

    printf("A vektor %u elemet tartalmaz.\n", sizeof(vektor)/sizeof(*vektor));
    printf("A vektor %u elemet tartalmaz.\n", ARRAY_SIZE(vektor));
    for (i = 0; i < ARRAY_SIZE(vektor); i++) {
        printf("vektor[%u] = %i\n", i, vektor[i]);
    }

    return 0;
}

És a futtatás:


$ gcc -Wall -Wextra --coverage -O2 feladat.c -o feladat
$ ./feladat |tee eredmeny.txt
A vektor 5 elemet tartalmaz.
A vektor 5 elemet tartalmaz.
vektor[0] = 2
vektor[1] = 5
vektor[2] = 25
vektor[3] = 66
vektor[4] = 54
$ diff -u -s referencia.txt eredmeny.txt 
referencia.txt és eredmeny.txt fájlok azonosak
$ gcov feladat.c 
File 'feladat.c'
Lines executed:100.00% of 7
feladat.c:creating 'feladat.c.gcov'

$ gcc --version
gcc (Debian 4.4.5-2) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C# :)


using System;
using System.Linq;

class Program
{
  static void Main(string[] args)
  {
    var vektor = new[] { 2, 5, 25, 66, 54 };
    Console.WriteLine("első páros: {0}", Enumerable.Range(0, vektor.Length).First(idx => vektor[idx] % 2 == 0) + 1);
    Console.WriteLine("első páratlan: {0}", Enumerable.Range(0, vektor.Length).First(idx => vektor[idx] % 2 == 1) + 1);
  }
}

--
joco voltam szevasz

Szebb:


using System;
using System.Linq;

class Program
{
static void Main(string[] args)
{
var vektor = new[] { 2, 5, 25, 66, 54 }.ToList();
Console.WriteLine("első páros: {0}", (from v in vektor where v % 2 == 0 select vektor.IndexOf(v) + 1).First() );
Console.WriteLine("első páratlan: {0}", (from v in vektor where v % 2 == 1 select vektor.IndexOf(v) + 1).First() );
}
}

----------------------
while (!sleep) sheep++;

(el%2).zero? ? "os" : "atlan"

Argh.

Akkor már:


#!/usr/bin/perl

use strict;
use warnings;
use 5.10.0;
use List::MoreUtils qw(firstidx);

my @a = (2,5,25,66,54);

my %a = ("os" => '!($_ % 2)', "atlan" => '$_ % 2');

eval 'say "Első pár'.$_.' szám indexe: ".(1 + firstidx {'.$a{$_}.'} @a);' for (reverse sort keys %a);

(Ez megfelel annak, hogy nem csak lefestettük, de dinamittal fel is robbantottuk a bike shedet?)

Akkor már C++0x is:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool isOdd (int i) {
  return ((i % 2 ) == 1);
}

bool isEven (int i) {
  return ((i % 2 ) != 1);
}

int main() {
  vector v { 2, 5, 25, 66, 54 };

  vector<int>::iterator it = find_if(v.begin(), v.end(), isOdd);
  cout << "Első páratlan szám: " << *it << endl;
  cout << "Pozíciója: " << it - v.begin() << endl;

  it = find_if(v.begin(), v.end(), isEven);
  cout << "Első páros szám: " << *it << endl;
  cout << "Pozíciója: " << it - v.begin() << endl;

  return 0;
}

Fuszenecker Róbert

megkesve bar, de meg en is


module Main where

import Data.Maybe

main :: IO ()
main = let v = [1, 3, 5, 4, 9] in do
    putStrLn $ "Elso paros indexe : "    ++ show (findIdx even v)
    putStrLn $ "Elso paratlan indexe : " ++ show (findIdx odd v)
    where
        findIdx prop = listToMaybe . map snd . filter (prop . fst) . flip zip [1, 2..]

==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.

Házifeladat? Beadandó?
--
unix -- több, mint kód. filozófia.
Life is feudal

subscribe
---------------------------------------------------
Talisker Single Malt Scotch Whisky aged 10 years :)