Ett primtalsprogram i C
Här ska vi få en kort introduktion till programspråket C genom att göra ett
litet enkelt primtalsprogram. Program består utav tre filer. Två styck
källkodsfiler och en styck header-fil. I header-filen lägger vi något som
kallas för funktionsprototyper. En funktionsprototyp använder man för att tala
om för programmet hur en funktion ser ut, det vill säga vilka argument
funktionen tar samt vilken datatyp den returernar. Detta gör gör man för att
slippa lägga funktionen överst i samma fil som main()
. Header-filen döper vi
till skrivprm.h.
I filen primtal.c lägger vi vår main()
-funktion, alltså programmets
huvudfunktion. Alla C-program måste ha en main()
-funktion. Lägg märke till den
andra #include
-raden som inkluderar vår egna header-fil. Lägg också märke
till att syntaxen för denna #include
skiljer sig från när vi inkluderar filer
från systemet. Den översta #include
-raden inkluderar stdio.h, en header-fil
från systemet som innehåller deklarationer och funktionsprototyper för allt som
handlar om in- och utdata. Läs gärna mer om stdio-funktionerna i manualsidan
med man stdio
.
I C, till skillnad från till exempel Python, måste vi alltid deklarera alla
variabler i förväg, och dessutom tala om vilken datatyp de ska vara. Här nedan
använder vi till exemepl int min
och int max
för att skapa två
heltalsvariabler.
När vi använder scanf()
-funktionen nedan med vanliga heltalsvariabler, måste
vi ange adressen till variabeln. Detta görs med &
-operatorn.
primtal.c
#include <stdio.h>
#include "skrivprm.h"
int main(void)
{
int min;
int max;
printf("Ange minsta talet: ");
/* Läs in ett heltal från tangentbordet, och
skriv ut ett felmeddelande om indatan inte
var ett heltal */
if(!scanf("%d", &min))
{
printf("Ange endast heltal\n");
return 1;
}
printf("Ange största talet: ");
/* Läs in nästa heltal */
if(!scanf("%d", &max))
{
printf("Ange endast heltal\n");
return 1;
}
/* Exekvera funktionen 'skrivprimtal' med
variablerna 'min' och 'max' som argument */
skrivprimtal(min, max);
return 0;
}
I filen skrivprm.h lägger vi funktionsprototypen för primtalsfunktionen.
skrivprm.h
void skrivprimtal(int min, int max);
I filen skrivprm.c lägger vi funktionskroppen för primtalsfunktionen.
skrivprm.c
#include <stdio.h>
void skrivprimtal(int min, int max)
{
/* Skapa tre heltalsvariabler */
int i, j, primtal;
/* Testa om talen mellan min och max är primtal.
Testet går ut på att se om varje givet tal är
jämnt delbart med något tal mellan 2 och talet
självt. Om så är fallet är talet INTE ett primtal */
for (i=min; i<=max; i++)
{
primtal = 1;
for(j=2; j<i; j++)
{
/* Använd modulo-operatorn för att testa delbarheten */
if(i%j == 0)
{
primtal = 0; /* Om talet INTE är ett primtal */
break;
}
}
if(primtal == 1)
{
printf("%d är ett primtal\n", i);
}
}
}
När vi ska kompilera detta programmet måste vi tala om för kompilatorn att vi ska använda både skrivprm.c och primtal.c, alltså båda c-filerna. Däremot behöver vi inte tala om för kompilatorn att vi ska använda header-filen, detta står ju redan i källkodsfilen. Kommandot blir:
cc skrivprm.c primtal.c -o primtal
Nu kan vi köra programmet med ./primtal
.
$> ./primtal
Ange minsta talet: 30
Ange största talet: 40
31 är ett primtal
37 är ett primtal
Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.
Kommentarer
Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.
Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.
Relaterade artiklar
-
Skapa fristående binärer av Python-skript
Docker har blivit det nya sättet att paketera och köra Python-skript, även när skripten körs från exempelvis ett cronjob. Men ibland behöver vi inte en hel Docker-miljö med den overhead det innebär för väldigt små skript. Då är det smidigare att göra om skriptet till en körbar binärfil. Då kan vi även enkelt flytta filen mellan olika Linuxsystem.
-
Hämta data från API:er med cURL och jq
Med cURL och jq går det att extrahera data från API:er direkt från kommandoraden. Jq är en JSON-tolkare och beskrivs av utvecklarna som sed och awk för JSON.
-
Pythonmiljö i Docker
Ett vanligt användningsområde för Docker är att skapa och köra virtuella Pythonmiljöer. Med en Dockerfile och Docker Compose kan vi automatisera hela processen, från skapandet av miljön till exekveringen.
-
Python och trigonometri
Lite uppfräschning av trigonometri och Python är aldrig fel. Här får vi lära oss hur man kan rita upp rätvinkliga trianglar – direkt i Python – om vi känner till två av sidorna. För detta kommer vi att använda modulerna turtle och math.
-
Python i Windows utan installation
Det går att använda Python i Windows, även utan att installera det. Detta är användbart om du har en dator där du inte har rättigheter att installera program. Det kan till exempel vara en skoldator eller arbetsdator.
Senaste nyheterna och inläggen
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Sommarens skånska demopartyn
Årets sommar bjuder på två skånska demopartyn. Först ut är Reunion i Kvidinge den 28–30 juni. Därefter är det Pågadata i Örtofta den 9–11 augusti.
-
Riskerna med BankID som ingen pratar om
BankID är ett säkert och smidigt sätt att identifiera sig online. Men i takt med dess ökade popularitet och användning har det blivit en svag länk – en single point of failure – på mer än ett sätt.
-
Polisernas fängelsedomar står fast
Efter tre år är målet mot de två poliser som olovligen tog sig in i en berusad mans bostad i Landskrona och misshandlade honom klart. Högsta domstolen beslutade den sjätte mars att avvisa överklagan. Fängelsedomarna för poliserna står därmed fast.
Utvalda artiklar
-
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Datorparty i Landskrona
I helgen höll Syntax Society sitt årliga sommarparty. Platsen var en källarlokal i Landskrona där ett femtontal personer medverkade.
-
Det första Pågadata har ägt rum
I helgen ägde det första Pågadata rum – uppföljaren till Gubbdata. Platsen var Folkets Hus i Kvidinge. Organisatör av partyt var Johan “z-nexx” Osvaldsson med hjälp från Jesper “Skuggan” Klingvall. Partyt hade över 100 anmälda deltagare.
-
Även hovrätten fäller poliserna för att ha satt dit oskyldig
Hovrätten fastställer straffet för de två poliser som förra året dömdes till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och satt dit en oskyldig man. De båda poliserna ska även betala skadestånd till mannen.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
CyberInfo Sverige är ett it- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.