数字进制转换:
#include <stdio.h>
//数字进制转换
void func(void)
{ //输入要转换的数字
int a = 0, b = 0;
printf("输入正整数:");
scanf("%d", &a);
if (a < 0)
{ return;
}
printf("输入要转换的进制:");
scanf("%d", &b);
//定义一个数组,保存转换的进制数
char arr[100] = {0}, i = 0;
do
{
arr[i] = a % b;
a = a / b;
i++; //保存到数组中,数组中从头到尾保存的是个位到高位
}while (a > 0);
for (i=i-1; i>=0; i--)
{
//小于10直接输出。
if (arr[i] < 10)
{
printf("%d", arr[i]);
}
else//大于10减去10以内的数。
{
printf("%c", arr[i]-10+'A');
}
}
printf("\n");
}
int main(void)
{
func();
return 0;
}
数组:
数组是某一种数据类型的集合,本质上是声明数组的同时,在内存上申请一段连续的空间,用来存储数据,程序结束前,内存不释放。
数组有字符数组,有浮点数的数组。有很多的。有一维的数组,也有二维的数组。但是二维数组本质上在内存中还是线性的存储。因为内存是一维线性的。
#include <stdio.h>
int main(void)
{
char a[10];申请了一段10*1的空间。存储char类型的数字,每段大小为10
char b[10][100];申请了一段10*100*1的空间。存储char类型的数字,每段大小为100*1
int c[10];申请了一段10*4的空间。存储Int类型的数字,每段大小为10
int b[10][100];//申请了一段10*100*4的空间。存储Int类型的数字,每段大小为100*4
return 0;
}
数组进行的操作,冒泡排序,选择排序,二分查找(有序的序列。)都是int型的数组的操作。
//冒泡排序
#include <stdio.h>
int main(void)
{
int i = 0, j = 0, k = 0;
int a[10];
for(i=0; i<10; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<10-1; i++)
{
for(j=0; j<10-i-1; j++)
{
if(a[j] > a[j+1])
{
//寻找最大的数,放到最后一位,之后每次运行之后,把最后一位忽略。
k = a[j];
a[j] = a[j+1];
a[j+1] = k;
}
}
}
for(i=0; i<10; i++)
printf("%5d", a[i]);
return 0;
}
//选择排序。
#include <stdio.h>
int main(void)
{
int i = 0, j = 0, k = 0;
int a[10];
for(i=0; i<10; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<10-1; i++)
{
for(j=i+1; j<10; j++)
{
if(a[i] > a[j])//每次比较相邻两个,符合条件,执行if语句。
{
k = a[i];
a[i] = a[j];
a[j] = k;
}
}
}
for(i=0; i<10; i++)
{
printf("%d", a[i]);
}
}
//二分查找,必须有序
#include <stdio.h>
#include <string.h>
int main(void)
{
int i = 0, j = 0, k = 0;
int left = 0, right = 0;
int mid = 0;
int a[10];
for(i=0; i<10; i++)
scanf("%d", &a[i]);
printf("enter a number to serch");
scanf("%d", &k);
left = 0;
right = 10 -1;
while(left <= right)
{
mid = (left + right) / 2;
if(a[mid] < k)
left = mid + 1;//如果找到,比中间值大,左值变为mid+1
if(a[mid] > k)
right = mid - 1;//如果找到,比中间值小,右值变为mid-1
if(a[mid] == k)
{
printf("find\n");
printf("%d\n", mid);//如果找到,退出。
break;
}
}
return 0;
}
函数使用:
例子:
简单的传值调用:
#include <stdio.h>
void change(int a,int b)//有返回类型void改为返回的数据类型
{
int c = 0;
c = a;
a = b;//交换a b的值
b = c;
// return 符合数据类型的值或者表达式,或者递归的函数,递归的函数最后必须有返回的条件。
}
int main(void)
{
int a = 1, b = 2;
change(a,b);//传的是值,没有改变实质
printf("a = %d b = %d\n", a, b);//打印后发现a和b的值不变
return 0;
}
//交换两个数字的值。
#include <stdio.h>
void change(int *a, int *b)
{
int c = 0;
c = *a;
*a = *b;//交换两个值地址上的值。
*b = c;
}
int main(void)
{
int a = 1, b = 2;
change(&a,&b);//传的是地址。改变了实质
printf("a = %d b = %d\n", a, b);
}
字符串的操作也类似
#include <stdio.h>
#include <string.h>
//循环右移:2位->891234567
void func(char buf[], int steps)
{
int i = 0, j = 0, lenth = 0;
char temp = 0;
lenth = strlen(buf);
for (i=0; i<steps; i++) // 等同于 while (steps--)
{
temp = buf[lenth-1];
for (j=lenth-1; j>0; j--)
{
buf[j] = buf[j-1];
}
buf[0] = temp;
}
}
int main(void)
{
char buf[] = "123456789";
int steps = 0;
printf("输入要移动的位数:");
scanf("%d", &steps);
printf("buf = [%s].\n", buf);
func(buf, steps);
printf("buf = [%s].\n", buf);
return 0;
}