超详细讲解C语言入门函数(一)

解析已经很详细了,可以说相当入门级别了,如果喜欢的话那就请支持一下,后续会继续更新~
代码网上搜索,并加以更改,侵权请联系删除,谢谢~
部分例子没有详细解释是因为前面的例子已经说过了

3×4矩阵求最大值

#include <stdio.h>
int max(int a[][4],int n)//注意此处a[3][4]只能省略一维的下标,三维等都是一样,由编译器的寻址方式决定
{
	int m, i, j;
	m=a[0][0];//将第一个命为初比较值
	for(i=0; i<n; i++)
	 for(j=0; j<4; j++)
	   if(a[i][j] > m)
	   	m = a[i][j];//遇到比比较值大的就将其变为比较值
	return m;//最后经过所有二维数比较留下的就是最大值了,将其返回
}
void main(void)
{
	int a[3][4],i,j;
	for(i=0; i<3; i++)
		for(j=0; j<4; j++)
		{
			printf("请输入第%d个:",i*4+j+1);//i*4+j+1的由来可以去推理以下,很简单
			scanf("%d",&a[i][j]);
			printf("\n");//此处换行比较人性化
		}
	printf("%d",max(a,3));//调用的时候直接写数组名就可以了
}

找出100以内的所有素数

//素数:又称质数,因数只有1和其本身就是了!
#include <stdio.h>
int prime(int x)//x作为形参接受实参的传值,作为需要判断是否为素数的值
{ 
	int i, t=1;//t作为标志,t默认为1,为素数就返回1,当t为0时就说明不是素数
	for(i=2; i<x; i++)//从2到其本身前一个数开始让x求余
	if(x%i == 0)
	{	
		t=0;//如果满足了求余等于0的条件,说明除了1和其本身还有值是它的因数,那么就不是素数,t也变为0
		break;//跳出if语句,不需要再判断浪费时间了
	}
		return t;//返回标识值t,int型函数(int prime),返回值为int型数据,t就是
}
void main(void)
{               
	int i, n=0;
	for(i=2; i<=100; i++)//从2开始到100,1肯定是素数不用说
		if(prime(i) == 1)//为素数的条件
		{	
			n++;//找到一个素数就加个1
			printf("%5d",i);//%5d左对齐(默认),输出素数值
			if(n%5==0)//n从0开始,5个输出分一行
				printf("\n");                    //换行
		}
}

scanf()函数的问题

//不能完全读取其中带有空格(或tab)的字符,读取到就停止读取
#include <stdio.h>
void main(void)
{
	int str[10];
	printf("请输入字符串:");
	scanf("%s",str);
	printf("刚刚输入的字符串读取到:%s",str);
}

> 输入:abcd efg
> 输出:abcd 
> 不会出现空格后的efg

解决办法:gets()函数可以读取
#include <stdio.h>
void main(void)
{
	char s[10];
	printf("请输入字符串:");
	gets(s);
	printf("%s",s);
}
/*友善提示:有时候scanf()会读取上一步骤的回车字符,
导致没有等待我们输入就跳过了scanf(),解决办法:
①scanf()前面加个getchar();②scanf()前面加个fflush(stdin);
作用:读取掉或消除掉缓冲区的回车字符

strlen()、strcat()、strcpy()三函数

#include <stdio.h>
void main(void)
{
	char s[20], s1[20], s2[20];
	int i, j;
	puts("请输入第一个字符串:");
	gets(s);
	puts("请输入第二个字符串:");
    gets(s1);
    for(i=0; s[i]; i++);//s[i]作为for循环的判断条件,也就是当s[i]='\0'就不符合(条件:字符读取完毕)(注意分号)
	//上面一行的解析:也就是说此时的i已经等于最后一个字符位置的下一个空位置了
	//毕竟当发现s[i]为空的时候,i的位置肯定是空的的位置了,而且还是第一个空的位置
		for(j=0; s1[j]; j++)
			s[i++]=s1[j];//i++的那个位置也就是s[20]的最后字符后面一个空位置, (外延)大小:i++=i、++i=i+1
		//在赋值之后i才加的一,也就是说i的位置又为空了
	s[i]='\0';//将空的位置放入字符串结束符,本来不用加的,因为s[20]以内空的位置系统会自动加上'\0'
	//但是怕就怕刚好超过了s[20]的位置,到第21个位置去了,那么就需要人工加了,没错是越界了,但没办法,c语言有这缺点
	printf("连接后的字符串为:");
    puts(s);//输出字符串s
    printf("将连接后的字符串复制为:");
    for(i=0; s[i]; i++)
		s2[i]=s[i];//从开始的位置开始一个一个复制
	c[i]='\0';  //了解这里i已经在上一个的时候就已经加1了。
	printf("为:\n");
	puts(s);
	for(i=0; s[i]; i++);//不为空i就加一,记录字符个数
		printf("该字符串的长度为:%d\n",i);
}
}

从小到大(冒泡排序)

//正所谓冒泡,就是说轻的冒到上面(前面)(也就是下标小的地方)去
#include <stdio.h>
void main(void)
{
	int a[6]={8,15,20,27,35}, i, temp;//数组只放入了5个元素,还差一个a[5]后面自己输入
	printf("请输入你想让a[5]等于的数:");
		scanf("%d",&a[5]);//定义的数组为a[6],最后一个数组元素为a[5],第一个数组元素为a[0]
	for(i=4; i>=0; --i)//从下标4开始,毕竟相比较的数是后一个,也就是5(最后一个),相互比较,一个不拉
		if(a[i] > a[i+1])//发现前面的大于后面的
		{
-			//temp做中间暂存值,将两个值交换
			temp=a[i];
			a[i]=a[i+1];
			a[i+1]=temp;    //冒泡就是说小的在前面
		}
		for(i=0; i<6; i++)//输出冒泡后的排序
			printf("%d\t",a[i]);
}

递归函数

#include <stdio.h>
int f(int n)
{
	int s=0;
	if(n == 1)//双等于号是等于,单个等于号是赋值(右赋左)
		s=1;
	else 
		s=2*(f(n-1)+1);	//假令n=2
	//f(2)=s=2*(f(1)+1),f(1)=s=1→→f(2)=2*(1+1)
	//得出结论,即原来的数减一后再加上一总体再乘以二,可类推其它的递归函数
	return s;
}
main(void)
{
	int i;
	for(i=1;i<=10;i++)
		printf("%d\n",f(i));//输出1~10他们的输出
}

交换相应地址存储的值

//指针:指向地址,可以改变实参的值 &:取地址符 *:引用,取值
//函数作用:交换两个值
#include <stdio.h>
void exchange(int *a, int *b)//函数的参数为指针
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
int main(void)
{
	int a=1, b=2;
	int *x=&a;//指针指向储存a的地址,等价于int *x; x=&a; 
	int	*y=&b;
	exchange(x,y);//传参—指针
	printf("\t交换前的a=%d,b=%d\n",a,b);// \t:水平制表符
	printf("\t交换后a=%d,b=%d\n",a,b);
	return 0;//主函数main函数定义为了int型,需要返回值,返回值反正用不到(此处),所以返回0位习惯
}

矩阵输出

#include <stdio.h>//头文件
void main(void)
{
	int a[3][4], i, j, k;
	for(i=0; i<3; i++)
		for(j=0; j<4; j++){
			k=i*4+j+1;
			printf("请输入第%d个:",k);//提示输入,至于为什么建议自己去思考(其实就是找通式)!
			scanf("%d",&a[i][j]);
			printf("\n");
		}
	for(i=0; i<3; i++)
    {
    	for(j=0; j<4; j++)
    		printf("%6d",a[i][j]);//
		printf("\n");//相当于4个一行了,也就是第二个for循环结束一次就换行一次
	}
}

输出菱形(类推)

//输出高为5的菱形
//画出图形,很明显中间那行为第三行,上下对称
//分析空格个数:(行数为i)数每行的空格数算规律,可以发现第i行的*前面有3-i个(或i-3个),分界线就是i=3那一行
//再分析*个数:这时候寻简单,不要再寻找行数和*的关系了,转为空格数与*数的关系,很简单的可以发现规律星号数k=5-2b;b为空格数
#include <stdio.h>
int main(void)
{
	int i,j,k,b;
	for(i=1;i<=5;i++)
	{
		b = i<=3 ? 3-i : i-3;//三目运算符 ?= 满足条件就赋值前面一个,否则赋值后面那一个
		for(j=b; j>0; j--)
			printf(" ");//输出空格
		for(k=5-2*b; k>0; k--)	//此时的输出位置就在空格位下一个,还没有换行
			printf("*");//输出星号
		printf("\n");//该行的空格数和星号数输出完毕,换行即可
	}
    return 0;
}

求一个整数各个位上的数之和

#include <stdio.h>
void main(void)
{
	int x, y, a, z;
	printf("请输入一个数:");
	scanf("%d",&x);
	z=x;//用于保留x的初始值
	y=0;
	while(x)//直到x=0跳出
	{
		a=x%10;//求余,得出个位数赋值给a
		y=y+a;//总和相加给y
		x=x/10;//将个位数去除,每个位相应变为掉一"阶层"
	}
	printf("该数(%d)各个位数相加后等于%d\n",z,y);		//一样,不难理解   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值