C语言学习笔记及心得(一)

C语言学习笔记及心得(一)

前言:本人自2019年七月下旬确定了本科所在的大学及专业,便开始学习C语言。期间便是在PTA上做相关题集,然而碰到其中的却不曾有过详细记录在其他地方。如今临近期末,便借此整理本人的学习心得。

1 分支(if-else,switch)

  1. else 接的if语句是离其最近的。如:
if( )//1
if( ) //2
else//3
else//4

其中,3接的是2语句,那么,4接的便是1语句。

  1. switch-case
switch(n){
case 1:
	break;
case 2:
	break;
}

如上所示,若是n=1,那么进入的就是case 1。但若是其中没有break语句,则会进入下一条语句(case 2),以此类推。因此,case 后接break很重要。

2.关于scanf输入函数的一些问题:

int num;
char c;
char s[80];
scanf("%d",&num);
scanf("%c",&c);
scanf("%s",s);

如上所示,为什么在输入数字或者字符等后面要有地址符&,而输入字符串则不用?
因为num是整型变量名,因此scanf要取其变量内存中的地址;而s是char型数组,s本身指向这个数组的首地址。简而言之,num保存的是内容,s里保存的本身就是这个地址。
另:&表示的是取地址,数组后面若是没有[]表示的是首地址。

3.一些零散但是重要的知识点:
*p:取出地址对应的内容;
i++:先参与运算,再+1;
++i:先自加,再参与运算;

int a[n],pa=a;
a[i]=pa[i]=*(a+i)=*(pa+i);

如何将指针指向数组:

int a[10],i;
	int* p;
	p = a;
	//*p指向了a这个数字,且*(p+i)等价于a[i];

知识点暂且写到这里,若是后面有想到则会继续补充。下面则是给出至今所碰到的重点题及解题技巧。

题1.
实验4-1-1-while和do-while 最大公约数和最小公倍数 (15分)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:
511 292
输出样例:
73 2044

#include
int main(){
    int a,b,t,p;
    scanf("%d %d",&a,&b);
    int x=a,y=b;
//辗转相除法
    while(b!=0){
        t=a%b;
        a=b;
        b=t;
    }
//a为最大公约数
//最小公倍数等于两数之和处以最大公约数
    p=x*y/a;
    printf("%d %d",a,p);
    return 0;
}

总结:
这题重点便是掌握其两点。1,求最大公约数的方法是辗转相除法。2,最小公倍数等于两个数的和除以最大公约数。求这两数在以后的许多题目都能见到,这些我会在以后提到。

题2.
实验4-1-4-while和do-while 求整数的位数及各位数字之和 (15分)

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:
输入在一行中给出一个不超过10
​9
​​ 的正整数N。

输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:
321
输出样例:
3 6

#include
int main(){
    int sum=0,n,b,a=0;
    scanf("%d",&n);
    while(n>0){
        b=n%10;
        n/=10;
        sum+=b;
        a++;
    }
    printf("%d %d",a,sum);
    return 0;
}

以上这种算法为从个位数向前依次推进。下面,能看到这种求各位数的具体例子。

7-8 幸运彩票 (15分)
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。

输出格式:
对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.。

输入样例:
2
233008
123456
输出样例:
You are lucky!
Wish you good luck.

#include
int main() {
	int a;
	int n, i;
	scanf("%d", &n);
	for(i=1;i<=n;i++){
		scanf("%d", &a);
		if (a/100000+a/10000%10+a/1000%10==a%10+a/10%10+a/100%10) {
			printf("You are lucky!\n");
		}
		else {
			printf("Wish you good luck.\n");
		}
	}
	return 0;
}

如上所示,在if语句的等式左端,所求的整数位次上的数字是从最高位依次往下走,而等式右端便是从最低位次往上走。

题3.斐波那契数列的不同求法及其实例
首先,通过一题简单的实例,我们能从中了解到什么为斐波那契数列:
实验4-1-10-while和do-while 兔子繁衍问题 (15分)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:
输入在一行中给出一个不超过10000的正整数N。

输出格式:
在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9

#include
int main(){
    int a=1,b=0,sum=1,n,m=1;
    scanf("%d",&n);
    if(n==1){
        m=1;
    }else{
        do{
            m++;
            sum=a+b;
            b=a;
            a=sum;
        }while(sum<n);
    }
    printf("%d",m);
    return 0;
}

下面是用函数求斐波那契
实验6-5 使用函数输出指定范围内的Fibonacci数 (20分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0

函数接口定义:
int fib( int n );
void PrintFN( int m, int n );
其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。

裁判测试程序样例:
#include

int fib( int n );
void PrintFN( int m, int n );

int main()
{
int m, n, t;

scanf("%d %d %d", &m, &n, &t);
printf("fib(%d) = %d\n", t, fib(t));
PrintFN(m, n);

return 0;

}
/* 你的代码将被嵌在这里 */

输入样例1:
20 100 7
输出样例1:
fib(7) = 13
21 34 55 89
输入样例2:
2000 2500 8
输出样例2:
fib(8) = 21
No Fibonacci number

int fib(int n){
    int i,a=1,b=0,sum=0;
    sum=a+b;
    if(n==1||n==2){
        sum=1;
    }else {
        for(i=3;i<=n;i++){
            b=a;
            a=sum;
            sum=a+b;
        }
    }
    return sum;
}
void PrintFN( int m, int n ){
    int cnt=0,i;
    for(i=1;i<=20;i++){
        if(fib(i)>=m&&fib(i)<=n){
            if(cnt!=0)
            printf(" ");
            printf("%d",fib(i));
            cnt++;
        }
    }
    if(cnt==0){
        printf("No Fibonacci number\n");
    }
}

还有用递归求其数字的方法,如下所示:
实验10-7 -递归函数 递归求Fabonacci数列 (10分)
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:

f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。

函数接口定义:
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。

裁判测试程序样例:
#include

int f( int n );

int main()
{
int n;

scanf("%d", &n);
printf("%d\n", f(n));

return 0;

}

/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8

int f(int n) {
	int sum;
	if (n == 0) {
		sum = 0;
	}
	else if (n == 1) {
		sum = 1;
	}
	else {
		sum = f(n - 2) + f(n - 1);
	}
	return sum;
}

你可能感兴趣的:(C语言学习笔记及心得(一))