C语言学习笔记(五)

例题

复制代码
#include<stdio.h>
int main()
{
	float add(float x,float y);
	float a,b,c;
	scanf("%f %f",&a, &b);
	c=add(a,b);
	printf("%.1f\n",c);
}
float add(float x,float y)
{
	return x+y;
}
复制代码
#include<stdio.h>
int main()
{
	double power(float x,float y);
	float a,b;
	double c;
	scanf("%f %f",&a, &b);
	c=power(a,b);
	printf("%.1lf\n",c);
}
double power(float x,float y)
{
	int i;
	double result=1;
	for(i=0;i<y;i++)
	{
		result*=x;
	}
	return result;
}

第二题答案:

复制代码
#include<stdio.h>
int srqt(int a)
{
	int z;
	int result=0;
	for(z=0;z*z<=a;z++)
	{
     result=z;
	}
	return result;
}
int main()
{
	int x,y;
printf("请输入一个数:\n");
scanf("%d",&x);
printf("求平方根:\n");
y=srqt(x);
printf("算术平方根是%d:\n",y);
}

二分查找法解题:

复制代码
#include<stdio.h>
int mySqrt(int n)
{
	int left=0,right=n,ans=0;
	while(left<=right)
	{
		int mid=(left+right)/2;
		if(mid*mid==n)
		{
			return mid;
		}
		else if(mid*mid<n)
		{
			ans=mid;
			left=mid+1;
		}
		else
		{
			right=mid-1;
		}
	}
	return ans;
}
int main()
{
int x;
printf("请输入一个整数:");
scanf("%d",&x);
printf("算术平方根是:%d\n",mySqrt(x));
return 0;
}

3题答案:

复制代码
#include "stdio.h"
int main()
{
	int num[10]={0};
	int blank=0,others=0;
	char c;
	printf("请输入字符:\n");
	while((c=getchar())!='\n')
	{
		if(c>='0'&&c<='9')
		{
			num[c-'0']++;
		}
		else if(c==' '||c=='\t'||c=='\n')
		{
			blank++;
		}
		else
		{
			others++;
		}
	}
	printf("\n统计结果: \n");
	for(int i=0;i<10;i++)
	{
		printf("数字%d出现了%d次\n",i, num[i]);
	}
	printf("空白符出现了%d次\n",blank);
	printf("其他字符出现了%d次\n",others);	 
	return 0;
}

函数的嵌套调用

复制代码
#include "stdio.h"
int squre(int x)
{   long z;
    z=x*x;
	return z;
}
long factorial(int n)
{
	int i;
	long result=1;
	for(i=1;i<=n;i++)
	{
		result*=i;
	}
	return result;
}
int main()
{
    long sum = 0;
    int base; 
    base = 2;
    long square_2 = squre(base);      // 算 2*2 = 4
    long fact_2 = factorial(square_2); // 算 4! = 24
    sum += fact_2;
    base = 3;
    long square_3 = squre(base);      
    long fact_3 = factorial(square_3); 
    sum += fact_3;

    printf("最终结果 s = %ld\n", sum);

    return 0;
}

递归

递归必须有一个退出条件

复制代码
#include "stdio.h"
long resursion(int n);
int main()
{
	int n;
	long result;
	printf("input a integer number:\n");
	scanf("%d",&n);
	result=resursion(n);
	printf("%d!=%ld\n",n, result);
	
}
long resursion(int n)
{
	long temp_result;
	if(n<0)
	{
		printf("n < 0,input error!\n");
	}
	else if(n==0||n==1)
	{
		temp_result=1;
	}
	else
	{
		temp_result=resursion(n-1)*n;
	}
	return temp_result;
}
复制代码
#include "stdio.h"
int shu(int x)
{
	int z;
	if(x>0)
	{
	z=x;
	}
	else
	{
		z=0;
	}
	return z;
}
int main()
{
	int i,result;
	int a[10]={1,2,3,4,-1,-2,-3,-4,2,3};
	for(i=0;i<10;i++)
	{
		result=shu(a[i]);
		printf("%d\n",result);
	}
	return 0;
}
复制代码
#include "stdio.h"
int test(int b[10])
{
int i=0;
for(;i<10;i++)
{
	printf("%d",b[i]);
}
}
int main()
{
	int a[10]={2,4,6,8,10,12,14,16,18,20};
	test(a);
	putchar('\n');
	return 0;
}
复制代码
#include "stdio.h"
float test(int b[10])
{
int j=0,sum=0;
for(;j<10;j++)
{
	sum+=b[j];
}
return (float)sum/10.0;
}
int main()
{
	int i;
	float result;
	int a[10]={0};
	printf("输入十个学生的成绩:\n");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	result=test(a);
	printf("平均成绩是%f\n",result);
	return 0;
}

局部变量和全局变量

复制代码
#include "stdio.h"
float average(float a[])
{
	float aver=0;
	int i;
	for(i=0;i<10;i++)
	{
		aver+=a[i];
	}
	return aver/10.0;
}
float max(float b[])
{
	float ma=b[0];
	int j;
	for(j=1;j<10;j++)
	{
		if(b[j]>ma)
		{
			ma=b[j];
		}
	
	}
	return ma;
}
float min(float c[])
{
	float mi=c[0];
	int k;
	for(k=1;k<10;k++)
	{
		if(c[k]<mi)
		{
			mi=c[k];
		}
		
	}
	return mi;
}
int main()
{
 float score[10];
 printf("请输入十个学生成绩:\n");
 int i;
 for(i=0;i<10;i++)
 {
 	scanf("%f",&score[i]);
 }
 float max1,min1,avera;
 avera=average(score);
 max1=max(score);
 min1=min(score);
 printf("平均成绩为%f\n",avera);
 printf("最大成绩为%f\n",max1);
 printf("最小成绩为%f\n",min1);
	return 0;
}

变量的存储类别

register变量

复制代码
#include "stdio.h"
#include "string.h"
extern void delete_char(char str[],char c);
int main()
{
	char c[100];
	char c;
	printf("请输入字符串内容:\n");
	gets(str);
	printf()
	
}

指针

复制代码
#include "stdio.h"
int main()
{
	int a,b;
	int *pointer_1,*pointer_2;
	a=100;
	b=10;
	pointer_1=&a;
	pointer_2=&b;
	printf("%d,%d\n",a,b);
	printf("%d,%d\n",*pointer_1,*pointer_2);
	return 0;
}

答案如下:

复制代码
#include "stdio.h"
int main()
{
int *p1,*p2,*p,a,b;
printf("请输入两个数:\n");
scanf("%d %d",&a, &b);
p1=&a;
p2=&b;
if(a<b)
{
	p=p1;
	p1=p2;
	p2=p;
}
printf("%d %d",*p1,*p2);
	return 0;
}
复制代码
#include "stdio.h"
void swep(int *p1,int *p2)
{
	int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
int a,b,*pointer_1,*pointer_2;
printf("请输入两个数:\n");
scanf("%d %d",&a, &b);
pointer_1=&a;
pointer_2=&b;
if(a<b)
{
	swep(pointer_1,pointer_2);
}
printf("交换后的值为:%d %d\n",*pointer_1,*pointer_2);
	return 0;
}

解法一:

复制代码
#include "stdio.h"
int main()
{
    int a, b, c;
    int *pointer_1, *pointer_2, *pointer_3;

    printf("请输入三个数:\n");
    scanf("%d %d %d", &a, &b, &c);

    // 找最大值 → 给 pointer_1
    if (a >= b && a >= c)
        pointer_1 = &a;
    else if (b >= a && b >= c)
        pointer_1 = &b;
    else
        pointer_1 = &c;

    if (a <= b && a <= c)
        pointer_3 = &a;
    else if (b <= a && b <= c)
        pointer_3 = &b;
    else
        pointer_3 = &c;

    if ((&a != pointer_1) && (&a != pointer_3))
        pointer_2 = &a;
    else if ((&b != pointer_1) && (&b != pointer_3))
        pointer_2 = &b;
    else
        pointer_2 = &c;

    
    printf("从大到小:%d %d %d\n", *pointer_1, *pointer_2, *pointer_3);

    return 0;
}

解法二:

复制代码
#include "stdio.h"
void swap(int *pt1,int *pt2)
{
	int temp;
	temp=*pt1;
	*pt1=*pt2;
	*pt2=temp;
}
void swep(int *q1,int *q2,int *q3)
{
	
	if(*q1<*q2)
	{
		swap(q1,q2);
	}
	if(*q1<*q3)
	{
		swap(q1,q3);
	}
	if(*q2<*q3)
	{
		swap(q2,q3);
	}
}
int main()
{
    int a, b, c;
    int *pointer_1, *pointer_2, *pointer_3;
    printf("请输入三个数:\n");
    scanf("%d %d %d", &a, &b, &c);
    pointer_1=&a;
    pointer_2=&b;
    pointer_3=&c;
    swep(pointer_1,pointer_2,pointer_3);
    printf("交换后的顺序是:%d %d %d\n",*pointer_1,*pointer_2,*pointer_3);
    return 0;
}

数组与指针

方法一:

复制代码
#include "stdio.h"
int main()
{
    int a[10]={9,8,7,6,5,4,3,2,1,0};
    int i;
    for(i=0;i<10;i++)
    {
    	printf("%d\n",a[i]);
	}
    return 0;
}

方法二:

复制代码
#include "stdio.h"
int main()
{
    int a[10]={9,8,7,6,5,4,3,2,1,0};
    int i;
    for(i=0;i<10;i++)
    {
    	printf("%d\n",*(a+i));
	}
    return 0;
}

方法三:

复制代码
#include "stdio.h"
int main()
{
    int a[10]={9,8,7,6,5,4,3,2,1,0};
    int *p;
    for(p=a;p<a+10;p++)
    {
    	printf("%d\n",*p);
	}
    return 0;
}
复制代码
#include "stdio.h"
void reverse(int x[],int n)
{
	int temp,i,j,m;
	m=(n-1)/2;
	for(i=0;i<=m;i++)
	{
		j=n-1-i;
		temp=x[i];
		x[i]=x[j];
		x[j]=temp;
	}
}
int main()
{
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("原数组为:\n");
for(i=0;i<10;i++)
{
	printf("%d",a[i]);
}
printf("\n");
reverse(a,10);
printf("交换后的数组:\n");
for(i=0;i<10;i++)
{
	printf("%d",a[i]);
}
    return 0;
}
复制代码
#include "stdio.h"
int main()
{
int i,a[10],max,min;
printf("输入数组的值:\n");
for(i=0;i<10;i++)
{
	scanf("%d",&a[i]);
}
max=a[0];
min=a[0];
for(i=1;i<10;i++)
{
	if(a[i]>max)
	{
		max=a[i];
	}
	if(a[i]<min)
	{
		min=a[i];
	}
}
printf("max=%d\n",max);
printf("min=%d\n",min);
    return 0;
}

第二种解法:

复制代码
#include "stdio.h"
int max,min;
void max_min_value(int arr[],int n);
int main()
{
   int i,number[10];
   printf("请输入十个数:\n");
   for(i=0;i<10;i++)
   {
   	scanf("%d",&number[i]);
   }
   max_min_value(number,10);
   printf("max=%d min=%d",max,min);
    return 0;
}
void max_min_value(int array[],int n)
{
	int *p,*array_end;
	array_end=array+n;
	max=min=*array;
	for(p=array+1;p<array_end;p++)
	{
		if(*p>max)
		{
			max=*p;
		}
		else if(*p<min)
		{
			min=*p;
		}
	}
}

归纳总结:

多维数组与指针

复制代码
#include "stdio.h"
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
p=a;
printf("i=");
scanf("%d",&i);
while(i>2||i<0)
{
printf("i=");
scanf("%d",&i);	
}
printf("j=");
scanf("%d",&j);
while(j>3||j<0)
{
printf("j=");
scanf("%d",&j);
}
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
    return 0;
}
复制代码
#include "stdio.h"
int main()
{
  char string[]="I Love guidian";
  printf("%s\n",string);
  
    return 0;
}
复制代码
#include "stdio.h"
int main()
{
  char *string="I Love China";
  printf("%s\n",string);
  
    return 0;
}
复制代码
#include "stdio.h"
int main()
{
char a[]="China is a good country!",b[40];
int i;
for(i=0;*(a+i)!='\0';i++)
{
	*(b+i)=*(a+i);
}
  *(b+i)='\0';
  printf("string a is:%s\n",a);
  printf("string b is:\n");
  for(int i=0;b[i]!='\0';i++)
  {
  	printf("%c",b[i]);
  }
   printf("\n\n");
}

#include "stdio.h"
void copy(char c[],char d[])
{
	int i=0;
	while(c[i]!='\0')
	{
		d[i]=c[i];
		i++;
	}
	d[i]='\0';
}
int main()
{
char a[]="China is a good country!";
char b[100]="I am a student!";
printf("a=%s\nb=%s\n",a,b);
copy(a,b);
printf("a=%s\nb=%s\n",a,b);
return 0;
}
复制代码
#include "stdio.h"
int max;
int max_i(int x,int y)
{
	max=x;
	if(x<y)
	{
		max=y;
	}
	return max;
}
int main()
{
int (*p)(int,int);
int a,b,c;
p=max_i;
scanf("%d %d",&a, &b);
c=(*p)(a,b);
printf("a=%d b=%d max=%d\n\n",a, b, c);
return 0;
}
复制代码
#include "stdio.h"
int main()
{
	double score[][4]={{60.0,70.0,80.5,90.5},{56.0,89.0,67.0,88.0},{34.2,55.0,87.0,98.0}};
	double *search(double(*pointer)[4],int n);
	double *p;
	int i,m;
	printf("请输入学生的序号:\n");
	scanf("%d",&m);
	printf("The scores of number %d are:\n",m);
	p=search(score,m);
	for(i=0;i<4;i++)
	{
		printf("%5.2f\t",*(p+i));
	}
	printf("\n\n\n");
}
double *search(double (*pointer)[4],int n)
{
	double *pt;
	pt=*(pointer+n);
	return pt;
}

答案:

复制代码
#include "stdio.h"

/*
函数功能:检查单个学生的4门课程是否有不及格
参数:pointer 指向该学生4门成绩的行指针
返回值:有不及格 → 返回该学生成绩的首地址;全及格 → 返回NULL
*/
double *search(double (*pointer)[4])
{
    int i;
    // 遍历该学生的4门课程
    for(i = 0; i < 4; i++)
    {
        // 只要有1门成绩低于60,判定为有不及格
        if(*(*pointer + i) < 60.0)
        {
            return *pointer; // 返回该学生成绩的首地址
        }
    }
    // 所有课程全及格,返回NULL
    return NULL;
}

int main()
{
    // 3个学生,每个学生4门课程的成绩(和你原代码一致)
    double score[][4] = {{60.0,70.0,80.5,90.5},
                          {56.0,89.0,67.0,88.0},
                          {34.2,55.0,87.0,98.0}};
    double *p;
    int i;
    // 自动计算学生总数(代码更通用,增减学生不用改逻辑)
    int student_total = sizeof(score) / sizeof(score[0]);

    printf("有不及格课程的学生信息:\n");
    printf("学号\t各科成绩\n");
    printf("------------------------------------\n");

    // 遍历所有学生,筛选有不及格的
    for(i = 0; i < student_total; i++)
    {
        // 检查第i个学生是否有不及格
        p = search(score + i);
        // p不为NULL → 该学生有不及格
        if(p != NULL)
        {
            // 输出学号(从1开始,符合日常习惯)
            printf("%d\t", i + 1);
            // 输出该学生的4门成绩
            for(int j = 0; j < 4; j++)
            {
                printf("%5.2f ", *(p + j));
            }
            printf("\n");
        }
    }

    return 0;
}
复制代码
#include "stdio.h"
#include "string.h"
int main()
{
char *name[]={"Fishc.com","www.Fishc.com","home.Fishc.com","Fishc.com/dz"};
char **p;
int i;
for(i=0;i<4;i++)
{
	p=name+i;
	printf("%s\n",*p);
}
}
复制代码
#include "stdio.h"

int main()
{
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int *p1, *p2;
    ptrdiff_t count; // 指针相减的结果类型是 ptrdiff_t

    p1 = &a[0];
    p2 = &a[9];

    // 指针相减:得到两个指针之间的元素个数
    count = p2 - p1;

    printf("p1 和 p2 之间的元素个数:%lld\n", (long long)count);
    return 0;
}

预处理命令:

带参宏定义

小结:

结构体和共用体

复制代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define num 3
struct person
{
	int NUM;
	char name[20];
};
int main()
{
struct person man[num];
int i;
for(i=0;i<num;i++)
{
	printf("请输入第 %d 个人的名字:", i+1);
	fgets(man[i].name, 20, stdin);
	man[i].name[strcspn(man[i].name, "\n")] = '\0';
	printf("请输入所得票数:");
	scanf("%d",&man[i].NUM);
	   getchar();
}
    printf("\n===== 投票结果 =====\n");
for(i=0;i<num;i++)
{
	printf("姓名:%s\n所得票数:%d\n",man[i].name,man[i].NUM);
}
	return 0;
}
相关推荐
炽烈小老头2 小时前
【每天学习一点算法 2026/04/01】零钱兑换
学习·算法
学电子她就能回来吗2 小时前
liunx嵌入式基础:socket通信
linux·运维·服务器·人工智能·单片机·嵌入式硬件·学习
我能坚持多久2 小时前
C++入门基础知识
开发语言·c++·学习
如雨随行20202 小时前
【Vim】学习笔记(9)命令模式
笔记·学习·vim
charlie1145141912 小时前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(5)WSL + NFS 网络启动踩坑记:从挂载失败到成功启动的完整历程
linux·网络·驱动开发·学习·嵌入式·嵌入式linux
头疼的程序员2 小时前
计算机网络:自顶向下方法(第七版)第七章 学习分享(四)
网络·学习·计算机网络
如雨随行20202 小时前
【Vim】学习笔记(8)tips-2
笔记·学习·vim
HyperAI超神经2 小时前
在线教程丨华中科大与小红书 hi lab开源dots.mocr,SOTA级OCR模型完美还原文档结构,图形也能转 SVG
人工智能·深度学习·学习·机器学习·gpu·orc·vllm
暴躁小师兄数据学院2 小时前
【WEB3.0零基础转换笔记】Rust编程篇-第4讲:控制流
开发语言·笔记·rust·web3·区块链·智能合约