2009-03-12, 18:04
  #1
Medlem
Hallo igen,

Jag börjar med att visa koden
Kod:
void printMaxRainWeek(int antalDagint lista[]) {

    
int i 0;
    
int day 0;
    
int sumRain 0;
    
int maxSumRain 0;
    
double week;
    while( 
antalDag ) {
        if ( 
day && != (antalDag-1) ) {
            
sumRain += lista[i];
            
day++;
        } else if ( 
== (antalDag-1) ) {
            
sumRain += lista[i];
            if( 
maxSumRain sumRain ) {
                
maxSumRain sumRain;
            }
        } else {
            
sumRain += lista[i];
            if( 
maxSumRain sumRain ) {
                
maxSumRain sumRain;
                
week i;
            }
            
sumRain 0;
            
day 0;
        }
        
i++;
    }
    
cout << "Vecka " << ceil(week/7) << " regnade det " << maxSumRain << " mm och det var mest under manaden" << endl;



Metoden ovan går ut på att räkna ut summa regnmängd för varje vecka, som finns sparad i en array. Array:en innehåller regnvärde för 30 dagar. Nu kommer problemet som jag löste på ett mindre snyggt sätt tycker jag. Kan man korta ner koden på nåt sätt?

Det jag har gjort nu är att den kollar på de 4 fyra första veckorna sen har jag en else if där man löser sista veckan också genom att man kollar när man har kommit på slutet av månaden och gör en summering av sista veckan där också.
Citera
2009-03-12, 23:45
  #2
Medlem
cpapas avatar
Jag får inte din beskrivning att gå ihop med koden? Du har regndata över en månad? Vecka 1 startar på dag 1? Du vill hitta den vecka då det regnade mest?


Så här löste jag _det_ problemet:
Kod:
void print_rainiest_weekint lista[] ) {

    
int mm_per_week[5] = {0}; // Dela upp nederbörden i veckor
    
int max 0// Maxvärdet för nederbörden
    
int week;    // Den vecka då det regnade mest
        // Loopa över listan
    
for (int i 030i++) {
        
mm_per_week[i/7] += lista[i]; // Addera nederbörden för dagen till rätt vecka.
                // om det har regnat mer denna veckan ( kan hända på torsdag! ) än tidigare
        
if ( mm_per_week[i/7] > max ) {
            
max mm_per_week[i/7]; // sätt max till veckans nederbörd
            
week i/7// sätt veckan till denna vecka        
        
}
    }
    
cout << "Vecka " << week << " regnade det " << max << " mm" << endl;


PS. Denna kod hanterar inte det fallet då det är en helt torr månad.
__________________
Senast redigerad av cpapa 2009-03-12 kl. 23:50.
Citera
2009-03-13, 00:21
  #3
Medlem
hehe, jag undrade ifall det var jag som var otydligt i min beskrivning när man inte fick något svar. verkade vara det också, men du luskade ut det jag var ute efter iaf.

Kan bryta upp det jag gjort:

1. lista[] med regnmängd för okänt antal dagar för en månad läses in. Det ska sedan summera totala regnmängd för varje vecka.

2. den vecka som regnade mest sparas undan som max. även vecka det var på sparas undan.

3. resultat presenteras.

-----------------------

Din lösning blev avsevärt mindre kod än min, och det var precis det jag undrade över. Mah, tycker dessutom det var bra mycket snyggare lösning också (om man kollar på läsbarheten) ^^
Citera
2009-03-13, 00:39
  #4
Medlem
cpapas avatar
Citat:
Ursprungligen postat av ångmaskin
hehe, jag undrade ifall det var jag som var otydligt i min beskrivning när man inte fick något svar. verkade vara det också, men du luskade ut det jag var ute efter iaf.

Kan bryta upp det jag gjort:

1. lista[] med regnmängd för okänt antal dagar för en månad läses in. Det ska sedan summera totala regnmängd för varje vecka.

2. den vecka som regnade mest sparas undan som max. även vecka det var på sparas undan.

3. resultat presenteras.

-----------------------

Din lösning blev avsevärt mindre kod än min, och det var precis det jag undrade över. Mah, tycker dessutom det var bra mycket snyggare lösning också (om man kollar på läsbarheten) ^^

Tack och varsågod att använda koden om du skulle vilja det (den är inte vattentät )!
Citera
2009-03-13, 09:42
  #5
Medlem
mjo, nog är de det. men det är bra att kolla igenom koden för utbildningssyfte. så att man vet hur man skulle kunna ha gjort det istället.
Citera
2009-03-14, 02:13
  #6
Medlem
edoceos avatar
en annan lösning
Kod:
#include <iostream>
#include <numeric>
#include <cmath>

void edoceo_flashback_2009(int *a_start, int *a_end){
  int max, week, tmp, *_p;

  for(max=0,_p=a_start; _p<a_end; _p+=7){
    if((tmp = std::accumulate(_p, std::min(_p+7,a_end), 0)) > max){
      max = tmp;
      week = int(std::ceil((_p-a_start)/7)+1);
    }
  }

  std::cout << "week: " << week << " downfall: " << max <<  " mm." << std::endl;

  return;
}

int main(int argc, char **argv){
  int a[] = {
    0,0,0,0,0,0,0, /* week 1 */
    1,5,3,2,0,8,9, /* week 2 */
    9,9,9,2,3,1,0, /* week 3 */
    0,0,0,2,4,5,9, /* week 4 */
    9,9,9 /* week 5 */
  };

  edoceo_flashback_2009(a, a+31);

  return 0;
}
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in