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
- 6314 megtekintés
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! :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
(töröltem)
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
Ezt a módszert ki fogom próbálni!
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ez tényleg működik, de még fel kell fognom. Bár eléggé egyértelműnek tűnik. mindig csak bonyolítom magamnak a dolgokat :(
- A hozzászóláshoz be kell jelentkezni
Azért lásd, hogy ez nem egy szép kód. Meditor megoldása tisztább, sztenderdebb, mert ő elrugaszkodott a rossz példától. Ha nem kell gyors kód, akkor egyszerűt kell írni: ezt itt neked 2db független ciklussal kellene megoldani.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Szerintem a tab karakterek helyett space-t kéne használni.
Nem tudom milyen szövegszerkesztőben/ide-ben írtad, de szinte biztos, hogy át lehet állítani, hogy a tab karakterek helyett space-eket szúrjon be amikor tab-ot nyomsz. Prog.hu-n ez meg szokta oldani a dolgot.
- A hozzászóláshoz be kell jelentkezni
A ket kicsi kezemmel irtam bele egyenest a hup.hu-ba, es akkor meg jol nezett ki.
- A hozzászóláshoz be kell jelentkezni
Az érdekesség kedvéért csináld meg bit művelettel is!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
char force = malloc(strlen(s1)+1+strlen(s2)+1);
memcpy(force,s1,strlen(s1)+1);
memcpy(force+strlen(s1)+1,s2,strlen(s2)+1);
use the force luke!
- A hozzászóláshoz be kell jelentkezni
Ilyesmivel (ciklusban) álltam elő én is, de ennél szebb/jobb/egyszerűbb (pld. snprintf-szerű megoldás hossz és nem \0 "véggel") tényleg nincs?
Köszi.
suckIT szopás minden nap! A javaisten bármikor lealázza a C-s webszervered grizzlyvel, pl.
- A hozzászóláshoz be kell jelentkezni
snprintf(strlen(a)+strlen(b)+2,"%s\0%s\0",a,b)
Vagy ez nem jó? :)
- A hozzászóláshoz be kell jelentkezni
Hmmmm,
"The functions snprintf() and vsnprintf() write at most size bytes (including the trailing null byte ('\0')) to str."
- A hozzászóláshoz be kell jelentkezni
sprintf("%s%c%s%c%s", str1, 0, str2, 0, str3);
megfelel?
- A hozzászóláshoz be kell jelentkezni
Lehet hogy rosszul értelmezem, de nem az van, hogy including the trailing null byte ('\0')
- A hozzászóláshoz be kell jelentkezni
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ő.
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
Hasznalni viszont csak ugy lehet az eredmenyt, ha az 'osszes-hosszt' elteszed egy valtozoba.
- A hozzászóláshoz be kell jelentkezni
Erről már nem szólt a kérdés :)
- A hozzászóláshoz be kell jelentkezni
Azt ugye tudod, hogy az strlen minden híváskor végigcaplat a stringen?
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Szerintem ne GOTO-zzunk egy kezdő topikban... (Van aki szerint sehol.)
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
"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.
- A hozzászóláshoz be kell jelentkezni
Minden szám osztható kettővel. A kérdés, hogy mennyi a maradék :)
- A hozzászóláshoz be kell jelentkezni
Pl 5-tel és 17-el, igaz? :)
- A hozzászóláshoz be kell jelentkezni
Ez OK, de ha csak azt mondom, hogy a osztható b-bel, akkor az definíció szerint azt jelenti, hogy 0 a maradék. Nemigen kell hozzátenni, hogy maradék nélkül osztható.
- A hozzászóláshoz be kell jelentkezni
//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);
}
- A hozzászóláshoz be kell jelentkezni
gratulálok.
- A hozzászóláshoz be kell jelentkezni
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.
- A printf() függvény használatához a stdio.h-t be kell húzni
- 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
- 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)
- É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".
- 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.
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.
#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.
- A hozzászóláshoz be kell jelentkezni
"Nyugtass meg hogy nem az iparban dolgozol" ;-)
- A hozzászóláshoz be kell jelentkezni
Ha az iparban nem ilyet kapnék, akkor visszadobnám: "leülhet, egyes".
Egy kódnak így kell kinéznie.
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ez példaértékű volt. Tanár vagy?
c
- A hozzászóláshoz be kell jelentkezni
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);
}
}
- A hozzászóláshoz be kell jelentkezni
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++;
- A hozzászóláshoz be kell jelentkezni
Akkor már Perl: ;)
#!/usr/bin/perl
use strict;
use warnings;
use 5.10.0;
use List::MoreUtils qw(firstidx);
my @a = (2,5,25,66,54);
say "Első páros szám indexe: " .( 1 + firstidx {!($_ % 2)} @a);
say "Első páratlan szám indexe: ".( 1 + firstidx { $_ % 2 } @a);
- A hozzászóláshoz be kell jelentkezni
Nice! De pont az ilyen kriksz-krakszos kódolás miatt nem szeretem a perl-t :(
- A hozzászóláshoz be kell jelentkezni
Ez nem optimális, mert kétszer keres a vektorban :)
- A hozzászóláshoz be kell jelentkezni
Akkor már Ruby is! ;)
arr = [2, 5, 25, 66, 54]
flags = []
arr.each_with_index{|el, i|
flags[el%2] ||= (puts("első pár%s @ %d" % [(el%2).zero? ? "os" : "atlan", i += 1]); true)
}
- A hozzászóláshoz be kell jelentkezni
(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?)
- A hozzászóláshoz be kell jelentkezni
Hát pont erre gondoltam, az egyszerű programozási kérdésekre mindig jön egy rakat megoldás, és ha már verseny, akkor legyen érdekes :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Házifeladat? Beadandó?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
subscribe
---------------------------------------------------
Talisker Single Malt Scotch Whisky aged 10 years :)
- A hozzászóláshoz be kell jelentkezni