常用程序

ASCII编码程序:

#include <stdio.h>
Int main(void)
{  char x=?(num);  printf(“%c”,x);  return 0;   }

解码:char x=’?(字符即字母或标点)’; print(“%d”,x);~

typesize.c -- 打印类型大小 *

#include <stdio.h>  int main(void)
{/* C99为类型大小提供%zd转换说明 */
printf("Type int has a size of %zd bytes.\n",
sizeof(int));
printf("Type char has a size of %zd bytes.\n",
sizeof(char));
printf("Type long has a size of %zd bytes.\n",
sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}

自定义输入/输出函数示例:

  • 打印字符串,不添加换行符:
#include <stdio.h>
void put1(const char * string)/* 不会改变字符串 */
{while (*string != '\0')
putchar(*string++);    }

重复输入,直到文件结尾程序

#include <stdio.h>
int main(void)
{   int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;   }

变量ch的类型从char变为int,因为char类型的变量只能表示0~255的无符号整数,但是EOF的值是-1。getchar()函数实际返回值的类型是int,所以它可以读取EOF字符。如果实现使用有符号的char类型,也可以把ch声明为char类型。使用该程序进行键盘输入,要设法输入EOF字符。不能只输入字符EOF,也不能只输入-1(输入-1会传送两个字符:一个连字符和一个数字1)。正确的方法是,必须找出当前系统的要求。例如,在大多数UNIX和Linux系统中,在一行开始处按下Ctrl+D会传输文件结尾信号。一些系统把任意位置的Ctrl+Z解释成文件结尾信号。

排除缓冲区换行符影响示例:

while (getchar() != 'y') /* 获取响应,与 y 做对比*/
{
printf("Well, then, is it %d?\n", ++guess);
while (getchar() != '\n')
continue; /* 跳过剩余的输入行 */   }

文件作用域示例

#include <stdio.h>
int units = 0; /* 该变量具有文件作用域 */
void critic(void);
int main(void)
{
...
}
void critic(void)
{
...
}

外部链接与内部链接示例

int giants = 5; // 文件作用域,外部链接
static int dodgers = 3; // 文件作用域,内部链接
int main()
{
...
}
...
  • 该文件和同一程序的其他文件都可以使用变量giants。而变量dodgers属文件私有,该文件中的任意函数都可使用它。

do while 循环辅助理解程序:

#include <stdio.h>
int main(void)
{	const int secret_code = 13;
	int code_entered;
	do{		printf("To enter the triskaidekaphobia therapy club,\n");
		    printf("please enter the secret code number:  ");
          scanf("%d",&code_entered);	  }  
while (code_entered != secret_code);
	printf("Congratulations! You are cured!\n");
	return 0;    }

swich语句辅助理解程序

该表达式是刚输入给 ch的值。然后程序扫描标签(这里指,case 'a' :、case 'b' :等)列表,直到发现一个匹配的值为止。然后程序跳转至那一行。如果没有匹配的标签怎么办?如果有default :标签行,就跳转至该行;否则,程序继续执行在switch后面的语句。break语句在其中让程序离开switch语句,跳至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾。例如,如果删除该程序中的所有break语句,运行程序后输入d,其交互的输出结果会执行从case 'd':到switch语句末尾的所有语句。

switch (ch)
{
case 'a':
printf("argali, a wild sheep of Asia\n");
break;
case 'b':
printf("babirusa, a wild pig of Malay\n");
break;
case 'c':
printf("coati, racoonlike mammal\n");
break;
case 'd':
printf("desman, aquatic, molelike critter\n");
break;
case 'e':
printf("echidna, the spiny anteater\n");
break;
case 'f':
printf("fisher, brownish marten\n");
break;
default:
printf("That's a stumper!\n");   } /* switch结束 */

指针辅助理解程序示例:

#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); // 把地址发送给函数,该函数传递的不是x和y的值,而是它们的地址。这意味着出现在interchange()原型和定义中的形式参数u和v将把地址作为它们的值。因
此,应把它们声明为指针。
printf("Now x = %d and y = %d.\n", x, y);
return 0;   }
void interchange(int * u, int * v)
{int temp;
temp = *u; // temp获得 u 所指向对象的值,u的值是&x,所以u指向x。这意味着用*u即可表示x的值,
*u = *v;
*v = temp;    }

指针加一辅助理解程序示例:

#include <stdio.h>
#define SIZE 4
int main(void)
{short dates[SIZE];
short * pti;
short index;
double bills[SIZE];
double * ptf;
pti = dates; // 把数组地址赋给指
ptf = bills;
printf("%23s %15s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0;   }

在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着把加1后的地址是下一个元素的地址,而不是下一个字节的地址。在指针前面使用运算符可以得到该指针所指向对象的值。指针加1,指针的值递增它所指向类型的大小(以字节为单位)。
dates + 2 == &date[2] // 相同的地址
(dates + 2) == dates[2]` // 相同的值

编写一个处理数组的函数示例:

阐明包含数组元素个数的信息。第一种方法:在函数代码中写上固定的数组大小

int sum(int * ar) // 相应的函数定义,对应的函数原型
{
int i;
int total = 0;
for (i = 0; i < 10; i++) // 假设数组有10个元素
total += ar[i]; // ar[i] 与 *(ar + i) 相同
return total;     }

sum()从该参数获得了什么信息?它获得了该数组首元素的地址,知道要在该位置上找出一个整数。
第二种:

int sum(int * ar, int n) // 更通用的方法
{int i;
int total = 0;
for (i = 0; i < n; i++) // 使用 n 个元素
total += ar[i]; // ar[i] 和 *(ar + i) 相同
return total;     }

只有在函数原型或函数定义头中,才可以用int ar[]代替int * ar。int *ar形式和int ar[]形式都表示ar是一个指向int的指针。

声明数组形参

  • 因为数组名是该数组首元素的地址,作为实际参数的数组名要求形式参数是一个与之匹配的指针。只有在这种情况下,C才会把int ar[]和int * ar解释成一样。也就是说,ar是指向int的指针。由于函数原型可以省略参数名,所以下面4种原型都是等价的:
    int sum(int *ar, int n); int sum(int *, int); int sum(int ar[], int n); int sum(int [], int);
    但是,在函数定义中不能省略参数名。下面两种形式的函数定义等价:
    int sum(int *ar, int n); int sum(int ar[], int n);

函数s_geats:去掉fgets()末尾的换行符

char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}

结构辅助理解程序

//* book.c -- 一本书的图书目录 */
#include <stdio.h>
#include <string.h>
char * s_gets(char * st, int n);
#define MAXTITL 41 /* 书名的最大长度 + 1 */
#define MAXAUTL 31 /* 作者姓名的最大长度 + 1*/
struct book { /* 结构模版:标记是 book */
char title[MAXTITL];
char author[MAXAUTL];
float value;
}; /* 结构模版结束 */
int main(void)
{
struct book library; /* 把 library 声明为一个 book 类型的变量 */
printf("Please enter the book title.\n");
s_gets(library.title, MAXTITL); /* 访问title部分*/
printf("Now enter the author.\n");
s_gets(library.author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library.value);
printf("%s by %s: $%.2f\n", library.title,library.author, library.value);
printf("%s: \"%s\" ($%.2f)\n", library.author,library.title, library.value);
printf("Done.\n");
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}

素数判断:

int isPrime(int )
int isPrime(int n)
{
    int div,i;
    for (div = 2; (div * div) <= n; div++)
    {
      if (n % div == 0)
      {
        i++;
        break;
      }
    } 
    if(i)
    return 0;
    else
    return 1;
}

冒泡排序示例:

int ch,i1,i;
    for(i=0;i<(n-1);i++)
	{
		for(i1=0;i1<(n-1-i);i1++)
        {
				if(a[i1]>a[i1+1])
                {
					ch=a[i1];
					a[i1]=a[i1+1];
					a[i1+1]=ch;
				}
			}
		}

插入排序示例

void InsertSort(int a[],int n)
{
	int i,i1,i2,i3,i4,ch;

		for(i1=1;i1<n;i1++)//
		{
			for(i2=0;i2<i1;i2++)//bidaxaio
			{
				if(a[i1]<a[i2])
				{
					ch=a[i1];
					for(i3=(i1-1);i3>=i2;i3--)
					a[i3+1]=a[i3];
					a[i2]=ch;
				}
			}
			for(i4=0;i4<(n-1);i4++)
			printf("%d ",a[i4]);
			printf("%d\n",a[n-1]);
		}
}

选择排序示例:

void selectSort(int data[],int elementCount)
{
	int i,i1,ch;
	for(i=0;i<(elementCount)-1;i++)
	{
		i1=findMin(data,i,elementCount-1); 
		ch=data[i];
		data[i]=data[i1];
		data[i1]=ch;
	}
	outputData(data,elementCount);
}
int findMin(int data[], int startLoc, int endLoc)
{
	int i,i1;
	int minn=data[startLoc];
	for(i=startLoc;i<=endLoc;i++)
	{
		int i2=0;
		for(i1=startLoc;i1<=endLoc;i1++)
		{
			if(data[i]>data[i1])
			i2++;
		}
		if(i2==0)
		{
			return i;
		}
	}
}
void outputData(int data[],int elementCount)//
{
	int i;
	for( i = 0 ; i < elementCount - 1 ; i++ )
        printf( "%d " , data[i] ) ;
    printf( "%d\n" , data[i] ) ;
}

两个正整数的最大公约数:

  • 基于欧几里得算法。两个数的乘积等于它们的最大公约数与最小公倍数的乘积。
#include<stdio.h>
int GCD(int a , int b );
int main()
{
    int        a , b ;
    
    scanf("%d%d", &a , &b );
    printf( "%d\n" , GCD( a, b ) ) ;
     
    return 0 ;    
}
int GCD(int a , int b )
{
	if(a>=b)
	{
		if(a%b==0)
		return b;
		else
		return GCD(b,a%b);
	}
	else
	{
		if(b%a==0)
		return a;
		else
		return GCD(a,b%a);
	}
}
```### ASCII编码程序:
```c
#include <stdio.h>
Int main(void)
{  char x=?(num);  printf(“%c”,x);  return 0;   }

解码:char x=’?(字符即字母或标点)’; print(“%d”,x);~

typesize.c -- 打印类型大小 *

#include <stdio.h>  int main(void)
{/* C99为类型大小提供%zd转换说明 */
printf("Type int has a size of %zd bytes.\n",
sizeof(int));
printf("Type char has a size of %zd bytes.\n",
sizeof(char));
printf("Type long has a size of %zd bytes.\n",
sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}

自定义输入/输出函数示例:

  • 打印字符串,不添加换行符:
#include <stdio.h>
void put1(const char * string)/* 不会改变字符串 */
{while (*string != '\0')
putchar(*string++);    }

重复输入,直到文件结尾程序

#include <stdio.h>
int main(void)
{   int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;   }

变量ch的类型从char变为int,因为char类型的变量只能表示0~255的无符号整数,但是EOF的值是-1。getchar()函数实际返回值的类型是int,所以它可以读取EOF字符。如果实现使用有符号的char类型,也可以把ch声明为char类型。使用该程序进行键盘输入,要设法输入EOF字符。不能只输入字符EOF,也不能只输入-1(输入-1会传送两个字符:一个连字符和一个数字1)。正确的方法是,必须找出当前系统的要求。例如,在大多数UNIX和Linux系统中,在一行开始处按下Ctrl+D会传输文件结尾信号。一些系统把任意位置的Ctrl+Z解释成文件结尾信号。

排除缓冲区换行符影响示例:

while (getchar() != 'y') /* 获取响应,与 y 做对比*/
{
printf("Well, then, is it %d?\n", ++guess);
while (getchar() != '\n')
continue; /* 跳过剩余的输入行 */   }

文件作用域示例

#include <stdio.h>
int units = 0; /* 该变量具有文件作用域 */
void critic(void);
int main(void)
{
...
}
void critic(void)
{
...
}

外部链接与内部链接示例

int giants = 5; // 文件作用域,外部链接
static int dodgers = 3; // 文件作用域,内部链接
int main()
{
...
}
...
  • 该文件和同一程序的其他文件都可以使用变量giants。而变量dodgers属文件私有,该文件中的任意函数都可使用它。

do while 循环辅助理解程序:

#include <stdio.h>
int main(void)
{	const int secret_code = 13;
	int code_entered;
	do{		printf("To enter the triskaidekaphobia therapy club,\n");
		    printf("please enter the secret code number:  ");
          scanf("%d",&code_entered);	  }  
while (code_entered != secret_code);
	printf("Congratulations! You are cured!\n");
	return 0;    }

swich语句辅助理解程序

该表达式是刚输入给 ch的值。然后程序扫描标签(这里指,case 'a' :、case 'b' :等)列表,直到发现一个匹配的值为止。然后程序跳转至那一行。如果没有匹配的标签怎么办?如果有default :标签行,就跳转至该行;否则,程序继续执行在switch后面的语句。break语句在其中让程序离开switch语句,跳至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾。例如,如果删除该程序中的所有break语句,运行程序后输入d,其交互的输出结果会执行从case 'd':到switch语句末尾的所有语句。

switch (ch)
{
case 'a':
printf("argali, a wild sheep of Asia\n");
break;
case 'b':
printf("babirusa, a wild pig of Malay\n");
break;
case 'c':
printf("coati, racoonlike mammal\n");
break;
case 'd':
printf("desman, aquatic, molelike critter\n");
break;
case 'e':
printf("echidna, the spiny anteater\n");
break;
case 'f':
printf("fisher, brownish marten\n");
break;
default:
printf("That's a stumper!\n");   } /* switch结束 */

指针辅助理解程序示例:

#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); // 把地址发送给函数,该函数传递的不是x和y的值,而是它们的地址。这意味着出现在interchange()原型和定义中的形式参数u和v将把地址作为它们的值。因
此,应把它们声明为指针。
printf("Now x = %d and y = %d.\n", x, y);
return 0;   }
void interchange(int * u, int * v)
{int temp;
temp = *u; // temp获得 u 所指向对象的值,u的值是&x,所以u指向x。这意味着用*u即可表示x的值,
*u = *v;
*v = temp;    }

指针加一辅助理解程序示例:

#include <stdio.h>
#define SIZE 4
int main(void)
{short dates[SIZE];
short * pti;
short index;
double bills[SIZE];
double * ptf;
pti = dates; // 把数组地址赋给指
ptf = bills;
printf("%23s %15s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0;   }

在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着把加1后的地址是下一个元素的地址,而不是下一个字节的地址。在指针前面使用运算符可以得到该指针所指向对象的值。指针加1,指针的值递增它所指向类型的大小(以字节为单位)。
dates + 2 == &date[2] // 相同的地址
(dates + 2) == dates[2]` // 相同的值

编写一个处理数组的函数示例:

阐明包含数组元素个数的信息。第一种方法:在函数代码中写上固定的数组大小

int sum(int * ar) // 相应的函数定义,对应的函数原型
{
int i;
int total = 0;
for (i = 0; i < 10; i++) // 假设数组有10个元素
total += ar[i]; // ar[i] 与 *(ar + i) 相同
return total;     }

sum()从该参数获得了什么信息?它获得了该数组首元素的地址,知道要在该位置上找出一个整数。
第二种:

int sum(int * ar, int n) // 更通用的方法
{int i;
int total = 0;
for (i = 0; i < n; i++) // 使用 n 个元素
total += ar[i]; // ar[i] 和 *(ar + i) 相同
return total;     }

只有在函数原型或函数定义头中,才可以用int ar[]代替int * ar。int *ar形式和int ar[]形式都表示ar是一个指向int的指针。

声明数组形参

  • 因为数组名是该数组首元素的地址,作为实际参数的数组名要求形式参数是一个与之匹配的指针。只有在这种情况下,C才会把int ar[]和int * ar解释成一样。也就是说,ar是指向int的指针。由于函数原型可以省略参数名,所以下面4种原型都是等价的:
    int sum(int *ar, int n); int sum(int *, int); int sum(int ar[], int n); int sum(int [], int);
    但是,在函数定义中不能省略参数名。下面两种形式的函数定义等价:
    int sum(int *ar, int n); int sum(int ar[], int n);

函数s_geats:去掉fgets()末尾的换行符

char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}

结构辅助理解程序

//* book.c -- 一本书的图书目录 */
#include <stdio.h>
#include <string.h>
char * s_gets(char * st, int n);
#define MAXTITL 41 /* 书名的最大长度 + 1 */
#define MAXAUTL 31 /* 作者姓名的最大长度 + 1*/
struct book { /* 结构模版:标记是 book */
char title[MAXTITL];
char author[MAXAUTL];
float value;
}; /* 结构模版结束 */
int main(void)
{
struct book library; /* 把 library 声明为一个 book 类型的变量 */
printf("Please enter the book title.\n");
s_gets(library.title, MAXTITL); /* 访问title部分*/
printf("Now enter the author.\n");
s_gets(library.author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library.value);
printf("%s by %s: $%.2f\n", library.title,library.author, library.value);
printf("%s: \"%s\" ($%.2f)\n", library.author,library.title, library.value);
printf("Done.\n");
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}

素数判断:

int isPrime(int )
int isPrime(int n)
{
    int div,i;
    for (div = 2; (div * div) <= n; div++)
    {
      if (n % div == 0)
      {
        i++;
        break;
      }
    } 
    if(i)
    return 0;
    else
    return 1;
}

冒泡排序示例:

int ch,i1,i;
    for(i=0;i<(n-1);i++)
	{
		for(i1=0;i1<(n-1-i);i1++)
        {
				if(a[i1]>a[i1+1])
                {
					ch=a[i1];
					a[i1]=a[i1+1];
					a[i1+1]=ch;
				}
			}
		}

插入排序示例

void InsertSort(int a[],int n)
{
	int i,i1,i2,i3,i4,ch;

		for(i1=1;i1<n;i1++)//
		{
			for(i2=0;i2<i1;i2++)//bidaxaio
			{
				if(a[i1]<a[i2])
				{
					ch=a[i1];
					for(i3=(i1-1);i3>=i2;i3--)
					a[i3+1]=a[i3];
					a[i2]=ch;
				}
			}
			for(i4=0;i4<(n-1);i4++)
			printf("%d ",a[i4]);
			printf("%d\n",a[n-1]);
		}
}

选择排序示例:

void selectSort(int data[],int elementCount)
{
	int i,i1,ch;
	for(i=0;i<(elementCount)-1;i++)
	{
		i1=findMin(data,i,elementCount-1); 
		ch=data[i];
		data[i]=data[i1];
		data[i1]=ch;
	}
	outputData(data,elementCount);
}
int findMin(int data[], int startLoc, int endLoc)
{
	int i,i1;
	int minn=data[startLoc];
	for(i=startLoc;i<=endLoc;i++)
	{
		int i2=0;
		for(i1=startLoc;i1<=endLoc;i1++)
		{
			if(data[i]>data[i1])
			i2++;
		}
		if(i2==0)
		{
			return i;
		}
	}
}
void outputData(int data[],int elementCount)//
{
	int i;
	for( i = 0 ; i < elementCount - 1 ; i++ )
        printf( "%d " , data[i] ) ;
    printf( "%d\n" , data[i] ) ;
}

两个正整数的最大公约数:

  • 基于欧几里得算法。两个数的乘积等于它们的最大公约数与最小公倍数的乘积。
#include<stdio.h>
int GCD(int a , int b );
int main()
{
    int        a , b ;
    
    scanf("%d%d", &a , &b );
    printf( "%d\n" , GCD( a, b ) ) ;
     
    return 0 ;    
}
int GCD(int a , int b )
{
	if(a>=b)
	{
		if(a%b==0)
		return b;
		else
		return GCD(b,a%b);
	}
	else
	{
		if(b%a==0)
		return a;
		else
		return GCD(a,b%a);
	}
}
posted @ 2024-10-05 21:18  micryfotctf  阅读(28)  评论(0)    收藏  举报