Czym jest niezmiennik pętli w moim programie?

0

Mam jeszcze zadanie, w którym trzeba zastąpić każdy n-ty średnią arytmetyczną wyrazów n-1 i n+1 (zakładając, że następny po ostatnim jest pierwszy). Zadanie zrobiłem jak poniżej, czy ktoś jednak może mi powiedzieć, co jest tu niezmiennikiem pętli ?

#include <ctime>
using namespace std;


int main(){
	int liczba;
	srand(time(0));
	scanf("%i",&liczba);
	float *tab=new float[liczba];
	for (int i=0;i<liczba;i++) tab[i]=rand()%10;	//losujemy tablicę
	system("cls");
	for (int i=0;i<liczba;i++) printf("%.1f||",tab[i]);
	

	float temp=tab[liczba-1],pierwsza=tab[0];
	float temp2;
	for (int i=0;i<liczba-1;i++){				//zamieniamy każdą wartość [n] średnią artytmetyczną [n-1] i [n+1]
		temp2=tab[i];
		tab[i]=(temp+tab[(i+1)])/2; 
		temp=temp2;
	}

	tab[liczba-1]=(pierwsza+temp)/2;		//ostatnią trzeba zmienić osobno, bo tab[0] już jest inne
	cout <<endl<<endl;
	for (int i=0;i<liczba;i++) printf("%.1f||",tab[i]);

	system("pause");
}
0

Której?
tab jest niezmiennikiem wszystkich 4-ch

0

Głównej, tej w której zmieniam wartości na średnie arytmetyczne.

0

Np: temp=temp2 jest niezmiennikiem.

0

No tak, a co będzie niezmiennikiem pozwalającym udowodnić poprawność tej pętli?

0

Niezmiennikiem jest suma wszystkich liczb w tablicy.

0
#include <iostream>
#include <string>

int main()
{
	srand(time(NULL));
	const unsigned int size = rand() % 1024;
	int *source = new int[size];
	double *average = new double[size];
	int source_sum = 0, average_sum = 0;
	for (unsigned int i = 0; i < size; ++i)
		source_sum += source[i] = rand() % 1024;
	for (unsigned int i = 0; i < size; ++i)
		average_sum += average[i] = source[(i - 1 + size) % size] + source[(i + 1) % size];
	average_sum /= 2;
	std::cout << "source_sum and average_sum are" << (source_sum == average_sum?" ":" not ") << "equal" << std::endl;
	//you can write out arrays here
	delete[] source;
	delete[] average;
	return 0;
}

@_13th_Dragon

http://ideone.com/Y8RQrI

0

@merlinnot

... Mówimy, że zdanie P jest niezmiennikiem pętli, jeżeli po każdym jej przebiegu jest ono prawdziwe. ...
http://pl.wikipedia.org/wiki/Niezmiennik_p%C4%99tli

0
#include <iostream>
#include <string>

int main()
{
	srand(time(NULL));
	const unsigned int size = rand() % 1024;
	double *average = new double[size], *source = new double[size];
	double source_sum = 0.0;
	for (unsigned int i = 0; i < size; ++i)
		source_sum += source[i] = rand() % 1024;
	double *loop = new double [size];
	for (unsigned int j = 0; j < size; ++j)
	{
		for (unsigned int i = 0; i < size; ++i)
			loop[j]+= average[i] = (source[(i - 1 + size) % size] + source[(i + 1) % size])/2;
		for (unsigned int i = 0; i < size; ++i)
			source[i]=average[i];
	}
	for (unsigned int i = 0; i < size; ++i)
		std::cout << loop[i] << std::endl;
	delete[] source;
	delete[] average;
	delete[] loop;
	return 0;
}

http://ideone.com/VqDlmD

Still works.

0
merlinnot napisał(a):

Niezmiennikiem jest suma wszystkich liczb w tablicy.

I jak za pomocą tej sumy wykazać poprawność częściową Twojego programu?

Czy mój program jest niewłaściwy?

0

To zależy, jak rozumieć treść zadania. Dwie wersje są oczywiste:

  1. an=(an-1+an+1)/2 oraz an+1=(((an-1+an+1)/2)+an+2)/2 itd.

  2. an=(an-1+an+1)/2 oraz an+1=(an+an+2)/2 oraz an+2=(an+1+an+3)/2 itd.

Być może lekko zmieniłeś treść zadania i w oryginale było ono jednoznaczne, jednak bardziej prawdopodobna jest w moim mniemaniu opcja druga, jest bardziej sensowna.

reprezentacją opcji pierwszej jest:

for (unsigned int i = 0; i < size; ++i)
        source[i] = source[(i - 1 + size) % size] + source[(i + 1) % size];
//wynik w tablicy source

reprezentacją drugiego:

for (unsigned int i = 0; i < size; ++i)
        average[i] = source[(i - 1 + size) % size] + source[(i + 1) % size];
//wynik w tablicy average

Edit:
oczywiście wszystkie an odnoszą się do pierwotnej zawartości tablicy

0

Dzięki :)

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