Generowanie programów potrzebna pomoc

0

Witam,
mam do napisania program, który generuje i zapisuje do pliku funkcje: sinus, trójkąt i prostokąt, ktore potem możemy odczytać i modyfikować. Z wygenerowaniem i zapisaniem do pliku sinusa i prostokąta problemów nie miałem. Problemy mam dwa:

  1. Nie za bardzo radzę sobie z generowaniem trójkąta.
  2. Problem większy. Nie umiem odczytać z pliku .csv zapisanych danych. Są one zapisane tak, że w kolumnie A mam czas, a w kolumnie B wartość funkcji. Potrzebuje w prosty sposób wczytać wartości funkcji aby móc następnie zastosować filtrację.

Jeżeli jakaś dobra dusza dałaby radę pomóc to będę bardzo wdzięczny
Pozdrawiam

0

W jakim języku ma być ten program i funkcje? Niby jest tag c, ale nie wiadomo do którego się to odnosi.

0

W języku C

1

@kq - podejrzewam że chodzi raczej o wykres w semigrafice.
@Świetny Terrorysta - może napisz to jeszcze raz bez użycia skrótów myślowych i najlepiej z przykładem tego co chcesz osiągnąć.

0

Dobra, zakładam, że obie mają być w C. W takim razie, przykładowo:

#include <stdio.h>

int main()
{
	FILE* f =fopen("prostokat.c", "w");
	char const * func = "void prostokat(){\n"
						"\tprintf(\"prostokat\");\n"
						"}\n";
	fprintf(f, "%s", func);
	fclose(f);
}

Ta funkcja utworzy plik prostokat.c o poniższej zawartości. Oczywiście, zgodnie z wymaganiami, można go "odczytać i modyfikować".

void prostokat(){
	printf("prostokat");
}
0

Ok.
Program ma za zadanie utworzyć plik z wartościami liczbowymi funkcji, które podałem wyżej
np.

		for (n = 0; n < N; n++)
	
		wynik = ((A*sin(2 * PI*f / fp*n*s)) + (rand() / (RAND_MAX + 1.0) * a));

Wynik jest zapisywany do pliku .csv. Razem z wartością "s", która u mnie oznacza skok czasu. Dzięki temu Excel jest mi w stanie zrobić wykres sinusoidy.
I to mam.

Teraz potrzebuję napisać taką fukcję jak wyżej, ale zamiast sinusa muszę utworzyć sygnał trójkątny.

A drugi mój problem polega na tym, że:
Muszę ten plik csv wczytać do programu i filtrować jego wartości. Nie umiem tego zrobić.
Mam nadzieje, że wyjaśniłem, jeśli nie to będę się starał inaczej.

0
 int main()
{
	FILE * plik;

	double wynik;
	float  lT, t, N, T, n, fp, f, s;
	int i, a, A;
	srand(time(NULL));
	printf("Aby wybrac rodzaj sygnalu wybierz:\n 1 dla sinusa\n 2 dla prostokata\n 3 dla trojkota\n");
	scanf("%d", &i);
	switch (i)
	{
	case 1:
		printf("Podaj czas trwania okresu w milisekundach\n");
		scanf("%f", &T);
		printf("Podaj liczbe okresow\n");// T*iT musi byc >N
		scanf("%f", &lT);
		printf("Podaj liczbe probek\n");
		scanf("%f", &N);
		printf("Podaj amplitude sinusa\n");
		scanf("%d", &A);
		printf("Podaj amplitude szumu\n");
		scanf("%d", &a);

		t = T*lT;
		f = 1000 / T;
		s = t / N;
		fp = f*N;

		for (n = 0; n < N; n++)
		{
			wynik = ((A*sin(2 * PI*f / fp*n*s)) + (rand() / (RAND_MAX + 1.0) * a));


			if ((plik = fopen("mojplik.csv", "a")) == NULL)
			{
				printf("Nie mogę otworzyć pliku mojplik.txt do zapisu!\n");
				exit(1);
			}
			fprintf(plik, "%f %f \n  ", s*n, wynik);


			fclose(plik);



		}
		plik = fopen("mojplik.csv", "r");

póki co stworzyłem tyle

0
  1. Nie nadużywaj inkrenmentacji przyrostkowej: http://4programmers.net/Forum/1101404
  2. Wczytywanie:
unsigned s;
double A;
fscanf(file,"%u ; %lf", &s,&A);
  1. Trójkąt: wynik=A*(n%s)/(s-1);
0

Dzięki wielkie.
Teraz za to mam ciekawy problem. Ściągnąłem właście Visuala 2015 na kompa i cały czas wywala mi mnóstwo błędów w bibliotece math.h.
Zastanawiam się jeszcze nad tym trójkątem. Muszę móć ustawić ilość okresów i czas ich trwania. I nie jestem pewien czy z tego wzoru co podałeś da się to zrobić.
Co gorsza nie mogę tego sprawdzić przez te ciągłe błędy w math.h

0

Wywala mi ich ponad 2000

Severity Code Description Project File Line Suppression State
Error (active) variable "using" is not a type name ConsoleApplication2 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 661

Severity Code Description Project File Line Suppression State
Error (active) expected a ';' ConsoleApplication2 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 17

Severity Code Description Project File Line Suppression State
Error (active) identifier "typename" is undefined ConsoleApplication2 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits 838

w sumie te 3 tylko powtarząjące się mnóstwo razy

0
s=czas_trwania;
ilosc_okresow=N/s;
0
 #include <math.h>
#include <time.h>
#define PI 3.14159265


int main()
{
	FILE * plik;
	double wynik;
	float  lT, t, N, T, n, fp, f,s,z;
	int i,a,A;
	unsigned y;
	double X;
	srand (time(NULL));
	printf("Aby wybrac rodzaj sygnalu do generowania wybierz:\n 1 dla sinusa\n 2 dla prostokata\n 3 dla trojkota\n 4 aby filtrować");
	scanf("%d", &i);
	switch (i)
	{
	case 1:
		printf("Podaj czas trwania okresu w milisekundach\n");
		scanf("%f", &T);
		printf("Podaj liczbe okresow\n");// T*iT musi byc >N
		scanf("%f", &lT);
		printf("Podaj liczbe probek\n");
		scanf("%f", &N);
		printf("Podaj amplitude sinusa\n");
		scanf("%d", &A);
		printf("Podaj amplitude szumu\n");
		scanf("%d", &a);

		t = T*lT;
		f = 1000 / T;
		s = t / N;
		fp = f*N;

		for (n = 0; n < N; n++)
		{
			wynik =((A*sin(2 * PI*f / fp*n*s))+(rand() / (RAND_MAX + 1.0) * a));   


			if ((plik = fopen("mojplik.csv", "a")) == NULL)
			{
				printf("Nie mogę otworzyć pliku mojplik.txt do zapisu!\n");
				exit(1);
			}
			fprintf(plik, "%f %f \n  ",s*n, wynik);
			
			
			fclose(plik);
			
			
			
		}
		plik=fopen("mojplik.csv","r");
		
		
		break;
		
		
		break;

	case 2:



		break;

	case 3:

		break;

	case 4:
		unsigned y;
		double X;
		plik = fopen("mojplik.csv", "r");
		fscanf(plik, "%u ; %lf", &s, &A);
		printf("f", A);
		break;
	}


	system("pause");
	return 0;
} 

to jest calutki kod który kompiluje, na zajęciach działał bez problemu.

0

Czy jest zapisany jako *.c?
Czy stworzyłeś projekt - konsolowy?
Jak powiedziałby @kq: - "Visual jest starym środowiskiem, którego nie powinieneś używać." - przynajmniej ze względu na brak doświadczenia. Więc zainstaluj sobie Dev-C++ http://sourceforge.net/projects/orwelldevcpp/ - nawet projektu nie musisz zakładać.

0

nazywa się sinus.c
tak, projekt konsolowy

i jeszcze à propos tego:

unsigned s;
double A;
fscanf(file,"%u ; %lf", &s,&A);

czy to nie wczyta tylko jednej próbki?

0
Świetny Terrorysta napisał(a):

czy to nie wczyta tylko jednej próbki?
Nie ma pojęcia próbki w programowaniu, więc odpowiedź zależy od twojej definicji tejże próbki. Wczyta to kolejny wiersz z typowego pliku *.csv w którym są dwie kolumny s i A oddzielone typowym średnikiem.

0

Źle napisałem.
Czy jeżeli zrobię to w pętli. I załóżmy będę wczytywał cały plik mający 100 wierszy. Czy na samym końcu będę w stanie operować na wczytanych wartościach? Czy tylko na ostatniej wczytanej?

0

Skoro masz takie pytania to zdecydowanie ten projekt ciebie przerasta, weź się za jakiś prosty kurs.

0

Problem jest tego rodzaju, że nie mam wyjścia i muszę to napisać.
Z tego co wiem to nie będę ich mógł używać. Ale wolę się upewnić boście ode mnie dużo mądrzejsi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1