Thursday 1 December 2016

A simple countdown timer written in C using gcc.


#include <stdio.h>

int hcount;
int mcount;
int scount;

int main(void)
{
printf("input the hours ");
scanf("%i", &hcount);
printf("input the minutes ");
scanf("%i", &mcount);
printf("input the seconds ");
scanf("%i", &scount);
for(;;)
{
sleep(1);
scount--;
if(scount<0) {
scount =59;
mcount--;
}

if(mcount<0){
mcount=59;
hcount--;
}
if(hcount==0 && mcount==0 && scount==0){
break;
}
printf("\n%i\n", scount);
printf("\n%i\n", mcount);
printf("\n%i\n", hcount);
}
return 0;
}


Thursday 28 July 2016

A database in C that uses error trapping in the create new record and delete record routines to make it user friendly.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000

typedef struct {
char name[42];
char street[42];
char district[42];
char town[42];
char county[42];
char country[42];
char postcode[42];
char telno[42];
char email[42];
}addr_list;
addr_list address[MAX];
int counter;
void init_list(void), enter(void);
void delete(void), list(void);
void load(void), save(void), copyfile(void), sort(void);
void loadbackup(void), outputthree(void);
void outputtwo(void), search(void);
void readLine(char buffer[]);
void swap(int u, int v);
void readinteger(char intbuffer[]);
int main(void)
{
int choice;
char s[80];
counter = 0;
init_list();
for(;;) {
printf("\n");
printf("1.  Create a record\n");
printf("2.  Delete a record\n");
printf("3.  List the file\n");
printf("4.  Save the file\n");
printf("5.  Load the file\n");
printf("6.  Sort the file\n");
printf("7.  Search\n");
printf("8.  Save to a back up file\n");
printf("9.  Load from a backup file or copy\n"); 
printf("10. Copy master file\n");
printf("11. Output to a text file for printing or import into wp\n");
printf("12. Quit\n");
do {
printf("\nEnter your choice: ");
readLine(s);
choice=atoi(s);
}while(choice < 0 && choice > 11);
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: save();
break;
case 5: load();
break;
case 6: sort();
break;
case 7: search();
break;
case 8: outputtwo();
break;
case 9: loadbackup();
break;
case 10: copyfile();
break;
case 11: outputthree();
break;
case 12: exit(0);
}
}
return 0;
}

void init_list(void)
{
register int t;

for(t=0; t<MAX; ++t) address[t].name[0] ='\0';
}

void enter(void)
{
char s[40];
int i;
for(i=1; i<MAX; i++)
if(!*address[i].name)
break;
if(i==MAX)
{
printf("Subscriber array full\n");
return;
}
printf("Enter information on new customer\n");
do
{
printf("Enter name: ");
readLine(address[i].name);
if(strlen(address[i].name)>40)
{
printf("String length is %i\n",strlen(address[i].name));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].name)>40);
do
{
printf("Enter street: ");
readLine(address[i].street);
if(strlen(address[i].street)>40)
{
printf("String length is %i\n",strlen(address[i].street));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].street)>40);
do
{
printf("Enter district / parish: ");
readLine(address[i].district);
if(strlen(address[i].district)>40)
{
printf("String length is %i\n",strlen(address[i].district));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].district)>40);
do
{
printf("Enter town / city: ");
readLine(address[i].town);
if(strlen(address[i].town)>40)
{
printf("String length is %i\n",strlen(address[i].town));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].town)>40);
do
{
printf("Enter county: ");
readLine(address[i].county);
if(strlen(address[i].county)>40)
{
printf("String length is %i\n",strlen(address[i].county));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].county)>40);
do
{
printf("Enter country: ");
readLine(address[i].country);
if(strlen(address[i].country)>40)
{
printf("String length is %i\n",strlen(address[i].country));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].country)>40);
do
{
printf("Enter postcode: ");
readLine(address[i].postcode);
if(strlen(address[i].postcode)>40)
{
printf("String length is %i\n",strlen(address[i].postcode));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].postcode)>40);
do
{
printf("Enter telephone number: ");
readLine(address[i].telno);
if(strlen(address[i].telno)>40)
{
printf("String length is %i\n",strlen(address[i].telno));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].telno)>40);
do
{
printf("Enter email address: ");
readLine(address[i].email);
if(strlen(address[i].email)>40)
{
printf("String length is %i\n",strlen(address[i].email));
printf("Please restrict to forty characters.\n");
}
}while(strlen(address[i].email)>40);
counter=counter+1;
}



void delete(void)
{
char number[20];
int t;
int u;
int count;
int flag=0;
printf("enter a record number #: ");
readLine(number);
for(count=0;number[count]!='\0';count++)
{
if(!isdigit(number[count]))
{
printf("Not a valid number\n.");
flag = 1;
break;
}
}
if(flag == 0)
{
if(number[0] == '\0')
printf("No number entered.\n");
else
{
t=atoi(number);
if(t<1 || t >counter)
printf("Record number not within range.\n");

if(t>=1 && t <=counter)
{
for(u=t; u<=counter; u++){
address[u] = address[u+1];
}
address[counter].name[0] = '\0';
address[counter].street[0] = '\0';
address[counter].district[0] = '\0';
address[counter].town[0] = '\0';
address[counter].county[0] = '\0';
address[counter].country[0] = '\0';
address[counter].postcode[0] = '\0';
address[counter].telno[0] = '\0';
address[counter].email[0] = '\0';
counter = counter -1;
printf("Record deleted.\n");
}
}
}
}

void list(void)
{
register int t;
int count;
count=0;
for(t=1; t<=counter; t++) {
count = count +1;
printf("Record number: %i\n",count);
printf("%s\n", address[t].name);
printf("%s\n", address[t].street);
printf("%s\n", address[t].district);
printf("%s\n", address[t].town);
printf("%s\n", address[t].county);
printf("%s\n", address[t].country);
printf("%s\n", address[t].postcode);
printf("%s\n", address[t].telno);
printf("%s\n", address[t].email);
printf("\n");
}
}

void sort(void)
{
register int u;
register int v;
for(u=1; u<counter; u++)
for (v=u+1; v<=counter; v++){
if( strcmp(address[u].name, address[v].name) >0){
swap(u, v);
}
}
}

void swap(int u, int v)
{
addr_list temp;
temp = address[u];
address[u] = address[v];
address[v] = temp;
}

void save(void)
{
FILE *fp;
register int i;

if((fp=fopen("maillist", "wb"))==NULL) {
printf("Cannot open file.\n");
return;
}

for(i=1; i<MAX; i++)
if(*address[i].name)
if(fwrite(&address[i],
sizeof(address[i]), 1, fp)!=1)
printf("File write error.\n");

fclose(fp);
}

void loadbackup(void)
{
FILE *fp;
register int i;
char filename[30];
printf("Enter a file name.\n");
scanf("%s",filename);
printf("\n");

if((fp=fopen(filename, "rb"))==NULL) {
printf("Cannot open file,\n");
return;
}

init_list();
for(i=1;  i<MAX; i++){
if(fread(&address[i],
sizeof(address[i]), 1, fp)!=1) {
if(feof(fp)) break;
printf("File read error.\n");
}
counter=counter+1;
}
fclose(fp);
}



void load(void)
{
FILE *fp;
register int i;

if((fp=fopen("maillist", "rb"))==NULL) {
printf("Cannot open file,\n");
return;
}

init_list();
for(i=1;  i<MAX; i++){
if(fread(&address[i],
sizeof(address[i]), 1, fp)!=1) {
if(feof(fp)) break;
printf("File read error.\n");
}
counter=counter +1;
}
fclose(fp);
}


void outputthree(void)
{
int t;
int count;
FILE *stream;
char filename[30];
count = 0;
printf("Enter a file name.\n");
scanf("%s",filename);
printf("\n");
stream = fopen(filename, "w+");
for(t=1; t<MAX; t++) {
if(address[t].name[0]) {
count = count +1;
fprintf(stream,"%i\n",count); 
fprintf(stream,"%s\n", address[t].name);
fprintf(stream,"%s\n", address[t].street);
fprintf(stream,"%s\n", address[t].district);
fprintf(stream,"%s\n", address[t].town);
fprintf(stream,"%s\n", address[t].county);
fprintf(stream,"%s\n", address[t].country);
fprintf(stream,"%s\n", address[t].postcode);
fprintf(stream,"%s\n", address[t].telno);
fprintf(stream,"%s\n", address[t].email);
fprintf(stream,"\n");
}
}
fclose(stream);
return;
}



void outputtwo(void)
{
FILE *fp;
register int i;
char filename[30];
printf("Enter a file name.\n");
scanf("%s",filename);
printf("\n");
if((fp=fopen(filename, "wb"))==NULL) {
printf("Cannot open file.\n");
return;
}

for(i=1; i<MAX; i++)
if(*address[i].name)
if(fwrite(&address[i],
sizeof(address[i]), 1, fp)!=1)
printf("File write error.\n");

fclose(fp);
}

void search(void)
{
int i;
int count;
char s[40];
count=0;
printf("\nEnter a name.\n");
readLine(s);
if(strlen(s)!=0)
{
for(i=1;i<MAX;i++)
{
if(address[i].name[0]) {
count = count +1;
}

if (strcmp(s, address[i].name)==0)
{
printf("\nRecord number: %i\n", count);
printf("\nName: %s\n",address[i].name);
printf("\nStreet: %s\n",address[i].street);
printf("\nDistrict: %s\n",address[i].district);
printf("\nTown: %s\n",address[i].town);
printf("\nCounty: %s\n",address[i].county);
printf("\nCountry: %s\n",address[i].country);
printf("\nPostcode:%s\n",address[i].postcode);
printf("\nTelephone number: %s\n",address[i].telno);
printf("\nEmail address: %s\n",address[i].email);
printf("\n");
}
}
}
}

void copyfile(void)
{
FILE *in, *out;
int c;
char filename[30];
if ((in = fopen ("maillist", "r")) ==NULL){
printf("Cant open %s file for reading.\n","cdlist");
}
printf("Enter a file name.for the target file\n");
scanf("%s",filename);
printf("\n");
if ((out = fopen(filename, "w")) ==NULL){
printf("Cant open %s for writing.\n", "cdlistbackup");
}

while ((c = getc (in)) !=EOF)
putc (c, out);
fclose (in);
fclose(out);
printf("File has been copied.\n");
}

void readLine(char buffer[])
{
char character;
int i=0;
do
{
character=getchar();
buffer[i]=character;
++i;
}
while(character !='\n');
buffer[i-1]='\0';
}


void readinteger(char intbuffer[])
{
int number;
int j=0;
do
{
number=getchar();
intbuffer[j]=number;
++j;
}
while(number !='\n');
intbuffer[j-1]='\0';
}

C program for regression / line of best fit for when there is scatter of data. the equation is y = a + bx

#include<stdio.h>

main()
{
int i, noofvar;
float xi, yi, xsum, ysum, xysum, xxsum, a, b;
xsum = 0;
ysum = 0;
xysum = 0;
xxsum = 0;
printf("The output of this program will give two values a and b.\n");
printf("a and b can be used in the equation y =  a + bx.\n");
printf("Using the equation with a and b will give a regression.\n");
printf("A plot from the equation will give a line of best fit.\n");
printf("Enter the number of pairs of x and y variables:\n");
scanf("%i", &noofvar);
for(i = 1; i<=noofvar; i++)
{
printf("Enter x value %i\n",i);
scanf("%f", &xi);
printf("Enter y value %i\n", i);
scanf("%f", &yi);
xsum = xsum + xi;
ysum = ysum + yi;
xysum = xysum + xi * yi;
xxsum = xxsum + xi * xi;
}

b = (noofvar * xysum - xsum * ysum) / (noofvar * xxsum - xsum * xsum);
a = (ysum - b * xsum) / noofvar;
printf("Value of a is %f\n", a);
printf("Value of b is %f\n", b);
}

Tuesday 31 May 2016

New ebook on simple C listings for indexed sequential file databases

I have just published a new ebook on simple C listings for indexed sequential file databases. The book and the C source code / C listings contained in it are open source. The link to the website to download it for free is

Open source ebook on databases written in C.


A website that has free Windows programs to download including working examples of C programs has the following link

A website of free programs including C databases.

Monday 23 May 2016

A barchart plotter for integers written in C. Data saved to file and barchart written to txt file for import into word processor

This program is compiled in Linux with the gcc command
gcc programname.c -lm
The -lm means that the maths funtions are included during compilation.
From the terminal using the directory containg the file / compiler output the program can b run using ./a.out

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#define max 100
int number, ymax;
int ploty[max];
void createbar(void), updatebar(void), savedata(void), loadbar(void), plot(void), savebartxt(void);
int main(void)
{
int choice;
for(;;) {
printf("\n");
printf("1. Create a barchart.\n");
printf("2. Save barchart to a .txt file for printing.\n");
printf("3. Save data to to a data file to plot again later\n");
printf("4. Append data to a barchart.\n");
printf("5. Load a bar chart from data file.\n");
printf("6. Quit\n");
do {
printf("\nEnter your choice: ");
scanf("%i", &choice);
}while(choice < 0 && choice > 5);
switch(choice) {
case 1: createbar();
break;
case 2: savebartxt();
break;
case 3: savedata();
break;
case 4: updatebar();
break;
case 5: loadbar();
break;
case 6: exit(0);
}
}
return 0;
}
void createbar(void)
{
  int  y_data;
  int i, j, k;
for(k=1; k<=max; k++)
ploty[k] = '\0';
printf("Enter the number of y points to plot.\n");
printf("Maximum number of points is 100 or type 111 to exit.\n");
scanf("%i", &number);
if(number == 111) exit(0);
printf("Enter the maximum / largest yvalue.\n");
scanf("%i", &ymax);
for(j=1; j<=number; j++)
{
 printf("Enter y datum %i\n", j);
 scanf("%i", &y_data);
 ploty[j]=y_data;
}
plot();

}

void plot(void)
{
int xdatum, ydatum;
int i;
int yvalue;
float yscale, ybar, maxsize = 60.0;
printf( "y_data---------->\n");
  for(i=1; i<=number; i++)
    {
  yscale = maxsize/ymax;
ybar = yscale* ploty[i];
yvalue = round(ybar);  
for(xdatum =1; xdatum<=3; xdatum++){
for(ydatum=1; ydatum<=yvalue; ydatum++)
      printf("*");
 printf("\n");
}
printf("\n");
}
}


void updatebar(void)
{
  int xdatum, ydatum;
  int  y_data;
  int  i, j, l;
   FILE *prnt;
for(l=1; l<=max; l++)
ploty[l] = '\0';
 printf("Enter the number of y points to plot.\n");
     scanf("%i", &number);
for(j=1; j<=number; j++)
{
 printf("Enter y datum %i\n", j);
 scanf("%i", &y_data);
 ploty[j]=y_data;
}
printf( "y_data---------->\n");
  for(i=1; i<=number; i++)
    {
 
for(xdatum =1; xdatum<=3; xdatum++){
   for(ydatum=1; ydatum<=ploty[i]; ydatum++)
      printf("*");
 printf("\n");
}
printf("\n");
}

FILE *fp;
char filename[30];
printf("Enter a file name .txt to add bars to an already existing chart.\n");
scanf("%s",filename);
printf("\n");
fp = fopen(filename, "a+");
if((fp=fopen(filename, "a+"))==NULL) {
printf("Cannot open file.\n");
return;
}

time_t lt;
struct tm *ptr;
lt = time(NULL);
ptr = localtime(&lt);
fprintf(fp,"%s\n",asctime(ptr));

for(i=1; i<=number; i++)
    {
for(xdatum =1; xdatum<=3; xdatum++){
   for(ydatum=1; ydatum<=ploty[i]; ydatum++)
      fprintf(fp,"*");
 fprintf(fp,"\n");
}
fprintf(fp,"\n");
}
fclose(fp);

FILE *fp2;
char filename2[30];
int k;
printf("Enter a file name .dat to add data to plot at a later date.\n");
scanf("%s",filename2);
printf("\n");
fp2 = fopen(filename2, "a+");
if((fp2=fopen(filename2, "a+"))==NULL) {
printf("Cannot open file.\n");
return;
}
for(k = 1; k<= number; k++)
{
fprintf(fp2,"%i", ploty[k]);
fprintf(fp2,"\n");
}
fclose(fp2);
return;

}

void savedata(void)
{
FILE *fp;
char filename[30];
int i;
printf("Enter a file name .dat to contain data to plot at a later.\n");
printf("This can be printed using a text editor.\n");
scanf("%s",filename);
printf("\n");
if((fp=fopen(filename, "w"))==NULL) {
printf("Cannot open file.\n");
return;
}
fprintf(fp,"%i\n", ymax);
for(i = 1; i<= number; i++)
{
fprintf(fp,"%i", ploty[i]);
fprintf(fp,"\n");
}
fclose(fp);
return;
}

void loadbar(void)
{
int i;
char filename[30];
FILE *fp;
number = 0;
for(i=1; i<=max; i++)
ploty[i] ='\0';
printf("Enter a file name .dat containing data to plot.\n");
scanf("%s",filename);
printf("\n");
if((fp=fopen(filename, "r"))==NULL) {
printf("Cannot open file.\n");
return;
}
fscanf(fp,"%i", &ymax);
while(!feof(fp))
{
number = number + 1;
fscanf(fp, "%i", &ploty[number]);
}
fclose(fp);
plot();
}

void savebartxt(void)
{
FILE *fp;
char filename[30];
int i;
int xdatum, ydatum;
int yvalue;
float yscale, ybar, maxsize = 60.0;
printf("Enter a file .txt name to contain the bar chart.\n");
printf("This can be printed using a text editor. \n");
scanf("%s",filename);
printf("\n");
if((fp=fopen(filename, "w"))==NULL) {
printf("Cannot open file.\n");
return;
}
time_t lt;
struct tm *ptr;
lt = time(NULL);
ptr = localtime(&lt);
fprintf(fp,"%s\n",asctime(ptr));

fprintf(fp, "y_data---------->\n");
  for(i=1; i<=number; i++)
    {
 yscale = maxsize/ymax;
ybar = yscale* ploty[i];
yvalue = round(ybar);  

for(xdatum =1; xdatum<=3; xdatum++){
   for(ydatum=1; ydatum<=yvalue; ydatum++)
      fprintf(fp,"*");
 fprintf(fp,"\n");
}
fprintf(fp,"\n");
}
fclose(fp);
return;
}

f = cos(x) + cos(y) implemented in C

This program is compiled in Linux using the gcc command
gcc programname.c -lm
The -lm means that the maths funtions are included during compilation.

#include<stdio.h>
#include<math.h>

main()
{
const space = ' ', screenheight = 60, ycentre = 30, screenwidth = 70;
const xcentre = 35;
float xscale =7.0 , yscale = 7.0;
char screen[screenwidth][screenheight];
float xs, ys, interval, fvalue;
int period, row, col, ft, x, y, startx, starty, stopx, stopy;
char point;

/*insert spaces*/
for(col=0; col<=screenwidth; col++)
for(row=0; row<=screenheight; row++)
screen[row][col] = space;

startx = -xcentre;
stopx = xcentre;
starty =  -ycentre;
stopy = ycentre;
for(y = starty; y <= stopy; y++)
for(x = startx; x <= stopx; x++)
{
xs = x/xscale;
ys = y/yscale;
printf("xs =%f\n",xs);
printf("xy=%f\n",ys);
fvalue = cos(xs) + cos(ys);
ft=round((fvalue + 2) * 2.5);
printf("%i\n", ft);
switch(ft)
{
case 0: point = 'A';
break;
case 1: point = ' ';
break;
case 2: point = 'B';
break;
case 3: point = ' ';
break;
case 4: point = 'C';
break;
case 5: point = ' ';
break;
case 6: point = 'D';
break;
case 7: point = ' ';
break;
case 8: point = 'E';
break;
case 9: point = ' ';
break;
case 10: point = 'F';
}
screen[x+xcentre][y+ycentre] = point;
}
/*draw graph*/
for(row =0; row <= screenheight; row++)
{
for(col=0; col<=screenwidth; col++)
printf("%c",screen[row][col]);
printf("\n");
}

}

Sine wave plot implemented in C

This program is compiled using the gcc command in Linux
gcc programname.c -lm
The -lm means the mathe functions are included during compilation.

#include<stdio.h>
#include<math.h>
#define PI 3.1415926


main()
{
const increment = 15, scale = 30, centre = 40;
int angle;
int i, j;
angle = 0;
do
{
j = centre-scale*sin(angle*PI/180);
for(i=1; i<=j; i++)
printf(" ");
printf("sine\n");
angle = angle + increment;
}while(angle <= 720);
return 0;
}