C语言复试笔记

目录

累加器与累乘器

求最大最小值

大小写转化

键盘输入字符判断类别

判断平闰年

百分制成绩与等级制成绩的相互装换

求两个数的最大公因数和最小公倍数

求菲比拉契数列有限项

验证哥德巴赫猜想

统计学生成绩,包括总成绩、平均成绩、各分数段人数等

用穷举法求某数段的素数、水仙花数、完全平方数等

两矩阵相乘

统计字符中单词个数

求定积分近似值

牛顿迭代法求近似值

二分法


累加器与累乘器

#include<stdio.h>
void main() 
{
	int sum = 0;
	int i;
	for (int i = 0; i < 100; i++)
	{
		sum += i;
	}
	printf("从一加到一百的值为%d \n", sum);
	return 0;
}
#include<stdio.h>
int main(void)
{
	int i;//局部变量
	int p = 1;
	int j;
	printf("请输入j的值");
	scanf_s("%d",&j);
	for (int i = 1; i <= j; i++)
	{
		p = p * i;
	}
	printf("从一乘到一百的值为:%d", p);
	return 0;
}

求最大最小值

#include<stdio.h>
int main()
{//求输入数字的最大值与最小值
	int arr[100];
	int n;
	int min = 9999;
	int max = -999;
	printf("请输入需要比较的数字的大小");
	scanf_s("%d", &n);
	printf("请输入需要比较的数字");
	for (int j = 0; j <= n; j++)
	{
		scanf_s("%d", &arr[j]);

	}
	for (int i = 0; i <= n; i++)
	{	
		if (arr[i] > max)
			max = arr[i];
		else if(arr[i] < min)
			min = arr[i];
	}
	printf("最小值为:%d", min);
	printf("最大值为:%d", max);
	return 0;
}

大小写转化

#include<stdio.h>
int main()
{//大写字母的ascall码值为65-91   小写字母为97-123
	char a;
	printf("请输入字母");
	scanf_s("%c", &a);
	if (a<=91)
	{
		a = a + 32;
		printf("对应的小写字母为%c\n",a);
	}
	else
	{
		a = a - 32;
		printf("对应的大写字母为%c\n", a);
	}
	return 0;
}

键盘输入字符判断类别

#include<stdio.h>
int main()
{
	char a;
	printf("请输入字符");
	//scanf_s("%c", &a);
	a = getchar();
	if (a < 32)
		printf("控制字符\n");
	else if (a >= 48 && a <=57)
		printf("数字字符\n");
	else if (a >= 65 && a <= 90)
		printf("大写字母\n");
	else if (a >= 97 && a <= 122)
		printf("小写字母\n");
	else 
		printf("其他字符\n");
	
	return 0;
}

判断平闰年

#include<stdio.h>
int main()
{	
	int y = 0;
	printf("请输入年份");
	scanf_s("%d", &y);
	if (y % 4 == 0 && y % 100 != 0)
		printf("%d是闰年", y);
	else
		printf("%d是平年", y);
	return 0;
}

百分制成绩与等级制成绩的相互装换

#include<stdio.h>
int main()
{
	char level;
	int n;
	char p;
	int q;
	printf("输入等级成绩请按1,输入百分制成绩请按2\n");
	scanf_s("%d", &n);
	p = getchar(); //这个程序要注意接收字符变量时\n的问题,如果直接输入,没有c=getchar();,level就会接收\n,造成错误。
	if (n == 1)
	{
		printf("请输入等级\n");
		level = getchar();
		switch (level)
		{
		case 'A':
			printf(">=85");
			break;
		case 'B':
			printf("70-85");
			break;
		case 'C':
			printf("60-70");
			break;
		case 'D':
			printf("<60");
			break;
		default:
			printf("输入成绩有错\n");
			break;
		}
	}
	if (n == 2)
	{
		printf("请输入百分制成绩\n");
		scanf_s("%d", &q);
		if (q >= 85)
			printf("A");
		else if (q >= 70 && q <85)
			printf("B");
		else if (q >= 60 && q <= 70)
			printf("C");
		else 
			printf("D");
	}

	return 0;
}

求两个数的最大公因数和最小公倍数

最大公因数:用辗转相除法进行操作。

最小公倍数:两数相乘除以最大公因数。

#include<stdio.h>
int max_divisor(int a, int b)
{
	int c;
	while (a % b != 0)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return c;
}
int main()
{
	printf("请输入两个数字");
	int p, q;
	scanf_s("%d", &q);
	scanf_s("%d", &p);
	int num_1 = max_divisor(p, q);
	int num_2 = (p * q) / num_1;
	printf("最大公约数为:%d", num_1);
	printf("最小公倍数为:%d", num_2);
	return 0;
}

求菲比拉契数列有限项

#include<stdio.h>
int main()
{
	int num = 5;
	int number_1 = fibonac_1(num);
	printf("递归方法:%d\n", number_1);
	printf("循环方法:%d\n", fibonac2(num));
	return 0;
}
//递归
int fibonac_1(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		return fibonac_1(n - 1) + fibonac_1(n - 2);
	}
}
//循环
int fibonac2(int n) {
	int temp = 0, num1 = 1, num2 = 1;
	for (int i = 0; i < n - 2; i++) {
		temp = num1 + num2;
		num1 = num2;
		num2 = temp;
	}
	return temp;
}

验证哥德巴赫猜想

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数(质数)。

任务是将输入的偶数n ,分解为两个素数的所有可能打印出来。

例如:

8 = 3 + 5.

20 = 3 + 17  20 = 7 + 13. 

42 = 5 + 37  40= 11 + 31  40= 13 + 29  40= 19 + 23.

先分解成c=a+b;在依次对a和b进行判断是否是质数,如果同时是质数,就打印。

一个数是否是质数,就是一个数只能被1和它自身整除,没有其他因子。就需要尝试它能否被从2到它的平方根之间的数整除。

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


int  main()
{
	int number;
	int Firstnum;
	int Secondnum;
	int x, y;
	int Temp;
	printf("Please input Number\n");
	scanf_s("%d", &number);
	for (x = 2; x < number ; x++)
	{
		Firstnum = x;
		Temp = sqrt(Firstnum) + 1;
		for (y = 2; y < Temp; y++)
		{
			if (Firstnum % y == 0)
			{
				Firstnum = 0;
				break;
			}
		}
		Secondnum = number - x;
		Temp = sqrt(Secondnum) + 1;
		for (y = 2; y < Temp; y++)
		{
			if (Secondnum % y == 0)
			{
				Secondnum = 0;
				break;
			}
		}
		if (Firstnum && Secondnum)
			printf("%d = %d + %d\r\n", number, Firstnum, Secondnum);

	}
	return 0;
}

统计学生成绩,包括总成绩、平均成绩、各分数段人数等

#include<stdio.h>
int main(void)
{
    int c1, c2, c3, c4, c5, sum;
    float ave;
    scanf_s("%d %d %d %d %d", &c1, &c2, &c3, &c4, &c5);
    sum = c1 + c2 + c3 + c4 + c5;
    ave = sum / 5.00;
    printf("%d %.2f", sum, ave);
	int stu[5];                  //也可以不用数组
	int i;
	int count1 = 0, count2 = 0, count3 = 0, count4 = 0, count5 = 0;
	printf("请输入5位学生的成绩:\n");
	for (i = 0; i < 5; i++)
	{
		scanf_s("%d", &stu[i]);     //20位学生成绩分别用空格隔开
		if (stu[i] >= 90)
			count1++;
		else if (stu[i] >= 80)
			count2++;
		else if (stu[i] >= 70)
			count3++;
		else if (stu[i] >= 60)
			count4++;
		else
			count5++;
	}

	printf("90及90分以上有%d人\n", count1);
	printf("80~89分有%d人\n", count2);
	printf("70~79分有%d人\n", count3);
	printf("60~69分有%d人\n", count4);
	printf("60分以下有%d人\n", count5);

	return 0;
}

指针

#include<stdio.h>

int main(){
int a = 3, *p; /* 定义整型变量a和整型指针p */
p = &a; /* 把变量a的地址赋给指针p,即p指向a */
printf("a = %d, *p = %d\n", a, *p); /* 输出变量a的值和指针p说指向变量的值 */

*p = 10; /* 对指针p所指向的变量赋值,相当于对变量a赋值 */
printf("a = %d, *p = %d\n", a, *p);

printf("请输入a的值:");
scanf("%d", &a); /* 输入a *

在进行指针初始化的时候需要注意一下几点。

在指针变量定义或者初始化时变量名前面的“ * ”只表示该变量是个指针变量,它既不是乘法运算又不是间接访问符。
把一个变量的地址作为初始化值赋给指针变量时,该变量必须在此之间已经定义。因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量。
可以用初始化了的指针变量给另一个指针变量作初始化值。
不能用数值作为指针变量的初值,但可以将一个指针帮你初始化为一个空指针。例如:int *p = 1000; 是不对的,而int *p = 0; 是将指针变量初始化为空指针。这里0是ASCII字符NULL的值。
指针变量定义时的数据类型和它说指向的目标变量的数据类型必须一致,因为不同的数据类型所占用的存储单元的字节数不同。

用穷举法求某数段的素数、水仙花数、完全平方数等

用穷举法输出所有三位数的水仙花数(即每位数的立方和与该数相等,比如:1³+5³+3³=153)

#include<stdio.h>
#include<math.h>
int main()
{
	int z_number;
	printf("请输入数字:\n");
	scanf_s("%d", &z_number);
	printf("质数为:\n");
	zhishu(z_number);
	printf("水仙花数为:\n");
	waterflower(z_number);
	printf("完全平方数为:\n");
	sqrt_num(z_number);
}
int zhishu(int z_number)
{
	int temp;
	int fristnumber;
	int secnumber;
	for (int j = 2; j < z_number/2; j++)
	{
		fristnumber = j;
		temp = sqrt(fristnumber) + 1;
		for (int i = 2; i < temp; i++)
		{
			if(fristnumber % i == 0)
			{
				fristnumber = 0;
				break;
			}
		}
		secnumber = z_number - j;
		temp = sqrt(secnumber) + 1;
		for (int i = 2; i < temp; i++)
		{
			if (secnumber % i == 0)
			{
				secnumber = 0;
				break;
			}
		}
		if(secnumber !=0 && fristnumber != 0)
		{
			printf("%d + %d = %d\n", fristnumber, secnumber, z_number);
		}
	}
}
int waterflower(int s_number)
{
	int a, b, c;
	int count = 0;
	for (int i = 100; i < s_number; i++)//穷举法求三位数水仙花数目
	{
		a = i / 100;
		b = i % 100 / 10;
		c = i % 10;
		if (a * a * a + b * b * b + c * c * c == i)
		{
			printf("%d %d %d\n", a, b, c);
			count++;
		}
	
	}
	printf("三位数水仙花的数目为:%d\n", count);
}
int sqrt_num(int sqrtnum)
{
	int a;
	int count = 0;
	for (int i =1; i < sqrtnum; i++)
	{
		for (int j = 0; j < sqrtnum/2; j++)
		{
			if (j * j == i)
			{	
				printf("%d * %d = %d\n", j, j, i);
				count++;
			}
			
		}
	}
	printf("完全平方数目为:\n",count);
}

两矩阵相乘

#include<stdio.h>
int main()
{
	int i, j, k;
	int matrix_2_3[2][3];
	int matrix_3_2[3][2];
	int result[2][2];
	printf("请为第一个矩阵赋值:\n");
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 3; j++)
		{
			scanf_s("%d", &matrix_2_3[i][j]);
		}
	}
	printf("请为第二个矩阵赋值:\n");
	for (i = 0; i < 3; i++)
	{	
		for (j = 0; j < 2; j++)
		{
			scanf_s("%d", &matrix_3_2[i][j]);
		}
	}
	//三层循环计算两矩阵相乘
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++) //注意条件,这段代码块是为result数组计算并赋值
		{
			int temp = 0;
			for (k = 0; k < 3; k++)
			{
				temp += matrix_2_3[i][k] * matrix_3_2[k][j];
			}
			result[i][j] = temp;
		}
	}
	printf("两矩阵相乘后:\n");
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++)
		{
			printf("%d ", result[i][j]);
		}
		printf("\n");
	}
}

统计字符中单词个数

#include<stdio.h>
int main() {
    //定义一个string字符数组来接收输入的字符串
    //定义一个c字符用来比较当前字符是否是空格
    char string[100], c;
    //count用来统计单词个数,
    // 使用flag来标识如何为一个新的单词,为一个新单词的标准是前面的一个字符为空格,且初始值为0
    int i, count = 0, flag = 0;
    gets(&string);
    //输入一个字符串给字符数组string
    for (i = 0; (c = string[i]) != '\0'; i++) {
        if (c == ' ')//如果是空格字符,使word置0
        {
            flag = 0;
        }
        else if (flag == 0)//如果不是空格字符,且flag原来的值为0,即前面是空格,使flag置1
        {
            flag = 1;
            count++;
        }
    }
    printf("count=%d\n", count);
    return 0;
}

求定积分近似值

#include<stdio.h>
#include<math.h>
int main()
{
	int i, n = 20;
	float s1=0, h, x, a, b, t1, t2;
	printf("请输入定积分区间");
	scanf_s("%f,%f", &a, &b);
	h = (b - a) / n;
	for (int i = 0; i < n; i++)
	{
		x = a + (i - 1) * h;
		t1 = (float)exp(-x * x / 2);
		t2 = exp(-(x + h) * (x + h) / 2);
		s1= s1 + (t1 + t2) * h / 2;
	}
	printf("梯形法算得积分值:%f\n", s1);
}

牛顿迭代法求近似值

#include<stdio.h>
#include<math.h>
float Fl(float x) {
	float y;
	y = cos(x) - x;
	return y;
}
float newtoon(float x)
{
	float y;
	y = x - Fl(x) / (-sin(x) - 1);
	return y;
}
void main()
{
	float x0, x1;
	printf("Please input x0:\n");
	scanf_s("%f", &x1);
	do
	{
		x0 = x1;
		x1 = newtoon(x0);
	} while (fabs(x1 - x0) >= 1e-5);
	printf("The root of equation is %f\n", x1);
}

二分法

#include<stdio.h>
#include<math.h>
#define f(x) ((x*x-1)*x-1)
float main()
{
	float a = 1, b = 1.5, y = f(a), x;
	int i = 0;
	if (y * f(b) >= 0) // 同号 无解
	{
		printf("输入范围有误!");
		return;
	}
	else
		do
		{
			x = (a + b) / 2;
			if (f(x) == 0)
				break;
			if (y * f(x) < 0)
				b = x;
			else
				a = x;
		} while (fabs(a - b) > 1e-2);
		printf("近似值为:%4.2f", x)

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值