Just nu i M3-nätverket
Jump to content

allt i mitt program fungerar förutom min sortering


karl-åke

Recommended Posts

jag programmerar i C++ i microsoft visual studio,

jag ska göra en serietabell t.ex för nån fotbollsliga och det här programmet innehåller också structar, i den ska jag föra in resultat och sedan skriva resultat till en binär fil och spara dem. Man ska också kunna skriva ut tabell och göra ändringar

 

allting i mitt program fungerar förutom min sortering, jag får inte ut något felmedelande eller nått, utan det sorterar bara inte, jag har använt en del funktioner i det här programmet, och värdena ska sorteras efter man fört in resultat, när man vill ha en utskrift på tabellen och sorteras efter ändringarna. MIn sorterings funktion är längst ner av koden. Sortering sker genom att jag för över structen till ett fält och sedan för in den igen.

 

 

 

tack i förväg..

 

 

#include "stdafx.h"

#include <iostream>

#include <fstream>

#include <iomanip>

using namespace std;

 

void writemeny();

 

int funktionsval(int antallag,char svar, char filnamn[],int poang, int poeng, int pg, int malskillnad);

int resultatval(char filnamn[]);

int utskriftsval(int antallag, char filnamn[],int poang, int poeng, int pg, int malskillnad);

void slutval();

int andring(char filnamn[], int poeng, int poang, int pg, int malskillnad, int antallag);

int sort(char filnamn[], int antallag);

void writemeny2();

int las();

struct lag

{

char namn[40];

int antal_vunna, antal_oavgjorda, antal_forlorade;

int antal_gjorda_mal, antal_inslappta_mal,poang, malskillnad;

 

};

 

 

 

int main(int argc, char* argv[])

{

 

char filnamn[30];

cout<<"Hej och välkommen!"<<endl;

cout<<endl;

 

cout<<"vad vill du gora?"<<endl;

writemeny();

int poang=0;

int poeng=0;

int pg=0;

int malskillnad=0;

int antallag=0;

char svar=0;

 

 

 

funktionsval(svar, antallag,filnamn, poang, poeng, pg, malskillnad);

 

 

 

 

 

 

return 0;

}

 

 

void writemeny()

{

cout<<"1. Fora in resultat"<<endl;

cout<<"2. skriva ut tabell"<<endl;

cout<<"3. Avsluta"<<endl;

}

 

void writemeny2()

{

cout<<"1. vill du bara andra lagets namn?"<<endl;

cout<<"2. vill du andra lagets namn och resultat"<<endl;

cout<<"3. vill du bara andra resultat"<<endl;

//cout<<"4. Andra antalet forlade matcher "<<endl;

//cout<<"5. Andra antalet inslappta mal"<<endl;

}

 

 

 

 

 

int funktionsval(int antallag ,char svar, char filnamn[],int poang, int poeng, int pg, int malskillnad)

{

 

cout<<"Ange svar:";

 

cin>> svar;

cin.ignore();

 

 

while(svar!=4)

{

if(svar=='1')

{

resultatval(filnamn);

break;

}

 

if(svar=='2')

{

utskriftsval(antallag, filnamn, poang, poeng, pg, malskillnad);

break;

}

if(svar=='3')

{

slutval();

break;

}

 

else

{

cout<<"svaret finns inte med "<<endl;

cout<<"välj ett nytt alternativ"<<endl;

writemeny();

cin>> svar;

cin.ignore();

}

 

 

}

 

return 0;

}

 

int resultatval(char filnamn[])

{

 

fstream inutfil;

 

cout<<"ange filens namn: ";

cin.getline(filnamn,30);

 

 

inutfil.open(filnamn, ios::in|ios::out|ios::trunc|ios::binary);

if (!inutfil)

{

cout<<"filen kunde inte oppnas!";

exit(EXIT_FAILURE);

}

 

 

cout<<"skriv in antal lag:"<<endl;

lag resultat;

int antallag=0;

int i=0;

cin>> antallag;

cin.ignore();

int poang=0;

int poeng=0;

int pg=0;

int malskillnad=0;

for(i=0; i<antallag; i=i+1)

{

 

 

cout<<"Ange namnet för lag:"<<i+1<<endl;

cin.getline(resultat.namn,40);

 

cout<<"Ange antal gjorda mal:"<<endl;

cin>>resultat.antal_gjorda_mal;

 

cout<<"Ange antal vunna matcher:"<<endl;

cin>>resultat.antal_vunna;

 

 

cout<<"Ange antal forlorade matcher:"<<endl;

cin>>resultat.antal_forlorade;

 

cout<<"Ange antal oavgjorda matcher:"<<endl;

cin>>resultat.antal_oavgjorda;

 

cout<<"Ange antal inslappta mal:"<<endl;

cin>>resultat.antal_inslappta_mal;

 

cin.ignore();

 

 

inutfil.write((char *)&resultat, sizeof(lag));

 

 

 

}

 

 

sort(filnamn, antallag);

inutfil.seekg(0, ios::beg);

int k=1;

cout<<"plac. lgnm g.m v.mat f.mat oav.mat insl.m pg m.s"<<endl;

while(inutfil.read((char *)&resultat, sizeof(lag)))

{

cout<<k<<"."<<setw(1)<<resultat.namn<<setw(11)<<resultat.antal_gjorda_mal<<setw(6)<<resultat.antal_vunna<<setw(6)<<resultat.antal_forlorade<<setw(6)<<resultat.antal_oavgjorda<<setw(6)<<resultat.antal_inslappta_mal<<setw(6)<<resultat.poang<<setw(6)<<resultat.malskillnad<<endl;

k++;

 

}

inutfil.write((char *)&resultat, sizeof(lag));

 

inutfil.close();

 

return 0;

}

 

int utskriftsval(int antallag, char filnamn[], int poang, int poeng, int pg, int malskillnad)

{

 

lag resultat;

fstream inutfil;

 

cout<<"Ange filens namn:";

cin.getline(filnamn,30);

 

 

 

 

 

 

inutfil.open(filnamn, ios::in|ios::out|ios::binary);

 

if (!inutfil)

{

cout<<"filen kunde inte oppnas!";

exit(EXIT_FAILURE);

}

 

 

 

 

 

int k=1;

inutfil.seekg(0, ios::beg);

sort(filnamn, antallag);

cout<<"plac. lgnm g.m v.mat f.mat oav.mat insl.m pg m.s"<<endl;

 

while(inutfil.read((char *)&resultat, sizeof(lag)))

{

cout<<k<<"."<<setw(1)<<resultat.namn<<setw(11)<<resultat.antal_gjorda_mal<<setw(6)<<resultat.antal_vunna<<setw(6)<<resultat.antal_forlorade<<setw(6)<<resultat.antal_oavgjorda<<setw(6)<<resultat.antal_inslappta_mal<<setw(6)<<resultat.poang<<setw(6)<<resultat.malskillnad<<endl;

k++;

 

}

inutfil.write((char *)&resultat, sizeof(lag));

 

 

andring(filnamn, antallag, poeng, poang, pg, malskillnad);

 

inutfil.close();

return 0;

}

 

 

void slutval()

{

cout<<"Du har valt att avsluta programmet"<<endl;

cout<<"hejdå!"<<endl;

 

 

}

 

int andring(char filnamn[],int antallag ,int poeng, int poang, int pg, int malskillnad)

{

lag resultat;

fstream inutfil;

 

inutfil.open(filnamn,ios::in|ios::out|ios::binary);

if (!inutfil)

{

cout<<"filen kunde inte oppnas!";

exit(EXIT_FAILURE);

}

 

int placering;

cout<<"ange placeringen på laget som du vill andra:";

cin>>placering;

cin.ignore();

placering--;

cout<<placering;

 

inutfil.seekg(0, ios::beg);

inutfil.seekg(placering*sizeof(lag));

 

inutfil.read((char *)&resultat, sizeof(lag));

 

cout<<resultat.namn<<endl;

 

 

cout<<"Vill du andra ?"<<endl;

writemeny2();

int i=0;

char svarr=0;

cin>> svarr;

cin.ignore();

 

while(svarr!=4)

 

{

if(svarr=='1')

{

cout<<"det nuvarande namnet på laget är"<<resultat.namn<<endl;

cout<<"skriv in det nya namnet:";

cin.getline(resultat.namn,40);

inutfil.seekp(placering*sizeof(lag));

inutfil.write((char *)&resultat, sizeof(lag));

 

break;

}

 

 

if(svarr=='2')

{

 

cout<<"det nuvarande namnet på laget är"<<resultat.namn<<endl;

cout<<"skriv in det nya namnet:";

cin.getline(resultat.namn,40);

 

 

int vunna, gjordamal, forlorade, oavgjorda, inslappta;

 

cout<<"skriv in antal nya gjorda mal matcher"<<endl;

cin>> gjordamal;

resultat.antal_gjorda_mal=resultat.antal_gjorda_mal+ gjordamal;

cout<<"skriv in antal nya vunna matcher:"<<endl;

cin>>vunna;

resultat.antal_vunna= resultat.antal_vunna+ vunna;

cout<<"skriv in antal nya forlorade matcher:"<<endl;

cin>> forlorade;

resultat.antal_forlorade=resultat.antal_forlorade+ forlorade;

cout<<"skriv in antal nya oavgjorda matcher:"<<endl;

cin>> oavgjorda;

resultat.antal_oavgjorda=resultat.antal_oavgjorda+ oavgjorda;

cout<<" skriv in antal nya inslappta mal:"<<endl;

cin>>inslappta;

resultat.antal_inslappta_mal=resultat.antal_inslappta_mal+ inslappta;

cin.ignore();

 

 

resultat.poang= resultat.antal_vunna*3 + resultat.antal_oavgjorda*1;

 

resultat.malskillnad= resultat.antal_gjorda_mal- resultat.antal_inslappta_mal;

 

inutfil.seekg(0, ios::beg);

inutfil.seekp(placering*sizeof(lag));

inutfil.write((char *)&resultat, sizeof(lag));

 

 

 

break;

 

}

 

 

 

if(svarr=='3')

{

int vunna, gjordamal, forlorade, oavgjorda, inslappta;

 

cout<<"skriv in antal nya gjorda mal matcher"<<endl;

cin>> gjordamal;

resultat.antal_gjorda_mal=resultat.antal_gjorda_mal+ gjordamal;

cout<<"skriv in antal nya vunna matcher:"<<endl;

cin>>vunna;

resultat.antal_vunna= resultat.antal_vunna+ vunna;

cout<<"skriv in antal nya forlorade matcher:"<<endl;

cin>> forlorade;

resultat.antal_forlorade=resultat.antal_forlorade+ forlorade;

cout<<"skriv in antal nya oavgjorda matcher:"<<endl;

cin>> oavgjorda;

resultat.antal_oavgjorda=resultat.antal_oavgjorda+ oavgjorda;

cout<<" skriv in antal nya inslappta mal:"<<endl;

cin>>inslappta;

resultat.antal_inslappta_mal=resultat.antal_inslappta_mal+ inslappta;

cin.ignore();

 

 

resultat.poang= resultat.antal_vunna*3 + resultat.antal_oavgjorda*1;

 

resultat.malskillnad= resultat.antal_gjorda_mal- resultat.antal_inslappta_mal;

inutfil.seekg(0, ios::beg);

inutfil.seekp(placering*sizeof(lag));

inutfil.write((char *)&resultat, sizeof(lag));

 

 

break;

 

}

 

else

{

cout<<"alternativet finns inte med"<<endl;

cout<<"valj ett nytt alternativ"<<endl;

writemeny2();

cout<<"skriv in svar:"<<endl;

cin>>svarr;

cin.ignore();

}

 

}

sort( filnamn, antallag);

inutfil.close();

return 0;

}

 

 

 

int sort(char filnamn[], int antallag)

{

 

 

 

lag sorti[100];

 

lag temp;

 

ifstream infil;

 

infil.open(filnamn,ios::in|ios::out|ios::binary);

if (!infil)

{

cout<<"filen kunde inte oppnas!";

exit(EXIT_FAILURE);

}

 

infil.seekg(0, ios::beg);;

infil.read((char *)sorti, antallag*sizeof(lag));

infil.close();

 

 

ofstream utfil;

utfil.open(filnamn,ios::in|ios::out|ios::binary);

if (!utfil)

{

cout<<"filen kunde inte oppnas!";

exit(EXIT_FAILURE);

}

 

 

 

int k;

 

int flagga= 1;

while (flagga!=0)

{

 

flagga=0;

 

for( k= 0; k< antallag; k=k+1)

{

 

if(sorti[k].poang > sorti[k+1].poang)

{

//cout<<"sortering3"<<endl;

//m= i;

temp= sorti[k];

sorti[k] = sorti[k+1];

sorti[k+1]= temp;

flagga++;

}

 

 

 

 

 

if(sorti[k].poang= sorti[k+1].poang)

{

 

//flagga=0;

 

 

if(sorti[k].malskillnad > sorti[k+1].malskillnad)

{

cout<<"sorteringblabla"<<endl;

temp= sorti[k];

 

sorti[k] = sorti[k+1];

sorti[k+1]= temp;

flagga++;

 

}

}

 

}

 

}

utfil.seekp(0, ios::beg);

utfil.write((char *)sorti, antallag*sizeof(lag));

utfil.close();

 

return 0;

 

}

 

Link to comment
Share on other sites

Det är lite svårt att svara exakt på vad som är fel i din sortering. Din kod är inte helt enkel att tyda... Du borde kanske fundera lite över lite olika tänkbara sorteringsalgoritmer. Den som jag tycker är allra enklast att förstå och implementera är en som kallas "Selection sort".

 

Algoritmen går till som följer:

1) Finn det "största" elementet i en lista med n element

2) Placera det funna (största) elementet sist i listan.

3) Sortera listan med n-1 element.

 

Lite enkel kod kanske förklarar lite närmre:

 

#include <stdio.h>

void sort(int *a, int n);
int findMaxIndex(int *a, int n);
void swap(int *a, int *;

int main () {
 int i;
 int array[] = {5, 8, 2, 1, 3, 6, 10, 4, 9, 7};
 sort(array, 10);
 for (i = 0; i < 10; i++)
   printf("> %d\n", array[i]);
 return 0;
}

/* Sortera listan a med n element. */
void sort(int *a, int n) {
 int max;
 if (n == 1)
   return;
 max = findMaxIndex(a, n);
 swap(&a[max], &a[n-1]);
 sort(a, n - 1);
}

/* Leta upp vilket index max-elementet har. */
int findMaxIndex(int *a, int n) {
 int i, max = 0;
 for (i = 0; i < n; i ++)
   if (a[i] >= a[max])
     max = i;
 return max;
}

/* Byt plats på två element. */
void swap(int *a, int * {
 int temp = *a;
 *a = *b;
 *b = temp;
}

Hoppas det kan hjälpa dig!

 

Link to comment
Share on other sites

tack för tipset manner, fast problem var att jag hade för många öppna strömmar, och då blev det en stor enda röra. dock tycker jag att bubble sort är enklare än selection sort :)

 

Link to comment
Share on other sites

Själv föredrar jag std::sort (STL) eftersom den har oslagbar prestanda (borträknat räknesortering ), men allt är som sagt en smaksak.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...