Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravim,
napsal jsem tři přiklady do C ale ve vysledku mi to haše jiny vysledek než by mělo a vubec nevim kde mam chyvu:
přikald 1
Zadanim je napsat řetezec a vypsat řtezec bez opakovani slov
když zadam např. aaaaaaaaddddddddeeeeeeeeee tak by mi to melo vypsat "ade" ale me to vypiše "aaddee" což by němelo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *rozsahStr (int n){
char *p;
p=(char*)malloc(sizeof(char)*n);
return p;
}
void bezOpak (char p[]){
int i, m, j, d=strlen(p);
char zn;
for (i=0; i<d; i++){
zn=p[i];
for (m=i+1; m<d; m++)
if (p[m]==zn) {
for (j=m; j<=d; j++) p[j]=p[j+1];
d=strlen(p);
}
}
}
int main(void) {
char *str, n;
printf ("Zadejte pocet znaku, ktere bude retezec obsahovat: ");
scanf ("%d",&n);
str=rozsahStr(n);
printf("Zadej retezec:\n");
scanf ("%s",str);
bezOpak(str);
printf("\nRetezec bez opakovani znaku:\n");
printf ("%s",str);
printf ("\n");
system("PAUSE");
return 0;
}
přiklad 2
Napište funkci, která ze dvou množin kladných čísel daných prvními dvěma parametry vytvoří v poli daném třetím parametrem množinu, která je sjednocením množin daných prvními dvěma parametry.
#include <stdio.h>
#include <stdlib.h>
void seradPole (int p[], int d){
int i, m, min=0, pom;
for (m=0; m<d; m++){
min=m;
for (i=m+1; i<d; i++) if (p[i]<p[min]) min=i;
if (min!=m){
pom=p[m];
p[m]=p[min];
p[min]=pom;
}
}
}
void sjednoceni (int p[], int p2[], int p3[]){
int i=0, d1=0, d2=0, j=0, t=0;
while (p[d1]!=0) d1++;
while (p2[d2]!=0) d2++;
seradPole(p,d1);
seradPole(p2,d2);
while ((p[i]!=0) && (p2[j]!=0)){
if (p[i]<p2[j]) {
p3[t]=p[i];
i++;}
else{
p3[t]=p2[j];
j++;}
t++;
}
if (p[i]==0){
while (p2[j]!=0){
p3[t]=p2[j];
j++; t++;}
}
else{
while(p[i]!=0){
p3[t]=p[i];
i++; t++;}
}
p3[t]=0;
}
int main(void) {
int i, pole1[100], pole2[100], pole3[200];
printf ("Zadejte 1. serii hodnot zakoncenou 0\n");
for (i=0; i<100; i++){
scanf("%d",&pole1[i]);
if (pole1[i]==0) break;}
printf ("Zadejte 2. serii hodnot zakoncenou 0\n");
for (i=0; i<100; i++){
scanf("%d",&pole2[i]);
if (pole2[i]==0) break;}
sjednoceni (pole1, pole2, pole3);
printf ("\n");
for (i=0; pole3[i]!=0; i++) printf (" %d ",pole3[i]);
printf ("\n");
system("PAUSE");
return 0;
}
zadam třeba do prvni množiny "1 2 3 0" a do druhy "1 2 4 0" tak by se ta 1 a 2 nemela opakovat v te vysledny ale me se opakuje..
Přiklad 3
Předchozí příklad řešte za předpokladu, že množiny jsou v polích reprezentovány rostoucími posloupnostmi. Funkce pro vytvoření sjednocení musí mít lineární složitost.
#include <stdio.h>
#include <stdlib.h>
void sjednoceni (int p[], int p2[], int p3[]){
int i=0, j=0, t=0;
while ((p[i]!=0) && (p2[j]!=0)){
if (p[i]<p2[j]) {
p3[t]=p[i];
i++;
}
else {
p3[t]=p2[j];
j++;
}
t++;
}
if (p[i]==0){
while (p2[j]!=0){
p3[t]=p2[j];
j++; t++;}
}
else{
while(p[i]!=0){
p3[t]=p[i];
i++; t++;}
}
p3[t]=0;
}
int main(void) {
int i, pole1[100], pole2[100], pole3[200];
printf ("Zadejte 1. serii hodnot zakoncenou 0\n");
for (i=0; i<100; i++){
scanf("%d",&pole1[i]);
if (pole1[i]==0) break;}
printf ("Zadejte 2. serii hodnot zakoncenou 0\n");
for (i=0; i<100; i++){
scanf("%d",&pole2[i]);
if (pole2[i]==0) break;}
sjednoceni (pole1, pole2, pole3);
for (i=0; pole3[i]!=0; i++) printf ("%d ",pole3[i]);
printf ("\n");
system("PAUSE");
return 0;
}
a tady je stejny problem jak u toho druhyho přikladu.
Mohli by jste se na to mknout a podivat se kde je tam chybu, ja na to nemužu přijit..:(
Diky
Offline

V tom prvnim co treba misto tohoto:
for (m=i+1; m<d; m++)
if (p[m]==zn) {
for (j=m; j<=d; j++) p[j]=p[j+1];
napsat tohle:
while (p[i+1]==zn) {
for (j=i+1; j<=d; j++) p[j]=p[j+1];
Dalo se to napsat i efektivneji ale nechci ti do rypat :-) Netestoval jsem to, tak kdyztak dej vedet, jestli to funguje.
Mozna se podivam i na ty dalsi.
Offline
↑ Lumikodlak:
Jo,
ted to dunguje spravě. Diky moc. Kdyby jsi mel čas se jeste mrknout na ty druhy :).
Jsem v C tak trochu ješte novaček tak je možne že to pišu jinak než by bylo lepši to napsat efektivněji.
Diky
Offline

Jak tam mas tu podminku:
if (p[i]<p2[j]) {
p3[t]=p[i];
i++;}
else{
p3[t]=p2[j];
j++;}
Tak musi brat v uvahu i pripad, kdy p[i] a p2[j] jsou stejna. Takhle napriklad kdyz obe jsou 1, tak p2[j] se sice posune dal, ale v p[i] ti porad zustane ta jednicka, takze v pristim kroku se ulozi do p3 znova jednicka.
Dalo by se to upravit treba takhle:
if (p[i]<p2[j]) {
p3[t]=p[i];
i++;}
else{
p3[t]=p2[j];
if (p[i]==p2[j])i++;
j++;}
t++;
Offline
↑ Lumikodlak:
Diky moc za rady a pomoc asi bych na to nepřišel, čuměl jsem na to ješte s kamošem a nemohli jsme to tam najit.Diky
Ješte by jsme potřebovali poradit s kamošem s timhle:
1.je zadana posloupnost 100 cisel..pak prvky pole serad tak aby zacatek poslopnosti tvorily nezaporna cisla a pak aby byly uz jen zaporna
2.najdi v posloupnsoti min, které se tam objevuje 2x.
napadlo nas že u toho prvniho by jsme je načetli nebo udělat to s desitkou a pak ji přepsat na 100.seřadili by jsme je BubbleSortem ale nevime jestli by to bylo dobře nebo jak to vubec napsat.
a u ty 2 nevime vubecm.
mohl by jsi nam nějak poradit jak začit, jak to napsat nebo pisni na d12@centrum.cz tam by jsme se poradili:)
Diky moc za tvuj čas
Offline

↑ DeMidix:
U te 1. moc nerozumim tomu zadani, ma to byt cele setridene - od nejvetsiho po nejmensi, nebo staci na zacatek dat nezaporna a na konec zaporna? Kazdopadne bublesort by podle me vyresil oba pripady, i kdyz pro ten jednodussi pripad to jde napsat jednoduseji.
U te 2. jestli se ma najit nejmensi prvek, ktery je tam dvakrat, tak to by slo treba tak, ze bys to nejdriv cele setridil a pak sel od nejmensiho a nasel dve stejna cisla za sebou.
(ale nevim, jestli jsem spravne pochopil ty zadani)
Offline
↑ Lumikodlak:
U ty 1 to ma byt tak že mam danou posloupnost 100, čili si asi ty čisla načtu a pak je seřadim do pole tak aby tvořili posloupnost a nejdřiv aby byla posloupnost zapornych čisel a potom posloupnost nezapornych čisel.
napadlo mě že bych to nědělal tak že bych si načital každy čislo do 100, na začatku bych to omezil, že zadam čisla n(posloupnost) kde max počet bude 100 (n <= 100).Pak bych je seřadil do toho pole..
třeba
int prectiPrvky(int pole[100]) {
int i = 0;
int pocet;
printf("Vlozte pocet cisel n: ");
scanf("%d", &pocet);
if(pocet > 100) {
printf("Muzete vlozit maximalne 100 cisel");
}
else {
printf("Nyni vlozte %d cisel: ", pocet);
}
for(i = 0; i < pocet; i++) {
scanf("%d", &pole[i]);
}
return pocet;
}
jen nevim jak to napsat tak aby nejdřiv posloupnost začinala nezapornyma čislama a pak už jen zapornyma..to nevim jak na to..
a u ty 2.
napsal jsem zdrojak že zadam posloupnost čisel n(n <= 100) a že mi to najde nejmenši čislo a vypiše kolikrat v dane posloupnosti je obsazeno....Ale ja bych potřeboval najit nejmenši čislo ktery je tam dvakrat...např mam 1 2 2 3 4 5 6 7 tak to vypiše nim je 2 a je tam 2-krat...jenže u toho myho by to vypsalo ze nim je 1 a je tam 1-krat....Tak potřebuju najit ten druhy zpusob..
Offline

Porad nejak nemuzu pochopit to prvni zadani :-)
Kdyz zadas treba cisla -2 4 7 3 -1 0 -6 tak nevim, ktere z nasledujicich to ma vypsat:
tohle?
-2 -1 -6
4 7 3 0
nebo tohle?
-6 -2 -1 0 3 4 7
nebo tohle?
7 4 3 0 -1 -2 6
(nebo oba dva predchozi pripady?)
nebo tohle?
-6 -2 -1
0 3 4 7
Radsi primo napis, co by to melo vypsat u tech cisel co jsem psal.
Offline
↑ Lumikodlak:
když zadam třeba -2 4 7 3 -1 0 -6
tak by to mělo vypsat tohle 0 3 4 7 -6 -2 -1 (nejdřive posloupnost nezapornych a pak zapornych)
tedy:
-6 -2 -1
0 3 4 7
jen v opačnem pořadi..
Offline

Hmm, to je zajimave :-)
Nejjednodussi moznost je asi: normalne nacist ty cisla jako integer, a potom s nima pocitat jako 'unsigned' - cili nezaporna cisla. Takze je setridis jako unsigned od nejmensiho po nejvetsi, a pak je zas vypises jako normalni integer se znamenkem. Ten kod by mohl vypadat nejak takhle:
int prectiPrvky(int pole[100]);
void setridVzestupne(unsigned pole[], int Pocet);
void vypisPrvky(int pole[], int Pocet);
...
main(){
...
n = prectiPrvky(pole);
setridVzestupne((unsigned*)pole, n);
vypisPrvky(pole, n);
...
Je to mozne proto, ze x86 procesory (i nektere jine) pouzivaji 'Two's complement' (je to tam az trochu nize).
Ale nejsem si jisty, jestli je to korektni, a jestli to takhle muzete psat, nebo co jste se ucili. Jestli se ti to nezda, tak rekni. Jine moznosti nebudou o moc slozitejsi nez tohle.
Offline
↑ Lumikodlak:
Tak musim řict že ten integer a unsigned je pro mě novinka s tim bych to asi nezvladl napsat..
Zkusil jsem to takhle:
#include <stdio.h>
#include <stdlib.h>
#define max 4
int serad(int *pole, int n)
{
int m;
int i, k, j, pom;
printf("Inicializace: \n");
for (i=0;i<n;i++)
printf("%2i ",pole[i]);
for (k=1; k<n; k++)
{//průchod pole pro každý prvek
for (j=n-1; j>=k; j--)
{ // hledání všech následujících prvků
if (pole[j-1]>=pole[j])
{ //je-li předchůdce větší než aktuální prvek --> záměna
pom=pole[j-1];
pole[j-1]=pole[j];
pole[j]=pom;
}
}
}
printf("\nSerazene: \n");
for (i = 0; i < n; i++) //výpis pole po porovnání jednoho prvku
printf("%2i ",pole[i]);
}
int main(void)
{
int pole[max]={2,3,1,5};
serad(pole,max);
printf("\n\n");
system("PAUSE");
return 0;
}
jako že bych to dal natvrdo do pole..Ale vyučujici je zase haklivej na ty pole, že to moc nema rad, takhle "natvrdo".. ale stejně mi to nezeřadi tak jak by mělo..nejdřiv nezaporna a pak zaporna..sakra :D
Offline
↑ DeMidix:
A jak bych tam ješte zakomponoval do toho myho programu do toho pole ješte zaporna čisla?..pač když je tam zadam tak mi to hlasi chybu..
Offline

S tim unsigned stacilo by prepsat:
if (pole[j-1]>=pole[j])
na toto:
if ((unsigned)pole[j-1]>=(unsigned)pole[j])
ale vyucujicimu by se to nemuselo libit no, to nevim.
Co se mu nelibi na tom poli? To spis ze bys mel pouzit malloc? Nebo seznam?
Jinak dalo by se to napsat podobne:
...
printf("\nSerazene: \n");
for (i = 0; i < n; i++) //výpis kladnych
if(pole[i]>=0) printf("%2i ",pole[i]);
for (i = n-1; i >= 0; i--) //vypis zapornych
if(pole[i]<0) printf("%2i ",pole[i]);
...
Ale vyucujicimu by se to take nemuselo libit :-)
Jestli ani to predchozi neni ok, tak bude potreba nejspis vytvorit si dalsi pole a do nej ty cisla postupne ulozit, podobne jak jsem psal nejdrive ten vypis kladnych a pak zapornych, a pak je vypsat.
Offline

↑ DeMidix:
Kde to hlasi chybu? Pri kompilaci, nebo pri spusteni? Neni problem v tom, ze 'max' mas definovane jako 4, a pak tam pridas dalsi cisla:
int pole[max]={2,3,1,5,-1,-4};
takze pak jich je tam treba sest a do ctyr se nevejdou uz?
Offline
↑ Lumikodlak:
Ju, mas pravdu..ja jsem vul..pak jsem na to ppřišel že tam mam max 4 a v poli vic čisel než 4.. Ale jinak to docela jde ne..
a co k ty 2, vedel by jsi neco?
Dik
Offline

No k te dvojce napriklad - Kdyz uz mas to pole cele setridene, tak to budes vypisovat podobnym zpusobem jako:
printf("\nMin 2x: \n");
for (i = 0; i < n - 1; i++){
if (pole[i] == pole[i+1]){
printf("%2i ",pole[i]);
break;
}
}
Offline