GDPU C语言 天码行空9
🍑 C语言实验专栏
填空题
1. 指针+排序 +数组
输入
n=5
30 85 12 77 6
输出
6 12 30 77 85
🤠 代码
#include<stdio.h>define N 10
void sort(int *x,int n)// *x 是 数组 a 的地址
{
int i,j,k,t;for(i=0;i<n-1;i++)//从前往后枚举 坑位 { k=i; for(j=i+1;j<n;j++) if(x[k]>x[j])//每轮找最小值放在 前边的坑位 里边 k=j; t=x[i],x[i]=x[k],x[k]=t;// 交换 }}
int main()
{
int a[N],n,*p;scanf("n=%d",&n); for(p=a;p<a+n;p++)//数组名 是 首元素地址,数组元素在内存中的地址是连续的 scanf("%d",p); sort(a,n); for(p=a;p<a+n;p++) printf("%d ",*p); printf("\n"); return 0;
}
#include<stdio.h>
#define N 10
void sort(int *x,int n)// *x 是 数组 a 的地址
{
int i,j,k,t;
for(i=0;i<n-1;i++)//从前往后枚举 坑位
{
k=i;
for(j=i+1;j<n;j++)
if(x[k]>x[j])//每轮找最小值放在 前边的坑位 里边
k=j;
t=x[i],x[i]=x[k],x[k]=t;// 交换
}
}
int main()
{
int a[N],n,*p;
scanf("n=%d",&n);
for(p=a;p<a+n;p++)//数组名 是 首元素地址,数组元素在内存中的地址是连续的
scanf("%d",p);
sort(a,n);
for(p=a;p<a+n;p++)
printf("%d ",*p);
printf("\n");
return 0;
}
2. 指针+字符型转整型

输入
http://99shufu.123love55
输入
99 123 55
⭐ 注意数据类型
⭐ 源代码
#include <stdio.h>int getdig(char *p, int *q)
{
int i = 0;//记录数字的个数,并作为返回值返回
for(; p != '\0'; p++)
if(p >= '0' && *p <= '9')
{
q = p-'0';//字符型转整型
p++;
while(p != '\0' && (p >= '0' && *p <= '9'))
*q = q * 10 + (p++ -'0');//字符数组指针后移
i++;//数字数量 ++
q++;//数字数组指针后移一位
}
return i;
}
int main()
{
char str[100], *p = str;
int a[100], *q = a, count = 0;
gets(p);
count = getdig(p, q);;
for(q = a; q < a + count; q++)
printf("%4d", *q);
}
编程题
1. 字符删除问题

⭐ 注意输入输出格式问题
#include <stdio.h>define N 100000
int main()
{
char a[N],*i,x;//gets(a);//gets 读字符串会吃掉回车 scanf("%s\n", &a);//scanf不会把 enter (回车)吃掉,将会影响下一次读入 scanf("%c", &x); printf("After delete:\n"); for(i = a; *i != '\0'; i++) { if(x != *i) printf("%c", *i); } return 0;
}
代码片段
1. 递归函数计算x的n次方

⭐ 递归出口是 0 次方
#include "stdio.h"/*
//复习一下快速幂
double power(double x, int n) //
{
double res = 1.0;
while(n){
if(n & 1)
res *= x;
x *= x;
n >>= 1;
}
return res;
}
*/double power(double x, int n) //
{
// 递归出口
if(n == 0)
return 1;return x*power(x, n - 1);//第n个x 乘于 x的(n-1)次方 == x的n次方}
int main()
{
double x, a;
int n;
scanf("%lf,%d", &x, &n);
a = power(x, n);
printf("a=%f\n", a);
return 0;
}
2. 递归方法求Fibonacci数列第n项

⭐ 递归出口:斐波那契第一第二项为 1
#include "stdio.h" int fib(int n) { if(n == 1 || n == 2) return 1; return fib(n - 1) + fib(n - 2); }
int main()
{
int n;
scanf("%d", &n);
printf("NO%d=%d\n", n, fib(n));
return 0;
}
3. 递归实现十进制转二进制

⭐ 先向下递归再输出
#include "stdio.h" void dec2bin(int n) { if(n == 0)//递归出口 return; int x = n % 2; dec2bin(n / 2); printf("%d", x); }
int main()
{
int n;
scanf("%d", &n);
dec2bin(n);
printf("\n");
return 0;
}
4. 数组元素循环移位问题(左移)

⭐ 数组传参传的 是 地址
#include "stdio.h" #define N 10 void cycle(int s[], int n, int count);//n表示数组长度,count表示移动的位置数 int main() { int i, n, s[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; scanf("%d", &n);//移动的位数 printf("Before:\n"); for(i = 0; i<N; i++) printf("%4d", s[i]);cycle(s, N, n); printf("\nAfter:\n"); for(i = 0; i<N; i++) printf("%4d", s[i]); printf("\n"); return 0;
}
void cycle(int s[], int n, int count)
{
if(count == 0)
return;
int t = s[0],i;
for(i = 0; i < n-1; i++)
{
s[i] = s[i + 1];
}
s[n-1] = t;
cycle(s, n, count - 1);
}
5. 实数拆分问题


⭐ 引用传递
#include "stdio.h" void splitfloat(double x, int *intpart, double *fracpart); int main() { double a, fracpart; int intpart; scanf("%lf", &a); splitfloat(a, &intpart, &fracpart);//传地址printf("INT:%d\nFRAC:%lf\n", intpart, fracpart); return 0;
}
void splitfloat(double x, int *intpart, double *fracpart)
{
*intpart = (int)x;//浮点型 强转成 整型 向下取整(丢弃浮点数)
fracpart = x - (double)intpart;
}
6. 递归方法计算关于x的多项式的和


⭐ 递归出口 + 找规律
#include "stdio.h" double f(double x, int n) { if(n == 1)//递归出口 return x; int flag = 1;// flag 记录当前项的正负 if(n % 2 == 0) flag = -1; return flag * pow(x, n) + f(x, n - 1); }
int main()
{
double x, a;
int n;
scanf("%lf,%d", &x, &n);
a = f(x, n);
printf("a=%f\n", a);
return 0;
}

浙公网安备 33010602011771号