一、基础知识:
1. 普通变量(整型、单精度实型、双精度实型、字符型)的定义、数组的定义、指针变量的定义、结构体变量的定义
2. 以上变量的输入输出方法。

二、考试中常见的典型程序设计题目
(一)顺序结构程序设计
1.按照给出的公式求三角形的面积、梯形面积,华氏温度转换为摄氏温度

#include<stdio.h>
#include<math.h>
//知道三角形三边长,求面积
//海伦公式 
int main(){
   
	double a,b,c;//定义变量三边长 
	double s,p;
	
	scanf("%lf %lf %lf",&a,&b,&c);//输入 
	if(a+b>c||a+c>b||b+c>a){
   
		p=(a+b+c)/2;
		s=sqrt(p*(p-a)*(p-b)*(p-c));
		printf("%.2lf",s);//保留两位小数 
	} 
	else{
   
		printf("无法构成三角形"); 
	}
	return 0;
}

#include<stdio.h>
#include<math.h>
//梯形面积 
int main(){
   
	double a,b,h;//上底、下底和高 
	double s;
	
	scanf("%lf %lf %lf",&a,&b,&h);//输入 
	printf("%.2lf",(a+b)*h/2);//面积公式输出 
	return 0;
}


#include<stdio.h>
#include<math.h>
//华氏温度转换为摄氏温度
int main(){
   
	
	double f;//定义 
	scanf("%lf",&f);//输入 
  	printf("fahr = %lf, celsius = %lf\n",f,5.0*(f-32)/9);
  	return 0;
}

2.字母大小写之间的转换

(二)选择结构程序设计
1.分段函数
2.百分制成绩转换成等级制成绩

#include <stdio.h> 
int main()
{
   
	int score;//定义
	int grade;
	scanf("%d", &score);//输入
	grade = score / 10;
    if(score<0||score>100){
   
        printf("Data Error");}
        else
	switch (grade)//switch判断
	{
   
	case 10:
	case 9:
		printf("A\n");
		break;//退出
	case 8:
		printf("B");
		break;
	case 7:
		printf("C");
		break;
	case 6:
		printf("D");
		break;
	default:
		printf("E");
		break;
	}
	return 0;
}

3.判断闰年

#include <stdio.h>
//能被 4 整除的大多是闰年,但能被 100 整除 而不能被 400 整除的年份不是闰年
int main(){
   
	int a;
	scanf("%d",&a); 
	if((a%4!=0)||(a%100==0&&a%400!=0))
	printf("%d年不是闰年",a);
	else
	printf("%d年是闰年",a);
}

(三)循环
1.求n个数的和

#include<stdio.h>
int main(){
   
	int n,sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
   
		sum+=i;
	}
	printf("%d",sum);
}

求n的阶乘

#include<stdio.h>
int main(){
   
	int n,t=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
   
		t*=i;
	}
	printf("%d",t);
}

3. 输出水仙花数、完数、质数

#include <stdio.h>
//水仙花数
int main()
{
   
	int a,b,c,n;
	printf("3位数以内的水仙花数为:\n");
	for (n=100;n<=999;n++)
	{
   
		a=n/100;
		b=n/10%10;
		c=n%100%10;
		if(n==a*a*a+b*b*b+c*c*c) printf("%d\t",n);
	}
	printf("\n");
    return 0;
}
#include<stdio.h>
int main(){
   
	int sum;
	//1000以内的完数 
	for(int i=2;i<=1000;i++) {
   
		int sum=0;
		for(int j=1;j<i;j++){
   
			int t=i%j;
			if(t==0)
				sum+=j;
		}
		if(sum==i)
			printf("%d\n",i);
	}
	return 0;
}

#include<stdio.h>
#include<math.h>
//判断质数
int main(){
   
	int n,flag=0;
	scanf("%d",&n);
	if(n<=1){
   
		flag=1;
	} 
	for(int i=2;i<=sqrt(n);i++){
   
		if(n%i==0){
   
			flag=1;
			break;
		}
	} 
	if(flag){
   
		printf("%d不是质数",n);
	}else{
   
		printf("%d是质数",n);
	}
	return 0;
}

4.求复杂的前n项和。
如:求pi/4

#include<stdio.h>
#include<math.h>
int main()
{
   
	double term;
	double sum = 0;
	do 
	{
   
		int i = 0;
		term = 1.0 / (2 * i + 1);
		if (i % 2 == 0)
			sum += term;
		else
			sum -= term;

	} while (term < 1e-4);
	printf("%.6f", sum);// pi/4 
	return 0;
}

求e(循环直至项值于10-4。
e=1+1/1!+1/2!+1/3!+1/4!+1/5!+…+1/n! )
/求e的值。e≈1+1/1!+1/2!+1/3!+…,直到最后一项的值小于10的-4次方为止。/

#include <stdio.h>
int main(void)
{
   
	double e=0.0;
	int i=1,j=1,t=1;
	while(1.0/t >= 1e-4)
	{
   
		e+=1.0/t;
		t*=j  ;
		j++;
	}
	printf ("%lf\n",e);
}

4. 九九乘法表

#include <stdio.h>
int main() {
   
    int i,j;  // i, j控制行或列 
    for(i=1;i<=9;i++) {
   
        for(j=1;j<=i;j++)
            // %-5d 控制宽度为5个字符,且左对齐
            printf("%d*%d=%-5d", i, j, i*j);
 
        printf("\n");
    }
    return 0;
}

6.break语句 continue语句
7.求x、y的最大公约数和最小公倍数

#include <stdio.h>

int zhuida(int a,int b){
   
	int temp;
	if(a<b){
   //保证a>b 
		temp=a;
		a=b;
		b=temp;
	}
	while(b!=0){
   //循环求两数的余数,直到余数为0
		temp=a%b;
		a=b;
		b=temp;
	}
	return a;//返回最大公约数 
} 
int zhuixiao(int a,int b){
   
	int zhuida(int a,int b);
	int temp;
	temp=zhuida(a,b);
	return (a*b/temp);//返回最小公倍数 
} 
int main() {
   
    	int x,y;
int div,mul; 
    	scanf("%d %d",&x,&y);
	div=zhuida(x,y);//最大公约数 
	mul=zhuixiao(x,y);//最小公倍数 
	printf("%d %d",div,mul); 
    	return 0;
}
//递归辗转相除求最大公约数
int gcd(int a,int b){
   
	return a%b ? b : gcd(b,a%b);
}

8.有两个红球、三个黄球、四个白球,任意取五个球,其中必须有一个黄球,编程输出所有可能的方案。

#include<stdio.h>
#include<math.h>
int main(){
   
	int red=2,yellow=3,white=4;
	for(int i=0;i<=red;i++){
   
		for(int j=1;j<=yellow;j++){
   
			for(int k=0;k<=white;k++){
   
				if(i+j+k==5){
   
					printf("red=%d yellow=%d white=%d\n",i,j,k);
				} 
			}
		}
	}
	return 0;
}

(四)数组
1.从小到大排序:冒泡法排序、选择法排序

//冒泡排序
void b_sort(int a[],int n){
   
	int temp;
	for(int i=0;i<n-1;i++){
   
		for(int j==0;j<n-i-1;j++){
   
			if(a[j]<a[j+1]){
   
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}

//选择排序
void s_sort(int a[],int n){
   
	int temp;
	for(int i=0;i<n-1;i++){
   
		int min=i;
		for(int j=i+1;j<n;j++){
   
			if(a[j]<a[min]){
   
				min=j;
			}
		}
		if(min!=i){
   
			temp=a[min];
			a[min]=a[i];
			a[i]=temp;
		}
	}
}

2.斐波那契数列前20项

#include<stdio.h>
int main()
{
   
	int n,a[100];
	a[0]=1;
	a[1]=1;
	scanf("%d",&n);
	for(int i=2;i<n;i++){
   
		a[i]=a[i-1]+a[i-2];//递推公式
	}
	for(int i=0;i<n;i++){
   
		printf("%d ",a[i]);//输出
		if(i%5==0&&i!=0){
   //换行
			printf("\n");
		}
	}
	return 0;
}

3.求一维数组元素的和 、平均数 、 最大值(及其下标)

#include<stdio.h>

int main(){
   
	int a[10]={
   1,2,3,4,5,6,7,8,9,10};
	int sum=0;
	double average;
	int max=0,maxnum=a[0];//max最大的下标;maxnum最大的值 
	for(int i=0;i<10;i++){
   
		sum+=a[i];
		if(a[i]>maxnum){
   
			maxnum=a[i];
			max=i;
		}
	}
	average=sum*1.0/10;
	printf("sum=%d average=%lf max=%d maxnum=%d",sum,average,max,maxnum);
	return 0;
}

4.在一个有序数组中插入一个数仍然有序

#include <stdio.h>

void insert(int a[], int n, int x) 
{
   
	int i;
	for (i = n - 1; i >= 0; i--) {
   
		if (a[i]>x) {
   
			a[i+1]=a[i]; // 当比较的数比x大时,将其后移
		} else {
   
			break; // 确定出x要插入的位置
		}
	}
	a[i+1]=x; // 将x插入到数组中
}

int main(void) 
{
   
	int n = 8; // 初始数组大小为8
	int x = 5; // 要插入的数为5
	int A[20] = {
   1, 2, 3, 4, 6, 7, 8, 9};
	insert(A, n, x);
	for (int i = 0; i < n + 1; i++) {
   
		printf("%d ", A[i]);
	}
	return 0;
}

5. 数组的逆序存放

 void reverse(int p[], int n)
{
   
    int i, j, temp;
    for(i=0,j=n-1; i<j; i++,j--)
    {
   
        temp = p[i];
        p[i] = p[j];
        p[j] = temp;
    }
}

6. 求二维数组的转至矩阵、每一行的最大值、每一行的和、对角线元素之和

//用的是五阶矩阵
void zhuanzhihs(){
   //转置函数
	int temp;
	for(int i=0;i<5;i++){
   
		for(int j=0;j<5;j++){
   
			if(j>i){
   
				temp=*(*(p+i)+j);
				*(*(p+i)+j)=*(*(p+j)+i);
				*(*(p+j)+i)=temp;
			}
		}
	}
}
void hangmax(){
   //每一行最大值
	for(int i=0;i<5;i++){
   
		int max=arr[i][0];
		for(int j=0;j<5;j++){
   
			if(arr[i][j]>max){
   
				max=arr[i][j];
			}
		}
		printf("max=%d\n",max);
	}
}
void hangsum(){
   //每行求和 
	for(int i=0;i<5;i++){
   
		int sum=0;
		for(int j=0;j<5;j++){
   
			sum+=arr[i][j];
		}
		printf("sum=%d\n",sum);
	}
}
void duijiaosum(){
   //对角线求和 
	int sum=0;
	for(i=0;i<;i++)
    {
   
        sum+=a[i][i];
        sum+=a[i][2-i];
    }
    sum-=a[3][3];
    printf("%d",sum);
}

7. 杨辉三角

#include <stdio.h>
#define N 20 
int main()
{
   
    int i, j, k, n=0, a[N][N];  
    printf("请输入要打印的行数:");
    scanf("%d",&n);
    printf("%d行杨辉三角如下:\n",n);
    for(i=1;i<=n;i++)
        a[i][1] = a[i][i] = 1; 
 //两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数
    for(i=3;i<=n;i++)
        for(j=2;j<=i-1;j++)  
//i=3和j=2是关键点 
            a[i][j]=a[i-1][j-1]+a[i-1][j];  //除两边的数外都等于上两顶数之和
    for(i=1;i<=n;i++){
   
        for(k=1;k<=n-i;k++)
            printf(" ");  //这一行主要是在输出数之前打上空格占位,让输出的数更美观
        for(j=1;j<=i;j++)  //j<=i的原因是不输出其它的数,只输出我们想要的数
            printf("%5d",a[i][j]);
        
        printf("\n");  //当一行输出完以后换行继续下一行的输出
    }
    printf("\n");
}

8. 自己编程实现 :字符串的拷贝,连接,比较、统计字符个数,

int Strlen(char a[]){
   //长度 
	int b,i,len=0;
	for(i=0;a[i]!='\0';i++)
	len++;
	return len;
}

void strcat1(char a[],char b[]){
   //接长 
	int lena,lenb,i,j;
	lenb=Strlen(b);
	lena=Strlen(a);
	for(i=lena,j=0;i<lena+lenb;i++,j++)
		a[i]=b[j];
}

void copy(char a[],char b[])//strcpy
{
   
	int i;
	for(i=0;a[i]!='\0';i++)
	b[i]=a[i];
}
int strcmp1(char str1[],char str2[])//strcmp
{
   
	int i=0;
	while((str1[i] == str2[i]) && (str1[i] != '\0'))
//自定义实现strcmp();打印不同字符的差值
            i++;
    return str1[i]-str2[i];

}

大写小写互换、大小写字母的个数 字符串中某一字母(例如’a’)的个数

#include <stdio.h>
int main()
{
   
    char a[100];
    int i,cnt=0,cnt1=0,cnt2=0;
    gets(a);
    for(i=0;a[i]!='\0';i++){
   
    	if(a[i]=='a'){
   
    		cnt++;
		}
    	if(a[i]>='a'&&a[i]<='z'){
   
        	a[i]-=32;
            cnt1++;
		} 
        else if(a[i]>='A'&&a[i]<='Z'){
   
        	a[i]+=32;
            cnt2++;
		}
	}
    puts(a);
    printf("a的个数:%d",cnt);
    printf("小写个数:%d 大写个数:%d\n",cnt1,cnt2);
    return 0;
}

9. 判断字符串是否回文

#include<stdio.h>
#include<string.h>
int is_back_content(char str[]){
   
    int i=0,j,len,n;
    len = strlen(str);
    j = len - 1;
    n = len/2;
    while(i<=n){
   
        if(str[i]!= str[j])
            return -1;
        j--;
        i++;
    }
    return 1;
}
int main(){
   
	char str[100];
	gets(str);
	if(is_back_content(str)==1){
   
		printf("是回文"); 
	}else{
   
		printf("不是回文");
	}
}

(五)函数
1.所有前面学过的程序都能转换成函数调用的形式
main函数中输入、调用函数、输出。自定义函数完成相应的功能。
2.函数与一维数组:数组名作为函数参数。(例如一维数组的排序,查找某个数,求最大最小值,求和求平均值,字符数组的比较,连接,统计字符个数,查找某个字符)
//数组部分已经使用,不重复提供
(六)指针
1.利用指针,实现两个数交换内容(函数调用的方法)

void swap(int *a,int *b){
   
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}

2.指针与一维数组 利用指针,作为函数参数(形参和实参都行)
所有函数中一维数组作为参数的例子都可以改成指针来做。(例如一维数组的排序,查找某个数,求最大最小值,求和求平均值,字符数组的比较,连接,统计字符个数,查找某个字符)

//例如字符串的比较
int Strcmp( char* str1, char* str2)
{
   
	while (*str1 == *str2)
	{
   
		if (*str1 == '\0'||( *str2='\0'))
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
//字符串的长度
int Strlen(const char *s)//计数器写法
{
   
    if(s == NULL){
   
        return 0;
    }
    
    int len = 0;
    while(*s++ != '\0'){
   
        len++;
    }
    return len;
}