目录
一、函数例题
例题-->九九乘法表
思路:创立两个数表示行数与列数,再用循环进行计算,列数小于等于函数。
注意:%2d--打印结果两位 %-2d--两位且左对齐
代码如下图:
int main()
{
int i = 1;//行
for (i = 1; i <= 9; i++)
{
int j = 1;//列
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", i, j, i*j);//%2d--打印结果两位 %-2d--两位且左对齐
}
printf("\n");
}
getchar();
getchar();
return 0;
}
例题-->字符串的逆序输出
思路:建立循环将第一个与最后一个交换
代码如下:
int my_strlen(char *str)
{
int count=0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
void reverse_string(char *str)
{
int left = 0;
int right = my_strlen(str)-1;
char tmp;
while(left < right)
{
tmp = str[left];//str[left]=*(str+left)
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
若用递归的方法,思路为:(abcdef)\0=f(bcde)\0\0=fe(cd)\0\0\0=fed()\0\0\0\0=fedc\0\0\0=fedcb\0\0=fedcba\0当中间字符长度为0或者1的时候递归停止。
代码如下:
void reverse_string(char *str)
{
char tmp=*str;
int len = strlen(str);
*str = *(str+len - 1);
*(str + len - 1) = '\0';
if (strlen(str+1)>=2)
{
reverse_string(str+1);
}
*(str + len - 1) =tmp;
}
例题-->利用递归的方法求一个数的各位数之和
eg:1729=1+7+2+9
思路:1729=sum(172)+9=sum(17)+2+9=sum(1)+7+2+9
代码如下:
int sum(int n)
{
if (n > 9)
{
return sum(n / 10) + (n % 10);
}
else
return n;
}
int main()
{
int num = 1729;
printf("%d", sum(num));
getchar();
getchar();
return 0;
}
例题-->用递归的方法求n的k次方
思路:n*n的k-1次方
代码如下:
int test(int n, int k)
{
if (k == 0)
return 1;
if (k>0)
return n*test(n,k-1);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d",&n,&k);
printf("%d\n",test(n, k));
getchar();
getchar();
return 0;
}
这个没有考虑k为负数的情况,因此我们可以思考下当k为负数的时候,n的k次方就会变成1/n的-k次方
代码如下:
double test(int n, int k)
{
if (k == 0)
return 1.0;
else if (k > 0)
return n*test(n, k - 1);
else
return 1.0 / test(n, -k);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d",&n,&k);
printf("%lf\n",test(n, k));
getchar();
getchar();
return 0;
}
二、数组
一维数组
创建:元素类型 数组名[数组大小(常量表达式)]
eg:int arr[6];或者char arr[5];
错误形式:int n=0;int arr[n];(c99语法支持eg :gcc)
初始化:
整数型
1.int arr[10]={1,2,3,4,5,6,7,8,9,10};(完全初始化)
2.int arr[10]={1,2,3,4,5};(不完全--其余为0)
3.int arr[]={1,2,3,4,5}=int arr[5]={1,2,3,4,5}
字符型
1.char ch[5]={'a','b','c'};(其余为'\0')
2.char ch[]={'a','b','c'};-->a b c//数组长度为3,但是求字符串长度时为一个随机值
3.char ch[5]="bit";-->b i t \0 \0
4.char ch[]="bit";-->b i t \0
这里我们要注意下第2种的打印会出现乱码烫烫...这是因为字符串的结束标志为\0
数组大小可以通过计算--sizeof(arr)/sizeof(arr[0])
%p--按照地址的格式打印(十六进制),运用如下:
打印数组元素,也可以用指针,如下:
注意:数组名是数组首元素的地址
有例外:1.sizeof[数组名]--数组名为整个数组-->计算的是整个数组的字节
2.&数组名--数组名为整个数组--整个数组的地址
int main()
{
int arr[10] = {1,3,2,4,5,6,7,8,9,10};
int *p=arr;//数组名为其首元素的地址
for (int i = 0; i < 10; i++)
{
printf("%d ",*p);
p++;
}
getchar();
getchar();
return 0;
}
二维数组
创建:[行][列](行可以省略,但列不可以)
eg:int arr[3][4];或者char ch[5][6];
初始化:
1.int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
2.int arr[3][4]={1,2,3,4};(不完全--补0)
3.int arr[3][4]={{1,2,3},{4,5,6},{7,8,9}};(一行一行初始化)
用指针打印数组元素,如下:
int main()
{
int arr[][4] = { { 1, 3 }, { 2, 4 }, { 5, 6 } };
int *p =& arr[0][0];
for (int i = 0; i < 12; i++)
{
printf("%d ", *p);
p++;
}
getchar();
getchar();
return 0;
}
二维数组可以看成多个一维数组!!!
冒泡排序:相邻的进行比较,有需要的话进行交换。
思想如下:
10个数字--9趟---->n个数字--n-1趟
代码如下:
int main()
{
int arr[] = {9.8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
//趟
for (i = 0; i < sz - 1; i++)
{
//每一趟的次
int j = 0;
for (j = 0; j < sz - 1; j++)
{
if (arr[j]>arr[j + 1])//交换
{
int tmp = arr[j];
arr[j ] =arr[j+1];
arr[j + 1] = tmp;
}
}
}
for (int x = 0; x < sz; x++)
{
printf("%d ", arr[x]);
}
getchar();
getchar();
return 0;
}
本次学习就到次啦!!芜湖~