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