Witam!
Mój problem polega na tym, że po uruchomieniu poniższego kodu z parametrem startowym raz na pare uruchomień zmienia się jakaś obliczona dana oraz wyskakuje komunikat, że program przestał działać. Prosił bym o zweryfikowanie kodu i podanie przyczyny. Mógłbym zostawić tak ten program, ale zależy mi na tym aby poprawnie nauczyć się programować i w przyszłości nie popełniać podobnych błędów. Ogólnie w programie chodzi o to aby obliczył średnią dł. wyrazów, wariacje itd. z długości wyrazów w 2 wariantach:
1- z wszystkich wyrazów,
2- powtarzający wyraz jest brany pod uwagę jednokrotnie.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int DlWyrazu = 0;
float srdl = 0;
float wariacja = 0;
float mediana = 0;
void analiza(char* wyraz)
{
for (unsigned int i = 0; i < (unsigned int)strlen(wyraz);i++)
{
if (wyraz[i] == 'q' || wyraz[i] == 'w' || wyraz[i] == 'e' || wyraz[i] == 'r' || wyraz[i] == 't' || wyraz[i] == 'y' || wyraz[i] == 'u' || wyraz[i] == 'i' || wyraz[i] == 'o' || wyraz[i] == 'p' || wyraz[i] == 'a' || wyraz[i] == 's' || wyraz[i] == 'd' || wyraz[i] == 'f' || wyraz[i] == 'g' || wyraz[i] == 'h' || wyraz[i] == 'j' || wyraz[i] == 'k' || wyraz[i] == 'l' || wyraz[i] == 'z' || wyraz[i] == 'x' || wyraz[i] == 'c' || wyraz[i] == 'v' || wyraz[i] == 'b' || wyraz[i] == 'n' || wyraz[i] == 'm' ||
wyraz[i] == 'Q' || wyraz[i] == 'W' || wyraz[i] == 'E' || wyraz[i] == 'R' || wyraz[i] == 'T' || wyraz[i] == 'Y' || wyraz[i] == 'U' || wyraz[i] == 'I' || wyraz[i] == 'O' || wyraz[i] == 'P' || wyraz[i] == 'A' || wyraz[i] == 'S' || wyraz[i] == 'D' || wyraz[i] == 'F' || wyraz[i] == 'G' || wyraz[i] == 'H' || wyraz[i] == 'J' || wyraz[i] == 'K' || wyraz[i] == 'L' || wyraz[i] == 'Z' || wyraz[i] == 'X' || wyraz[i] == 'C' || wyraz[i] == 'V' || wyraz[i] == 'B' || wyraz[i] == 'N' || wyraz[i] == 'M')
{
DlWyrazu++;
}
else { wyraz[i] = '\0'; }
}
}
void obliczanieParam(int* string,int wyr) {
int wy = wyr;
// srednia wyrazow
int dl = 0;
for (int i = 0;i < wy;i++) {
dl = dl + string[i];
}
srdl =(float) dl / wy;
// wariacja
float mian = 0;
for (int i = 0; i < wy ;i++) {
mian = mian + (((float)string[i] - srdl)*((float)string[i] - srdl));
}
wariacja = mian / wy;
// uporzadkowanie
int t = 0;
for (int j = 0; j < wy; j++) {
for (int i = 0; i < wy; i++) {
if (string[i] > string[i + 1]) {
t = string[i];
string[i] = string[i + 1];
string[i + 1] = t;
}
}
}
int aa = (wy / 2) - 1;
int bb = (wy / 2);
if (wy % 2 == 0) {
mediana = ((float)string[aa] + (float)string[bb]) / 2;
}
else mediana = string[bb];
}
int main(int argc, char *argv[])
{
// zmienne:
FILE * plik;
FILE * plik1;
char nazwa[15];
char bufor[80];
char bufor2[80];
char bufor3[80];
int licz = 0;
int cmp = 0;
int rozmiar1 = 0;
int * StringWyr1 = malloc(rozmiar1 * sizeof(int));
int rozmiar2 = 0;
int * StringWyr2 = malloc(rozmiar2 * sizeof(int));
// otwieranie pliku:
if ((plik = fopen(*++argv, "r+")) == NULL)
{
printf("\n\t Nie ma takiego pliku!\n");
printf("\n\t Podaj nazwe pliku:\t");
scanf("%s", &nazwa);
if ((plik = fopen(nazwa, "r+")) == NULL)
{
printf("\n\t Nie ma takiego pliku!\n");
return(1);
}
}
//stworzenie pliku pomocniczego:
plik1 = fopen("pomoc.txt", "w+");
fclose(plik1);
//czesc glowna programu:
while (fscanf(plik, "%s", bufor) != EOF)
{
analiza(bufor);
StringWyr1[rozmiar1] = DlWyrazu;
DlWyrazu = 0;
rozmiar1++;
//tworzenie pliku z wyrazami bez powtorzen
plik1 = fopen("pomoc.txt", "r+");
while (fscanf(plik1, "%s", bufor2) != EOF)
{
cmp = stricmp(bufor, bufor2);
if (cmp == 0) { licz++; }
}
if (licz == 0) { fprintf(plik1, "%s ", bufor); }
fclose(plik1);
licz = 0;
}
DlWyrazu = 0;
plik1 = fopen("pomoc.txt", "r+");
while (fscanf(plik1, "%s", bufor3) != EOF)
{
analiza(bufor3);
StringWyr2[rozmiar2] = DlWyrazu;
DlWyrazu = 0;
rozmiar2++;
}
printf("\n\t ---------- Z powt ------------");
obliczanieParam(StringWyr1,rozmiar1);
printf("\n\t ilosc wyrazow = %d", rozmiar1);
printf("\n\t srednia dlugosc = %f", srdl);
printf("\n\t wariacja = %f", wariacja);
printf("\n\t mediana = %f", mediana);
printf("\n\t --------- BEZ powt ----------");
obliczanieParam(StringWyr2, rozmiar2);
printf("\n\t ilosc wyrazow = %d", rozmiar2);
printf("\n\t srednia dlugosc = %f", srdl);
printf("\n\t wariacja = %f", wariacja);
printf("\n\t mediana = %f", mediana);
fclose(plik1);
fclose(plik);
remove("pomoc.txt");
return 0;
}