• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kod źródłowy w języku C, ciąg arytmetyczny

Object Storage Arubacloud
0 głosów
365 wizyt
pytanie zadane 24 października 2022 w C i C++ przez patrykpatryczek01 Nowicjusz (200 p.)

Kod źródłowy w języku C, który polega na zbadaniu ciągu czy jest arytmetyczny czy nie. Wyskakuje mi, że nie jest arytmetyczny, a powinien być. Nie wiem co jest źle

#include<stdio.h

#include<stdio.h>
#include<stdlib.h>
int czy_arytmetyczny(int ciag[],int rozmiar);
int main()
{
  int ciag[]={2,4,6,8,10,12,14,16,18,20,22,24};
  int rozmiar=sizeof(ciag)/sizeof(ciag[0]);
  int arytmetyczny=czy_arytmetyczny(ciag,rozmiar);
  if(arytmetyczny==1)
  {
    printf("Ciąg jest arytmetyczny");
  }
  else
  {
    printf("Ciąg nie jest arytmetyczny");
  }
  return 0;
}
int czy_arytmetyczny(int ciag[], int rozmiar)
{
  int i;
  int r;
  for(i=0;i<rozmiar;i++)
    {
      if(r!=ciag[i+1]-ciag[i]);
      {
        return 0;
      }
    }
  return 1;
}

>
 

2 odpowiedzi

+2 głosów
odpowiedź 25 października 2022 przez mokrowski Mędrzec (155,460 p.)
edycja 25 października 2022 przez mokrowski

Oprócz tego co napisał @Great:

1. Dlaczego nie stosujesz typu bool? Od standardu C99 jest on obecny w języku.

2. Funkcja czy_arytmetyczny() nie broni się przed podaniem długości ciągu poniżej 2

3. W linii 4, mail powinien wyglądać tak: int main(void). Takiego jak wpisałeś, standard nie dopuszcza ale kompilator jest liberalny :) https://en.cppreference.com/w/c/language/main_function

4. O ile to możliwe, stosuj tylko 1 return z funkcji https://softwareengineering.stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from https://spin.atomicobject.com/2011/07/26/in-defence-of-misra/

5. Jeśli masz złożony warunek do sprawdzenia, stosuj nawiasy ( i ) aby grupować warunki. C i C++ ma dość "egzotyczne priorytety operacji".

6. W linii 23, iteracja powinna zaczynać się od 2 a wcześniej wylicz pierwszy r.

komentarz 25 października 2022 przez Great Stary wyjadacz (12,340 p.)

6. Powinna zaczynać się od 1, bo inaczej różnica drugiej pary (i = 1, i + 1 = 2) będzie pomijana. Kod od autora pytania (z prywatnej wiadomości):

#include<stdio.h>
#include<stdlib.h>
int czy_arytmetyczny(int ciag[], int rozmiar);

int main()
{
    int ciag[] = { 2, 4, 9000, 9002 };
    int rozmiar = sizeof(ciag) / sizeof(ciag[0]);
    int arytmetyczny = czy_arytmetyczny(ciag, rozmiar);
    if (arytmetyczny == 1)
    {
        printf("Ciąg jest arytmetyczny");
    }
    else
    {
        printf("Ciąg nie jest arytmetyczny");
    }
    return 0;
}

int czy_arytmetyczny(int ciag[], int rozmiar)
{
    int i = 0;
    int r = ciag[i + 1] - ciag[i];
    for (int i = 2; i < rozmiar - 1; i++)
    {
        if (r != (ciag[i + 1] - ciag[i]))
        {
            return 0;
        }
    }
    return 1;
}
1
komentarz 25 października 2022 przez mokrowski Mędrzec (155,460 p.)

@Great, Nie sądzę.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

bool czy_arytmetyczny (int ciag[], int rozmiar);

int main (void)
{
    int ciag[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 };
    const int rozmiar = sizeof (ciag) / sizeof (*ciag);

    bool arytmetyczny = czy_arytmetyczny(ciag, rozmiar);

    printf("Ciąg%s jest arytmetyczny\n", arytmetyczny ? "": " nie");

    return EXIT_SUCCESS;
}

bool czy_arytmetyczny (int ciag[], int rozmiar)
{
    assert(rozmiar >= 2);

    bool rezultat = true;

    int r = ciag[0] - ciag[1];
    for (int i = 2; i < rozmiar; ++i)
    {
        if (r != (ciag[i - 1] - ciag[i]))
        {
            rezultat = false;
            break;
        }
    }

    return rezultat;
}

 

+1 głos
odpowiedź 24 października 2022 przez Great Stary wyjadacz (12,340 p.)
  1. Zmienna r nie jest zainicjalizowana.

  2. Instrukcja warunkowa jest przerwana średnikiem.

  3. Pętla wychodzi poza zakres tablicy (jeżeli naprawisz 1 i 2).

Podobne pytania

0 głosów
1 odpowiedź 979 wizyt
pytanie zadane 7 listopada 2017 w C i C++ przez Werkaaa Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 1,119 wizyt
pytanie zadane 3 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 2,318 wizyt

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...