C语言部分练习题

1.数学类问题
(1)求根
(1.1)普通
int main()
{
int a,b,c,delta;
printf(“input three numbers:”);
scanf("%d%d%d",&a,&b,&c);
float x1,x2,r;
delta=bb-4ac;
r=sqrt(delta);
if(delta>=0){
x1=(-b+r)/(2
a);
x2=(-b-r)/(2*a);
if(x1==x2) printf(“x1=x2=%f\n”,x1);
else{
printf(“x1=%f\n”,x1);
printf(“x2=%f\n”,x2);
}
}
else printf(“无实数根!”);
}
(1.2)函数调用
#include<stdio.h>
#include<math.h>
#include<string.h>

#define N 4
#define M 5
#define delta bb-4a*c

double x1,x2;

void unequal(float a,float b,float c){
x1=(-b+sqrt(delta))/(2a);
x2=(-b-sqrt(delta))/(2
a);
printf(“x1=%f,x2=%f”,x1,x2);
}

void equal(float a,float b,float c){
x1=x2=(-b)/(2*a);
printf(“x1=%f=x2=%f”,x1,x2);
}

void zero(float a,float b,float c){
printf(“无实数根!”);
}

int main(){
float a,b,c;
printf(“input a,b,c:”);
scanf("%f%f%f",&a,&b,&c);
if(delta>0) unequal(a,b,c);
else if(delta==0) equal(a,b,c);
else zero(a,b,c);
}

(2)三角形相关问题
(2.1)求面积
int main(){
int a,b,c,s,area;
printf(“input three datas:”);
scanf("%d%d%d",&a,&b,&c);
s=(a+b+c)/2;
area=sqrt(s*(s-a)(s-b)(s-c));
printf(“a=%d,b=%d,c=%d,s=%d\n”,a,b,c,s);
printf(“area=%d\n”,area);
}
(2.2)判断三角形
int main(){
float a,b,c,s,area;
printf(“请输入您想判断的三角形的三条边:”);
scanf("%f%f%f",&a,&b,&c);
if(a+b>c && a+c>b && b+c>a) //任意两边之和大于第三边
{
if(ab && ac) printf(“此三角形是等边三角形\n”);
else if(ab ||ac || bc) printf(“此三角形是等腰三角形\n”);
else if(aa+bb
cc || aa+cc==bb || bb+cc==aa) printf(“此三角形是直角三角形\n”);
else printf(“此三角形为普通三角形\n”);
s=(a+b+c)/2;
area=sqrt(s
(s-a)(s-b)(s-c));
printf(“此三角形的面积为:%f\n”,area);
}
else printf(“此三边构不成三角形!!!\n”);
}

(3)圆相关问题
int main(){
float r,h,l,s,v;
printf(“请输入半径r,圆柱高h\n”);
scanf("%f%f",&r,&h);
l=23.14r;//计算周长
s=3.14rr;//计算圆面积
//v=3.0/4.0PIrrr;//计算圆体积
v=3.14rr*h;//计算圆柱体体积
printf(“圆周长为:l=%f\n”,l);
printf(“圆面积为:s=%f\n”,s);
//printf(“圆体积为: v1=%6.2f\n”,v1);
printf(“圆柱体积为:v=%f\n”,v);
}

(4)素数
(4.1)普通
int m,i,k;
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;++i)
if(m%i0) break;
if(i>=k+1)
printf("%d is a prime number\n",m);
else
printf("%d is not a prime number\ny",m);
(4.2)100-200素数
int m,i,k,n=0;
for(m=101;m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k;++i)
if(m%i
0) break;
if(i>=k+1)
{
printf("%d\n",m);
n=n+1;
}
if(n%n0) printf("\n");
}
printf("\n");
(4.3)函数调用
int isprime(int a){
int i,k=sqrt(a);
for(i=2;i<=k;i++)
if(a%i
0) return 0;
return 1;
}

int main(){
for(int m=2;m<=100;m++)
if(isprime(m)) printf("%d",m);
}
(4.4)求素数之和
int isprime(int x){
int i;
for(i=2;i<=x/2;i++)
if(x%i==0) return 0;
return 1;
}

int main()
{
int i,a[10],p=a,sum=0;
printf(“Enter 10 num:\n”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++)
if(isprime(
(p+i))1){
printf("%d",(a+i));
sum+=
(a+i);
}
printf("\nsum=%d\n",sum);
}
(4.5)统计素数个数
int countPrime(int n,int a[]){
int i,j,k=0;
for(i=n;i>1;i–)
{
for(j=2;j<i;j++)
if(i%j
0) break;
else continue;
if(j>=i) a[k++]=i;
}
return k;
}

int main()
{
int i,n,count;
int a[100];
printf(“input a data:”);
scanf("%d",&n);
count=countPrime(n,a);
for(i=0;i<count;i++) printf("%d\n",a[i]);//打印素数
printf("\ncount=%d\n",count);//打印统计个数
}

(5)最大公约数
(5.1)普通
int p,r,m,n,temp;
printf(“请输入两个整数:”);
scanf("%d%d",&m,&n);
if(n<m){
temp=n;
n=m;
m=temp;
}
p=nm;
while(m!=0){
r=n%m;
n=m;
m=r;
}
printf(“最大公约数%d\n”,n);
printf(“最小公倍数%d\n”,p);
(5.2)函数
void main(void)
{
int maxgy(int x,int y);
int mingb(int x,int y);
int a,b;
printf(“输入两个整数:\n”);
scanf("%d%d",&a,&b);
printf(“最大公约数为:%d\n”,maxgy(a,b));
printf(“最小公倍数为:%d\n”,mingb(a,b));
}
int maxgy(int x,int y)
{
int z;
while(y!=0)
{
z=x%y;
x=y;
y=z;
}
return x;
}
int mingb(int x,int y)
{
int z;
z=x
y/maxgy(x,y);
return z;
}

(6)统计不同原理
(6.1)统计组成不同的数
int main()
{
int i,j,k,count=0;
for(i=1;i<=9;i++){
for(j=0;j<=9;j++){
if(i==j) continue;
else{
for(k=0;k<=9;k++)
if(k!=i&&k!=j) count++;
}
}
}
printf("%d\n",count);
}
(6.2)乒乓球选对手
char i,j,k;//i为a对手 j为b对手 k为c对手
for(i=‘x’;i<=‘z’;i++)
for(j=‘x’;j<=‘z’;j++)
if(i!=j)
for(k=‘x’;k<=‘z’;k++)
if(i!=k&&j!=k)
if(i!=‘x’&&k!=‘x’&&k!=‘z’) printf(“A %c\nB %c\nC %c\n”,i,j,k);

(7)二分求幂

2.求和一类问题
(1)求PI/4
float t=1.0,pi=0,s=1,n=1;
while(fabs(t)>1e-6){
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf(“pi=%f\n”, pi);

(2)阶乘相关
(2.1)求平方的阶乘
//1.求平方
//2.调用第二个函数求阶乘(传递参数)
//3.返回主函数
int quare(int x){
int temp;
temp=xx;
int multi(int y);
int result;
result=multi(temp);
return result;
}
//1.接受参数
int multi(int y){
int c=1;
int i;
for(i=1;i<=y;i++) c=c
i;
return c;
}

int main(){
int i;
int s=0;
for(i=2;i<=3;i++) s=s+quare(i);//因为是2与3的阶乘
printf("\ns=%d\n",s);
}
(2.2)合并版
int quare(int x){
int temp;
temp=xx;
int i,result=1;
for(i=1;i<=temp;i++) result=result
i;
return result;
}

int main(){
int i;
int s=0;
for(i=2;i<=3;i++) s=s+quare(i);
printf("\ns=%d\n",s);
}
(2.3)求阶乘分之一的和
double fun(int n){
double s=0.0,fac=1.0;
int i;
for(i=1;i<=n;i++){
fac=fac/(fac*i);
s=s+fac;
}
return s;
}

int main(){
printf(“s=%lf”,fun(5));
}

(3)1-0.5+0.3-0.25
(3.1)while循环
int i=1;
double a=1.0,b=2.0,sum;
while(b<=100)
{
i=-i;
sum=i/b;
a=a+sum;
b=b+1;
}
printf("%f\n",a);
(3.2)for循环
double flag=1,sum=1,i,temp;
for(i=2;i<101;i++)
{
flag=-flag;
temp=flag/i;
sum=temp+sum;
}
printf("%f\n",sum);

(4)求出1-12奇数的乘积
int i,s=1;
for(i=1;i<12;i++)
{
if(i%2!=0) s=s*i;//取模(余数),不为零i为奇数不能被整除,否则能被整除为偶数
else continue; //结束本次执行下次
}
printf("%d\n",s);

(5)求n个和:a+aa+aaa+…+n个a
int main(){
int a,n,i,temp,sum=0;
printf(“input a n:”);
scanf("%d%d",&a,&n);
printf("\na=%d n=%d\n",a,n);
temp=a;//第一位放到外面
for(i=1;i<=n;i++){
sum=sum+a;
a=a*10+temp;
}
printf(“sum=%d\n”,sum);
}

(6)求分子分母间有和的关系
int n;
double i=2,j=1,k,s=0.0;
for(n=1;n<=20;n++)
{
s=s+i/j;//i当分子,j当分母
k=i;//存在一个临时变量
i=i+j;//下一个的分子
j=k;//下一个的分母
}
printf(“sum is %f\n”,s);

(7)求每个位数之和
int s=0;
num=abs(num);
do{
s+=num%10;
num/=10;
}while(num);

(8)输出数字之积大于数字之和
int main()
{
int n,multi,sum,m;
for(n=10;n<=99;n++){
multi=1;
sum=0;
m=n;
while(m>0){
multi*=m%10;
sum+=m%10;
m=m/10;
}
if(multi>sum) printf("%d\n",n);
}
}

3.排序与插入
(1)排序
(1.1)普通逆序
int i,temp,a[N];
printf(“input data:”);
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<N;i++) printf("%d",a[i]);
for(i=0;i<N/2;i++) {
temp=a[i];
a[i]=a[N-1-i];
a[N-1-i]=temp;
}
printf("\n");
for(i=0;i<N;i++) printf("%d",a[i]);
(1.2)冒泡排序
(1.2.1)
int i,j,t,a[10];
printf(“input 10 numbers:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<9;i++) //for(i=0;i<n;i++) for(j=0;j<n-i-1;j++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1]) {
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=1;i<=10;i++) printf("%d",a[i]);
(1.2.2)
int main(){
int n,i,j,temp;
int buf[100];
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++) scanf("%d",&buf[i]);
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
if(buf[j]>buf[j+1]){
temp=buf[j];
buf[j]=buf[j+1];
buf[j+1]=temp;
}
}
}
for(i=0;i<n;i++) printf("%d",buf[i]);
}
}
(1.3)字符气泡排序
void sort(char str[]){
int i,j;
char t;
for(i=N-1;i>0;i–){
for(j=0;j<i;j++){
if(str[j]>str[j+1]){
t=str[j];
str[j]=str[j+1];
str[j+1]=t;
}
}
for (j=0;j<N;j++) printf("%c",str[j]);
}
}

int main(){
char string[N];
printf(“please input a string:”);
gets(string);
sort(string);
}
(1.4)选择排序
int i,j,k,temp,a[10];
printf(“input 10 numbers:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++){ //for(i=0;i<len-1;i++) 一共要拿len-1个数出来和其他数比
k=i; //让k记住这个数
for(j=i+1;j<10;j++) //for(j=i+1;j<len;j++) 让k这个数和其他未排序的数比
if(a[k]>a[j]) k=j;
if(k!=i){
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
printf(“sorted:\n”);
for(i=0;i<10;i++) printf("%d",a[i]);

/*for(i=0;i<len-1;i++)//一共要拿len-1个数出来和其他数比
{
k=i;//让k记住这个数
for(j=i+1;j<len;j++)//让k这个数和其他未排序的数比
if(a[k]>a[j])
{
t = a[k];
a[k] = a[j];
a[j] = t;

        }
}*/

(1.5)插入排序
int insertSort(int a[],int len){
int i,j,temp;
for(i=1;i<len;i++){
temp=a[i];
for(j=i-1;j>=0&&a[j]>temp;j–) a[j+1] = a[j];
a[j+1]=temp;
}
}

int main(){
int a[5]={5,3,8,6,4},i;
insertSort(a,5);
for(i=0;i<5;i++) printf("%d “,a[i]);
}
(1.6)快排
(1.6.1)类似快排插入
int i=0,n;
int ins_value,ori_data[20],res_data[20];
printf(“input place :”);
scanf(”%d",&n);
printf(“input data:”);
for(i=0;i<n;i++) scanf("%d",&ori_data[i]);
printf(“insert value:”);
scanf("%d",&ins_value);
while(ins_value>ori_data[i]&&i<n){
res_data[i]=ori_data[i];
i++;
}
res_data[i]=ins_value;
for(i=i+1;i<n+1;i++) res_data[i]=ori_data[i+1];
puts("\n");
for(i=0;i<n+1;i++){
printf("%d",res_data[i]);
if((i+1)%5==0) puts("\n");
}
(1.6.2)快排
int quickSort(int a[],int low,int high){
int pos;
if(low<high){
pos = findPos(a,low,high);
quickSort(a,low,pos-1);
quickSort(a,pos+1,high);
}
}

int findPos(int a[],int low,int high){
int value=a[low];
while(low<high){
//(low<high)这个条件不能少
while(low<high && a[high]>=value) high–;
a[low] = a[high];
while(low<high && a[low]<=value) low++;
a[high] = a[low];
}
a[high]=value;
return high;
}

int main(){
int a[5]={5,3,8,6,4},i;
quickSort(a,0,4);
for(i=0;i<5;i++) printf("%d ",a[i]);
}
(1.7)利用指针排序
(1.7.1)
sort(int x[],int n){
int temp,i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k]) k=j;
if(k!=i){
temp=x[i];
x[i]=x[k];
x[k]=temp;
}
}
}

int main(){
int a[10],i,*p;
p=a;
printf(“input original data:”);
for(i=0;i<10;i++) scanf("%d",p++);
p=a;
sort(a,10);
printf(“sort array:”);
for(p=a,i=0;i<10;i++) {
printf("%d",*p);
p++;
}
}
(1.7.2)指针逆序
int main()
{
void sort(char *p,int m);
int i,n;
char *p,num[20];
printf(“input n:”);
scanf("%d",&n);
printf(“please input these numbers:”);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
p=&num[0];
sort(p,n);
printf(“now is”);
for(i=0;i<n;i++)
printf("%d “,num[i]);
printf(”\n");
return 0;
}
void sort(char *p,int m)
{
int i;
char temp,*p1,*p2;
for(i=0;i<m/2;i++)
{
p1=p+i;
p2=p+(m-1-i);
temp=*p1;
*p1=*p2;
*p2=temp;
}
}
(1.8)堆排序
void swap(int *a,int *b)
{
int temp = *a;
*a = b;
b = temp;
}
void percdown(int a[],int node,int len)
{
int i;
int temp = a[node];
for(i=2
node;i<=len;i
=2)
{
if(i<len&&a[i]<a[i+1])//两个孩子相比较
i++;//i指向最大的孩子
if(a[i]>temp)//最大的孩子和双亲进行比较
{
a[node] = a[i];//让最大的孩子的值赋值给双亲结点
node = i;//node就指向换数的那个孩子
/这两句最难理解,但是又很好理解其实就是一个换数的过程/
}
}
a[node] = temp;
}
void heap_sort(int *a,int len)
{
int i;
for(i=len/2;i>0;i–)//len/2:最后一个双亲结点 从下往上,从右往左
percdown(a,i,len);//len:当前堆里的元素个数
for(i=len;i>1;i–)
{
swap(&a[1],&a[i]);
percdown(a,1,i-1);
}

}
int main()
{
int a[5] = {5,3,8,6,4};
heap_sort(a,5);
int i;
for(i=0;i<5;i++)
printf("%d ",a[i]);
return 0;
}

(2)插入
int a[6]={2,8,6,9,5,1};
int i,temp,x;
printf(“input data:”);
scanf("%d",&x);
for(i=0;i<6;i++){
if(x<a[i]){
temp=a[i];
a[i]=x;
x=temp;
}
printf("%3d",a[i]);
}
printf("%3d",x);

(3)完整:逆序+插入
//逆序排序
int i,j,p,q,s,n,a[11];
printf(“input 10 numbers:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=i;
q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]){p=j;q=a[j];}
if(p!=i){
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d",a[i]);
}
//逆序插入到合适位置
printf("\ninput number:\n");
scanf("%d",&n);
for(i=0;i<10;i++)
if(n>a[i]){
for(s=9;s>=i;s–) a[s+1]=a[s];
break;
}
a[i]=n;
for(i=0;i<=10;i++) printf("%d",a[i]);
printf("\n");

(4)查找
int main(){
int i,n;
int buf[100];
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++) scanf("%d",&buf[i]);
int x,ans=-1; //下标找不到答案初始为-1
scanf("%d",&x);
for(i=0;i<n;i++) {
if(x==buf[i]){
ans=i;
break;
}
}
printf("%d",ans);
}
}

4.平均分
(1.1)一维数组简单平均分
int i,j,s=0,a[5][3],average,v[3];
printf(“input scores:”);
for(i=0;i<3;i++) {
for(j=0;j<5;j++){
scanf("%d",&a[j][i]);
s=s+a[j][i];}
v[i]=s/5;
s=0;//设置重新为0的标志
}
average=(v[0]+v[1]+v[2])/3;
printf(“math:%d\nc languag:%d\ndbase:%d\n”,v[0],v[1],v[2]);
printf(“total:%d\n”, average );
(1.2)
float aver(float a[5]){
int i;
float ave,s=a[0];
for(i=1;i<5;i++) s=s+a[i];
ave=s/5;
return ave;
}

int main(){
float average,scores[5];
int i;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i++) scanf("%f",&scores[i]);
average=aver(scores);
printf(“average score is %5.2f”,average);
}
(1.3)
float i,max,min,a[10];
float ave=0,sum=0;
for(i=0;i<10;i++) scanf("%d",&a[i]);
max=min=a[0];
for(i=0;i<10;i++)
{
if(max<data[i]) max=data[i];
else if(min>data[i]) min=data[i];
sum+=data[i];
}
ave=sum/10;
printf(“max=%f min=%f ave=%f”,max,min,ave);
(1.4)
int score(int arr[10],int n){
int sum=0,res,i;
for(i=0;i<n;i++) sum=sum+arr[i];
res=sum/n;
return res;
}

int main()
{
int i,a[10],ave;
for(i=0;i<10;i++) scanf("%d",&a[i]);
ave=score(a,10);
for(i=0;i<10;i++)
if(a[i]>ave) printf("%d",a[i]);
}
(1.5)平均分+排序
int average(int b[]){
int j,ave,sum=0;
for(j=0;j<10;j++) sum=sum+b[j];
ave=sum/10;
return ave;
}

int sort(int b[]){
int i,j,k,max;
for(i=0;i<10;i++){
max=b[i];
k=i;
for(j=i+1;j<10;j++)
if(max<b[j]){
max=b[j];
k=j;
}
b[k]=b[i];
b[i]=max;
}
}

int main()
{
int a[10],j,ave;
for(j=0;j<10;j++) scanf("%d",&a[j]);
ave=average(a);
printf(“ave=%d”,ave);
sort(a);
for(j=0;j<10;j++) printf("%d",a[j]);
}

(2)多维数组已经定义
float a_stu[N];

int average1(int str1[][5],int m,int n){
int i,j;
float ave1;
for(i=0;i<m;i++){
float sum=0;
for(j=0;j<n;j++){
sum+=str1[i][j];
}
a_stu[i]=sum/n;
printf("%f",a_stu[i]);
}
}

int average2(int str2[][5],int m,int n){
int i,j;
float ave2;
for(j=0;j<m;j++){
float sum=0;
for(i=0;i<n;i++){
sum+=str2[i][j];
}
ave2=sum/m;
printf("%f",ave2);
}
}

int average3(int str3[][5],int m,int n){
int max=str3[0][0];
int i,j,k,p;
for(i=0;i<10;i++){
for(j=0;j<5;j++){
max=str3[i][j];
k=i+1;
p=j+1;
}
}
printf(“max=%d,k=%d,p=%d\n”,max,k,p);
}

int average4(int str4[][5],int m,int n){
int i;
float sum1=0,sum2=0;
float ave4;
for(i=0;i<m;i++)
{

    sum1+=a_stu[i];
    sum2+= a_stu[i]*a_stu[i];
    ave4=sum2/m-(sum1/m)*(sum1/m);

}
printf("%f\n",ave4); 

}

int main(){
int str[10][5]={{87,88,92,67,78},{88,86,87,98,90},{76,75,65,65,78},{67,87,60,90,67},
{77,78,85,64,56},{76,89,94,65,76},{78,75,64,67,77},{77,76,56,87,85},{84,67,78,76,89},
{86,75,64,69,90}};
int i,j;
printf(“每个学生的平均成绩\n”);
average1(str,10,5);
printf(“每门课的平均成绩\n”);
average2(str,10,5);
printf(“最高分对应的学生和课程\n”);
average3(str,10,5);
printf(“某个学生的平均成绩的偏差\n”);
average4(str,10,5);
}

(3)多维数组未定义(即输入数据)
#define N 10
#define M 5
float score[N][M];
float a_stu[N],a_cour[M];
int r,c;
//1.输入成绩
void input(){
int i,j;
for(i=0;i<N;i++) {
printf(“studend %d:”,i+1);
for(j=0;j<M;j++) scanf("%f",&score[i][j]);
}
}

//2.平均成绩
void average(){
int i,j;
float s=0;
for(i=0;i<N;i++) {
for(j=0;j<M;j++) s+=score[i][j];
a_stu[i]=s/5;
}
}

//3.平均课程
void avelesson(){
int i,j;
float s;
for(j=0;j<M;j++) {
s=0;
for(i=0;j<N;i++) s+=score[i][j];
a_cour[j]=s/N;
}
}

//4.最高成绩
float maxgrade(){
float max;
int i,j;
max=score[0][0];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(max<score[i][j]){
max=score[i][j];
r=i+1;
c=j+1;
}
return max;
}

//5.方差
float fangcha(){
int i;
float sum1,sum2;
for(i=0;i<N;i++){
sum1+=a_stu[i]a_stu[i];
sum2+=a_stu[i];
}
return (sum1/N-(sum2/N)
(sum2/N));
}

int main(){
int i,j;
float h;
input();
average();
avelesson();
for(i=0;i<N;i++){
printf(“num is %d”,i+1);
for(j=0;j<M;j++) printf("%f",score[i][j]);
printf("%f",a_stu[i]);
}
printf("\n average:");
for(j=0;j<M;j++) printf("%f",a_cour[j]);
printf("\n");
h=maxgrade();
printf(“maxgarde:%f no:%d cour:%d”,h,r,c);
}

(5)扩展
#define N 10
#define M 5

void input(char na[][20],int no[]){
int i;
for(i=0;i<10;i++) {
printf(“staff %d:”,i+1);
scanf("%s",na[i]);
printf(“number %d:”,i+1);
scanf("%d",&no[i]);
}
}

//按职工号由小到大顺序排序,姓名顺序也随之调整
void sort(char na[][20],int no[]){
int i,j,temp;
char t[20];
for(i=0;i<10;i++)
for(j=i+1;j<10;j++){
if(no[i]>no[j]){
temp=no[i];
no[i]=no[j];
no[j]=temp;
strcpy(t, na[i]);
strcpy(na[i], na[j]);
strcpy(na[j], t);
}
}
}

void search(char na[][20],int no[],int x){
int low,high,mid;
low=0;
high=9;
while(low<=high){
mid=(low+high)/2;
if(x>no[mid]) low=mid+1;
else if(x<no[mid]) high=mid-1;
else if(x==no[mid]){
printf("%s\n", na[mid]);
break;
}
}
if(x!=no[mid]) printf(“not find:”);
}

int main(){
char name[10][20];
int num[10],number,i;
input(name,num);
sort(name,num);
for(i=0;i<10;i++){
printf("%s",name[i]);
printf("%d",num[i]);
}
printf(“input your number:”);
scanf("%d",&number);
search(name,num,number);
}

5.数组赋值交换最值问题
(1)赋值
int i,j,temp,a[][4]={3,16,12,89,45,69,78,23,46,21,42,34};
int b[3];
for(i=0;i<2;i++){
temp=a[i][0];
for(j=1;j<=3;j++)
if(a[i][j]>temp) temp=a[i][j];
b[i]=temp;}
//打印
printf("\narray a:\n");
for(i=0;i<=2;i++)
{ for(j=0;j<=3;j++)
printf("%5d",a[i][j]);
printf("\n");}
//打印
printf("\narray b:\n");
for(i=0;i<=2;i++)
printf("%5d",b[i]);

(2)找出行号列号
int main()
{
int i,j,row=0,column=0,max;
int a[3][4];
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max){
max=a[i][j];
row=i;
column=j;
}
printf(“max=%d row=%d column=%d\n”,max,row,column);
}

6.日期差值问题
题目描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们
之间的天数为两天
#include <stdio. h>
#define ISYEAP( x) x % 100 ! = 0 && x % 4 == 0 | | x % 400 == 0 ? 1 : 0
/ / 定义宏判断是否是闰年,方便计算每月天数
i nt dayOf Mont h[ 13] [ 2] = {
0, 0,
31, 31,
28, 29,
31, 31,
30, 30,
31, 31,
30, 30,
31, 31,
31, 31,
30, 30,
31, 31,
30, 30,
31, 31
} ; / / 预存每月的天数, 注意二月配合宏定义作特殊处理
struct Date { / / 日期类, 方便日期的推移
int Day;
int Mont h;
int Year ;
void next Day( ) { / / 计算下一天的日期
Day ++;
if ( Day > dayOfMonth[ Month] [ ISYEAP( Year ) ] ) { / / 若日数超过了当月最大日数
Day = 1;
Month ++; / / 进入下一月
if( Month > 12) { / / 月数超过12
Month = 1;
Year ++; / / 进入下一年
}
}
}
} ;
int buf [ 5001] [ 13] [ 32] ; / / 保存预处理的天数
int Abs( int x) { / / 求绝对值
return x < 0 ? - x : x;
}
int main ( ) {
Date tmp;
int cnt = 0; / / 天数计数
tmp. Day = 1;
tmp. Mont h = 1;
tmp. Year = 0; / / 初始化日期类对象为0年1月1日
while( t mp. Year ! = 5001) { / / 日期不超过5000年
buf [ t mp. Year ] [ t mp. Mont h] [ t mp. Day] = cnt ; / / 将该日与0年1月1日的天数差保
存起来
tmp. next Day( ) ; / / 计算下一天日期
cnt ++; / / 计数器累加,每经过一天计数器即+1,代表与原点日期的间隔又增加一天
}
i nt d1 , m1 , y1;
i nt d2 , m2 , y2;
whi l e ( scanf ( " %4d%2d%2d" , &y1, &m1, &d1) ! = EOF) {
scanf ( " %4d%2d%2d" , &y2, &m2, &d2) ; / / 读入要计算的两个日期
pr i nt f ( " %d\ n" , Abs( buf [ y2] [ m2] [ d2] - buf [ y1] [ m1] [ d1] ) + 1) ; / / 用预处
理的数据计算两日期差值, 注意需对其求绝对值
}
r et ur n 0;
}

7.数位拆解
(7.1)普通输出位数
(7.1.1)
//判断位数
//求出各个位
//逆序打印每个数
int num;
printf(“请输入一个合适的整数:”);
scanf("%d",&num);
int place;//定义位数
if(num>9999) place=5;
else if(num>999) place=4;
else if(num>99) place=3;
else if(num>9) place=2;
else place=1;
printf("\n%d是%d位数\n",num,place);//输出位数
//分别输出每一位数字
int indiv,ten,hundred,thousand,ten_thousand;
ten_thousand=num/10000;
thousand=(num-ten_thousand10000)/1000;
hundred=(num-ten_thousand
10000-thousand1000)/100;
ten==(num-ten_thousand
10000-thousand1000-hundred100)/10;
indiv=(num-ten_thousand10000-thousand1000-hundred100-ten10);
//利用switch逆序打印每一位数
switch(place){
case 5:printf("\n%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);break;
case 4:printf("\n%d%d%d%d\n",indiv,ten,hundred,thousand);break;
case 3:printf("\n%d%d%d\n",indiv,ten,hundred);break;
case 2:printf("\n%d%d\n",indiv,ten);break;
case 1:printf("\n%d\n",indiv);break;
}
(7.1.2)扩展
void printNum(int n){
int indiv,ten,hundred,thousand;
thousand=n/1000;
hundred=(n-thousand1000)/100;
ten=(n-thousand
1000-hundred100)/10;
indiv=n-thousand
1000-hundred100-ten10;
printf("%d %d %d %d",thousand,hundred,ten,indiv);
}

int main(){
int n;
printf(“输入一个四位数:”);
scanf("%d",&n);
printNum(n);
}
(7.1.3)扩展
void insertSpace(char num[]){
int i;
for(i=strlen(num);i>0;i–){
num[2i]=num[i];
num[2
i-1]=’ ';
}
printf(“输出四位数:”);
puts(num);
}

int main(){
char num[10];
printf(“输入一个四位数:”);
gets(num);
insertSpace(num);
}

(7.2)水仙花数
int i,j,n,k;
for(i=100;i<1000;i++)
{
j=i/100;
n=i/10-j10;
k=i%10;
if(i==j
jj+nnn+kk*k) printf(“水仙花数:%d \n”,i);
}

(7.3)写个算法,对 2 个小于 1000000000 的输入,求结果。
特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35
int a,b;
int i,j;
while(scanf("%d%d",&a,&b)!=EOF){
int buf1[20],buf2[20],size1,size2;//用buf1, buf2分别保存从两个整数中拆解出来的数位数字, 其数量由size1, size2表示
while(a!=0){
buf1[size1++]=a%10;
a/=10;
}
while(b!=0){
buf2[size2++]=b%10;
b/=10;
}
int res=0;
for(i=0;i<size1;i++)
for(j=0;j<size2;j++) res+=buf1[i]*buf2[j];
printf("%d\n",res);
}

8.统计字符
(1)一维数组
char c;
int letters=0,space=0,digit=0,other=0;
printf(“请输入一个字符:\n”);
while((c=getchar())!=’\n’){
if(c>=‘a’&&c<=‘z’||c>=‘A’&&c<=‘Z’) letters++;
else if(c==’ ') space++;
else if(c>=‘0’&&c<=‘9’) digit++;
else other++;
}
printf(“字母数:%d\n空格数:%d\n数字数%d\n其他%d\n”,letters,space,digit,other);

(2)二维数组
main()
{
char word[3][80];
int i,j,a,b,c,d,e;
a=b=c=d=e=0;
printf(“输入3行文字:\n”);
for(i=0;i<3;i++)
{
gets(word[i]);
for(j=0;j<80&&word[i][j]!=’\0’;j++)
{
if(word[i][j]>=‘A’&&word[i][j]<=‘Z’) a++;
else if(word[i][j]>=‘a’&&word[i][j]<=‘z’) b++;
else if(word[i][j]>=‘0’&&word[i][j]<=‘9’) c++;
else if(word[i][j]==’ ') d++;
else e++;
}
}
printf(“大写字母%d个\n小写字母%d个\n数字%d个\n空格%d个\n其他字符%d个\n”,a,b,c,d,e);
}

(3)函数
int letters,space,digit,other;

void count(char c[]){
int i;
for(i=0;c[i]!=’\0’;i++){
if(c[i]>=‘a’&&c[i]<=‘z’||c[i]>=‘A’&&c[i]<=‘Z’) letters++;
else if(c[i]==’ ') space++;
else if(c[i]>=‘0’&&c[i]<=‘9’) digit++;
else other++;
}
}

int main(){
char str[10];
printf(“输入一个字符串:”);
gets(str);
letters=0;space=0;digit=0;other=0;
count(str);
printf("%d %d %d %d",letters,space,digit,other);
}

(4)用指针统计
int main(){
int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[20];
printf(“input string: “);
while((s[i]=getchar())!=’\n’) i++;
p=&s[0];
while(*p!=’\n’)
{
if((‘A’<=*p)&&(*p<=‘Z’)) ++upper;
else if((‘a’<=*p)&&(*p<=‘z’)) ++lower;
else if(*p==’ ') ++space;
else if((*p<=‘9’)&&(*p>=‘0’)) ++digit;
else ++other;
p++;
}
printf(“upper case :%d lower case:%d”,upper,lower);
printf(” space:%d digit:%d other :%d\n”,space,digit,other);
}

9.hash的应用
(9.1)读入 N 名学生的成绩,将获得某一给定分数的学生人数输出
int main(){
int n,i;
while(scanf("%d",&n)!=EOF&&n!=0) {//输入判断增加对n是否等于零进行判断
int Hash[101]={0}; //建立一个初始为0的Hash数组用来记录各种分数出现的次数
for(i=1;i<=n;i++) {
int x;
scanf("%d",&x) ;
Hash[x] ++; //统计分数出现次数
}
int x;
scanf ("%d",&x);
printf ("%d\n", Hash[x]); //得到需要查询的目标分数后, 只需简单的查询我们统计的数量即可
}
}

10.排版问题
(10.1)菱形
int i,j,k;
for(i=0;i<=3;i++){
for(j=0;j<=2-i;j++) printf(" “);
for(k=0;k<=2i;k++) printf("”);
printf("\n");
}
for(i=0;i<=2;i++){
for(j=0;j<=i;j++) printf(" “);
for(k=0;k<=4-2i;k++) printf("”);
printf("\n");
}
(10.2)梯形
int h,i,j;
while(scanf("%d",&h)!=EOF) {
int maxline=h+(h-1)2; //计算最后一行个数
for(i=1;i<=h;i++) {
for(j=1;j<=maxline;j++){//输出每行空格或者*
if(j<maxline-h-(i-1)2+1) printf(" “);
else printf(”
");
}
}
printf("\n");
}

11.落地反弹
double s=100,h=s/2;//定义初值,第一次弹跳高度
int i;
//for循环进行的第二次
for(i=2;i<=10;i++){
s=s+2*h;//从第二次落地开始的总位移
h=h/2;//反弹的高度
}
printf(“十次共经过%f 米\n”,s);
printf(“第十次反弹%f 米\n”,h);

12.猴子吃桃
int i,s=1,b; //s为第十天的桃子, b是前一天桃子
for(i=9;i>0;i–) {
b=(s+1)*2;
s=b;
}
printf(“first day is %d 个桃子”,b);

14.找鞍点
#define N 4
#define M 5 /* 数组为4行5列 /
int main(){
int i,j,k,a[N][M],max,maxj,flag;
printf(“please input matrix:\n”);
for (i=0;i<N;i++) /
输入数组 /
for (j=0;j<M;j++) scanf("%d",&a[i][j]);
for (i=0;i<N;i++)
{
max=a[i][0]; /
开始时假设a[i][0]最大 /
maxj=0; /
将列号0赋给maxj保存 /
for (j=0;j<M;j++) /
找出第i行中的最大数 /
if (a[i][j]>max) {max=a[i][j]; /
将本行的最大数存放在max中 / maxj=j;/ 将最大数所在的列号存放在maxj中 /}
flag=1; /
先假设是鞍点,以flag为1代表 /
for (k=0;k<N;k++)
/
将最大数和其同列元素相比 /
if (max>a[k][maxj]) {flag=0;/
如果max不是同列最小,表示不是鞍点令flag1为0 /continue;}
/
如果flag1为1表示是鞍点 /
if(flag){ printf(“a[%d][%d]=%d\n”,i,maxj,max); /
输出鞍点的值和所在行列号 / break;}
}
if(!flag) printf(“It is not exist!\n”);/
如果flag为0表示鞍点不存在 /
}
}
if(!flag) printf(“It is not exist!\n”);/
如果flag为0表示鞍点不存在 */
return 0;
}

15.大小写
(1)密码转译
char a[10],b[10];
int i;
printf(“input data:”);
gets(a);
for(i=0;i!=’\0’;i++){
if(‘A’<=a[i]&&a[i]<=‘Z’) b[i]=155-a[i];//‘A’+‘Z’=155
else if(‘a’<=a[i]&&a[i]<=‘z’) b[i]=219-a[i];//‘a’+‘z’=219
else b[i]=a[i];
}
printf(“原密码为:\n”);
puts(a);
printf(“密码翻译成原文为:\n”);
puts(b);

(2)大小写转换
char c1,c2;
c1=getchar();
c2=c1+32;
putchar(c2);
putchar(’\n’);

16.字符串
(1)连接
(1.1)普通
char a[10],b[10],c[20];
int i,j;
printf(“输入两个字符串:\n”);
gets(a);
gets(b);
for(i=0;a[i]!=’\0’;i++) c[i]=a[i];
for(j=0;b[j]!=’\0’;j++) c[i+j]=b[j];
c[i+j+1]=’\0’;
printf(“两字符串连接后的字符串为:%s\n”,c);
(1.2)连接用函数
void link(char a[],char b[]){
char c[20];
int i,j;
for(i=0;a[i]!=’\0’;i++) c[i]=a[i];
for(j=0;b[j]!=’\0’;j++) c[i+j]=b[j];
c[i+j+1]=’\0’;
printf(“两字符串连接后的字符串为:%s\n”,c);
}

int main(){
char a[20],b[20];
printf(“input string:”);
gets(a);
gets(b);
link(a,b);
}
(1.3)连接并返回长度
int strcen(char a[],char b[]){
int num=0,n=0;
while(*(a+num)!=’\0’) num++;
while(b[n]){
*(a+num)=b[n];
num++;
n++;
}
return num;
}

(4)copy
(4.1)复制
char s1[10],s2[10];
int i;
printf(“输入s2字符串:\n”);
gets(s2);
for(i=0;s1[i]=s2[i];i++);
printf(“s2字符串输出:\n”);
printf("%s",s1);
(4.2)指针复制
char a[]=“I love china”,b[50];
int i;
for(i=0;*(a+i)!=’\0’;i++) (b+i)=(a+i);
*(b+i)=’\0’;
printf(“a:”);
puts(a);
printf(“b:”);
for(i=0;b[i]!=’\0’;i++) printf("%c",b[i]);
(4.3)
char a[]=“I love china”,b[50],*p1,*p2;
p1=a;
p2=b;
for(;*p1!=’\0’;p1++,p2++) *p2=*p1;
*p2=’\0’;
//printf(“a is:%s”,a);
//printf(“b is:%s”,b);
puts(a);
puts(b);
(4.4)函数复制
copy(char str1[],char str2[]){
int i;
for(i=0;str1[i]!=’\0’;i++){
str2[i]=str1[i];
}
str2[i]=’\0’;
}

int main(){
char a[]=“fdhkjsdjf”;
char b[]=“ljklsjdklf”;
//char *str1=a,*str2=b;
copy(a,b);
printf(“a=%s b=%s”,a,b);
}
(4.5)
copy(char *str1,char *str2){
for(;*str1!=’\0’;str1++,str2++){
*str2=*str1;
}
*str2=’\0’;
}

int main(){
char *a=“fdhkjsdjf”;
char b[]=“ljklsjdklf”;
char *p=b;
copy(a,p);
printf(“a=%s b=%s”,a,b);
}

(5)字符串比较
char s1[100],s2[100];
printf(“请输入s1:”);
gets(s1);
printf(“请输入s2:”);
gets(s2);
int i,num=0;
for(i=0;s1[i]!=’\0’||s2[i]!=’\0’;i++)
{
printf(“s1[%d]=%d\n”,i,s1[i]);
printf(“s2[%d]=%d\n”,i,s2[i]);
num=num+s1[i]-s2[i];
printf("\n");
}
printf(“结果是:%d\n\n”,num);

(6)长度
(6.1)求字符串长度
int length(char *p){//必须是int
int n=0;
while(*p!=’\0’){
n++;
p++;
}
return n;
}

int main(){
int len;
char str[20];
printf(“input string:”);
gets(str);
len=length(str);
printf(“length is %d”,len);
}
(6.2)
int lenG(char *s){
int len=0;
while(*s++) len++;
return len;
}

int main()
{
char *str;
printf(“input a string: “);
gets(str);
printf(”\n%s length=%d\n”,str,lenG(str));
}

(7)从指定位置复制字符串
int copy(char *p1,char *p2,int m){
int n=0;
while(n<m-1){//先找到指定位置
n++;
p1++;
}
while(*p1!=’\0’){//从指定位置进行复制,同时进行
*p2=*p1;
p1++;
p2++;
}
*p2=’\0’;
}

int main(){
int m;
char a[20],b[20];
printf(“input string:”);
gets(a);
printf(“start place is :”);
scanf("%d",&m);
if(strlen(a)<m) printf(“error!”);
else{
copy(a,b,m);
printf("the result is: ");
puts(b);
}
}

(8)比较函数
(8.1)自定义比较函数
int compareStr(char p1,char p2){
int i=0;
while(
(p1+i)==
(p2+i))
if((p1+i++)==’\0’) return 0;
return (
(p1+i)-*(p2+i));
}

int main()
{
int m;
char *p1,*p2,a[20],b[20];
printf(“input two strings:”);
gets(a);
gets(b);
p1=a;
p2=b;
m=compareStr(p1,p2);
printf(“result:%d \n”,m);
}
(8.2)
int compare(char *s1,char *s2){
while(*s1&&*s2&&*s1==*s2){
s1++;
s2++;
}
return *s1-*s2;
}

int main()
{
printf("%d\n",compare(“abCd”,“abc”));
}

(9)字符串输入加比较例题
#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
char st[20],c[5][20];
int i,j,p;
printf(“input country’s name:’”);
for(i=0;i<5;i++) gets(c[i]);//用gets输入五个字符串
printf("\n");
for(i=0;i<5;i++){
p=i;
strcpy(st,c[i]);
for(j=i+1;j<5;j++)
if(strcmp(c[j],st)<0) {p=j;strcpy(st,c[j]);}
if(p!=i)
{
strcpy(st,c[i]);
strcpy(c[i],c[p]);
strcpy(c[p],st);
}
puts(c[i]);
}
printf("\n");
}

(10)输出最大字符+统计比较次数
char maxchar(char c[]){
int i;
char max=c[0];
for(i=0;i<10;i++)
if(max<c[i]) max=c[i];
return max;
}

char count(char a[],char b[]){
int i,high=0,low=0,equal=0;
for(i=0;i<10;i++)
if(a[i]>b[i]) high++;
else if(a[i]==b[i]) equal++;
else low++;
printf(“high=%d equ=%d low=%d”,high,equal,low);
}

int main()
{
char a[10],b[10],max1,max2;
int i;
for(i=0;i<10;i++) scanf("%c",&a[i]);
for(i=0;i<10;i++) scanf("%c",&b[i]);
max1=maxchar(a);
max2=maxchar(b);
count(a,b);
}

(11)3个字符串找出最大者
int main()
{
char str[3][20];
char c[20];
int i;
for(i=0;i<3;i++) gets(str[i]);
if(strcmp(str[0],str[1])>0) strcpy(c,str[0]);
else strcpy(c,str[1]);
if(strcmp(str[2],c)>0) strcpy(c,str[2]);
printf("the max is: %s ",c);
}

(12)利用指针输出字符串大小
void swap(char *p1,char *p2){
char p[20];
strcpy(p,p1);
strcpy(p1,p2);
strcpy(p2,p);
}

int main(){
char n1[20],n2[30],n3[20];
//int *p1,*p2,*p3;
printf(“input three lines: “);
gets(n1);
gets(n2);
gets(n3);
if(strcmp(n1,n2)>0) swap(n1,n2);
if(strcmp(n1,n3)>0) swap(n1,n3);
if(strcmp(n2,n3)>0) swap(n2,n3);
printf(“now the order is:”);
printf(”%s\n%s\n%s\n”,n1,n2,n3);
}

17.字符串排序
(1)等长度字符串
int main()
{
void sort(char s[][6]);
int i;
char str[10][6];
printf(“input 10 strings:\n”);
for(i=0;i<10;i++)
scanf("%s",str[i]);
sort(str);
printf(“now is:\n”);
for(i=0;i<10;i++)
printf("%s\n",str[i]);
return 0;
}
void sort(char s[10][6])
{
int i,j;
char *p,temp[10];
p=temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(s[j],s[j+1])>0)
{
strcpy(p,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],p);
}
}

(2)不等长度字符串
int main()
{
void sort(char *[]);
int i;
char p[10],str[10][20];
for(i=0;i<10;i++)
p[i]=str[i];
printf(“input 10 strings:\n”);
for(i=0;i<10;i++)
scanf("%s",p[i]);
sort§;
printf(“now is:”);
for(i=0;i<10;i++)
printf("%s\n",p[i]);
return 0;
}
void sort(char s[])
{
int i,j;
char temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(
(s+j),
(s+j+1))>0)
{
temp=
(s+j);
(s+j)=(s+j+1);
*(s+j+1)=temp;
}
}

(3)字符串逆置
void reverse(char a[]){
char t;
int i,j;
for(i=0,j=strlen(a);i<(strlen(a)/2);i++,j–)
{
t=a[i];
a[i]=a[j-1];
a[j-1]=t;
}
}

int main(){
char a[10];
printf(“input string:”);
gets(a);
reverse(a);
printf(“output string:”);
puts(a);
}

(4)回文
(4.1)
char s[81],*p1,*p2;
int n;
gets(s);
n=strlen(s);
p1=s;
p2=s+n-1;
while(p1<p2){
if(*p1!=*p2) break;
else{
p1++;
p1<p2;
}
}
if(p1<p2) printf(“no!\n”);
else printf(“yes!\n”);
(4.2)
char str[20];
int i=0,j;
printf(“input a string:”);
gets(str);
j=strlen(str)-1;
while(i<j){
if(str[i]!=str[j]) break;
i++;
j–;
}
if(i>=j) printf(“yes!”);
else printf(“no!”);

(5)删除字符串中数字
int dele(char *s){
int i,n=0;
for(i=0;s[i];i++)
if(s[i]>=‘0’&&s[i]<=‘9’) s[n++]=s[i];
s[n]=’\0’;
}

(6)删除指定字符
char str1[10],str2[40];
char ch;
int i,k=0;
printf(“input a string:”);
gets(str1);
printf(“input a ch:”);
scanf("%c",ch);
for(i=0;str1[i]!=’\0’;i++)
if(str1[i]!=ch) str2[k++]=str1[i];
str2[k]=’\0’;
puts(str2);

(7)首尾不变中间变序
int sortmid(char s[8]){
int i,j;
char t;
for(i=1;i<5;i++)
for(j=i+1;j<6;j++)
if(s[i]<s[j]){
t=s[i];
s[i]=s[j];
s[j]=t;
}
}

int main()
{
char s[8];
printf(“input a string:”);
gets(s);
sortmid(s);
puts(s);
}

18.数组应用
(1)二维数组转置
(1.1)函数法
#define N 3
int array[3][3];

void convert(int array[][3]){
int i,j,t;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++){
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}

int main(){
int i,j;
printf(“input array:”);
for(i=0;i<N;i++)
for(j=0;j<N;j++) scanf("%d",&array[i][j]);
convert(array);
printf(“convert array:”);
for(i=0;i<N;i++)
for(j=0;j<N;j++) printf("%d",array[i][j]);
}
(1.2)普通
int i,j,k,a[2][3],b[3][2];
printf(“input data:”);
//float ave=0,sum=0;
for(i=0;i<2;i++)
for(j=0;j<3;j++) scanf("%d",&a[i][j]);
for(i=1;i<2;i++)
for(j=0;j<3;j++) b[j][i]=a[i][j]; //内循环从0开始
printf(“the original :”);
for(i=1;i<2;i++)
{
for(j=0;j<3;j++) printf("%d",a[i][j]);
printf("\n");
}
printf(“the result :”);
for(i=1;i<3;i++)
{
for(j=0;j<2;j++) printf("%d",b[i][j]);
printf("\n");
}
(1.3)利用指针转置
void move(int pointer)
{
int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=
(pointer+i3+j);
(pointer+i3+j)=
(pointer+j*3+i);
(pointer+j3+i)=t;
}
}

int main(){
int a[3][3],*p,i;
printf(“input matrix:\n”);
for(i=0;i<3;i++) scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
p=&a[0][0];
move§;
printf(“Now,matrix:\n”);
for(i=0;i<3;i++) printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}

(3)逆置数组
注:在函数中改变数组元素的值有四种方式
//1. 实参与形参都为数组
//2. 实参数组 形参指针
//3. 实参与形参都为指针
//4. 实参指针 形参数组

(3.1)数组法
inverse(int x[],int n){
int temp,i,j,m=(n-1)/2;
for(i=0;i<m;i++){
j=n-1-i;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}

int main(){
int a[10];
int i;
printf(“original array:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\n");
inverse(a,10);
printf(“inverse array:”);
for(i=0;i<10;i++) printf("%d",a[i]);
}
(3.2)指针法
inverse(int *x,int n){
int temp,*i,*j,*p,m=(n-1)/2;
i=x;//指向的第一个元素
j=x+n-1;//指向的最后一个元素
p=x+m;//中间值
for(;i<=p;i++,j–){//i++往后找 j–向前找 双向交换
temp=*i;
*i=*j;
*j=temp;
}
}

int main(){
int a[10];
int i;
printf(“original array:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\n");
inverse(a,10);
printf(“inverse array:”);
for(i=0;i<10;i++) printf("%d",a[i]);
}

(4)找出最小下标并交换
int i,a[10];
int min,k=0;
printf(“input ten datas:”);
for(i=0;i<10;i++) scanf("%d",&a[i]);
printf(“original datas:”);
for(i=0;i<10;i++) printf("%d",a[i]);
min=a[0];
for(i=1;i<10;i++)
if(min>a[i]){
min=a[i];
k=i;
}
a[k]=a[0];
a[0]=min;
printf(“changes datas:”);
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\nk=%d min=%d\n",k,min);

(5)求对角线并输出周边元素
int i,j,min,sum=0,a[5][5];
for(i=0;i<5;i++)
for(j=0;j<5;j++) scanf("%d",&a[i][j]);
min=a[0][0];
for(i=0;i<5;i++)
for(j=0;j<5;j++) {
if((i0)||(i4)) sum=sum+a[i][j];
else if((j0)||(j4)) sum=sum+a[i][j];
if(ij) sum=sum+a[i][j];
else if(i+j
4) sum=sum+a[i][j];
if(min>a[i][j]) min=a[i][j];
}
printf(“sum=%d min=%d”,sum,min);

(6)求对角线和+转置
int add(int a[][]){
int i,j,sum;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(ij) sum+=b[i][j];
else if(i+j
3) sum+=b[i][j];
return sum;
}

int change(int a[][]){
int i,j,b[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++) b[j][i]=a[i][j];
for(i=0;i<4;i++){
for(j=0;j<4;j++) printf("%d",b[i][j]);
printf("\n");
}
}

int main()
{
int a[4][4],i,j,sum;
for(i=0;i<4;i++)
for(j=0;j<4;j++) scanf("%d",&a[i][j]);
sum=add(a);
change(a);
printf(“sum=%d”,sum);
}

(7)定义一个含有30个整型元素的数组,按顺序分别赋予
从2开始的偶数;然后按顺序每5个数求出一个平均值,放
在另一数组中并输出。
int a[30],b[6],sum=0,j=0,k;
for(k=0;k<30;k++) a[k]=(k+1)*2;
for(k=0;k<30;k++)
if(k%5==0){
b[j]=sum/5;
j++;
sum=0;
}
else sum=sum+a[k];
for(j=0;j<6;j++) printf("%d",b[j]);

19.(1)交换两个指针变量的值,不交换a b
int *pointer_1,*pointer_2,*p,a,b;
printf(“input integers: “);
scanf(”%d%d”,&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b){
p=pointer_1;
pointer_1=pointer_2;
pointer_2=p;
}
printf(“a=%d b=%d”,a,b);
printf("*pointer_1=%d *pointer_2=%d",*pointer_1,*pointer_2);

(2)交换整型变量a b的值,地址变量的值不变
/利用指针变量可实现main函数中的互换,单向值传递不可以实现互换/
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

int main(){
int *pointer_1,*pointer_2,*p,a,b;
printf(“input integers: “);
scanf(”%d%d”,&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b) swap(pointer_1,pointer_2);
printf(“a=%d b=%d”,a,b);
}

(3)3个整数从大到小排序
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

void exchange(int *q1,int *q2,int *q3){
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}

int main(){
int *pointer_1,*pointer_2,*pointer_3,a,b,c;
printf(“input integers: “);
scanf(”%d%d%d”,&a,&b,&c);
pointer_1=&a;
pointer_2=&b;
pointer_3=&c;
exchange(pointer_1,pointer_2,pointer_3);
printf(“a=%d b=%d c=%d”,a,b,c);
}

(4)利用指针输出大小
void swap(int *p1,int *p2){
int p;
p=*p1;
*p1=*p2;
*p2=p;
}

int main(){
int n1,n2,n3;
int *p1,*p2,*p3;
printf(“input three integer: “);
scanf(”%d%d%d”,&n1,&n2,&n3);
p1=&n1;
p2=&n2;
p3=&n3;
if(n1>n2) swap(p1,p2);
if(n1>n3) swap(p1,p3);
if(n2>n3) swap(p2,p3);
printf("%d %d %d",n1,n2,n3);
}

20.输出最长单词
void longestword(char str[]){
int start,end,i,temp,length;
int start_temp,end_temp;
start=0,end=0,length=0;
for(i=0;i<strlen(str);i++){
temp=0;
start_temp=i;
if(str[i]!=’ ‘&&str[i]!=’\0’){
temp++;
i++;
}
end_temp=i-1;
if(temp>length){
length=temp;
start=start_temp;
end=end_temp;
}
}
printf(“the longest word is:”);
for(i=start;i<=end;i++) putchar(str[i]);
}

int main(){
char string[100];
printf(“please input a string:”);
gets(string);
longestword(string);
}

21.利用指针进行移动
void move(int array[20],int n,int m){
int p,array_end;
array_end=
(array+n-1);
for(p=array+n-1;p>array;p–) p=(p-1);
*array=array_end;
m–;
if(m>0) move(array,n,m);
}

int main(){
int number[20],n,m,i;
printf(“how many numbers?: “);
scanf(”%d”,&n);
printf(“input %d numbers:\n”,n);
for(i=0;i<n;i++) scanf("%d",&number[i]);
printf(“how many place you want move?: “);
scanf(”%d”,&m);
move(number,n,m);
printf(“now they are:\n”);
for(i=0;i<n;i++) printf("%d",number[i]);
printf("\n");
}

22.寻找交换
void input(int *num){
int i;
printf(“input 10 numbers:”);
for(i=0;i<10;i++) scanf("%d",&num[i]);
}

void findvalue(int *number){
int *max,*min,*p,temp;
max=min=number;
for(p=number+1;p<number+10;p++){
if(*p>*max) max=p;
else if(*p<*min) min=p;
temp=number[0];
number[0]=*min;
*min=temp;
if(max=number) max=min;
temp=number[9];
number[9]=*max;
*max=temp;
}
}

void output(int *number){
int *p;
printf(“put :”);
for(p=number;p<number+10;p++) printf("%d",*p);
printf("\n");
}

int main(){
int number[10];
input(number);
findvalue(number);
output(number);
}

23.输出月份号
int main()
{
char month[13]={“error”,“january”,“fabruary”,“march”,“april”,“may”,“june”,“july”,“august”,“september”,“october”,“november”,“december”};
int n;
printf(“input n:”);
scanf("%d",&n);
if((n<=12)&&(n>=1)) printf(“it is %s.\n”,
(month+n));
else printf("%s",*month);
}

24.进制转换
(1)十六进制转十进制
int main()
{
char a[100];
int i,k,sum=0;
printf(“输入一个十六进制数:”);
gets(a);
for(i=strlen(a)-1,k=1;i>=0;i–) {
if(a[i]>=‘0’&&a[i]<=‘9’) sum+=(a[i]-‘0’)*k;
else if(a[i]>=‘A’&&a[i]<=‘F’) sum+=(a[i]-‘A’+10)*k;
else if(a[i]>=‘a’&&a[i]<=‘f’) sum+=(a[i]-‘a’+10)k;
k
=16;
}
printf("\n十六进制数%s转换成十进制数为:\n%d",a,sum);
}
(2)十进制转十六进制
int reverse(char b[]){
int i,n;
char t;
n=strlen(b);
for(i=0;i<n/2;i++){
t=b[i];
b[i]=b[n-1-i];
b[n-1-i]=t;
}
}

int convert(int n,char c[]){
int i=0,k,m;
m=n;
while(m>0){
k=m%16;
m=m/16;
if(k<10) c[i++]=k+‘0’;
else c[i++]=k-10+‘A’;
}
c[i]=’\0’;
reverse©;
}

int main()
{
int n;
char ch[10];
printf(“input a number:”);
scanf("%d",&n);
convert(n,ch);
printf("%s\n",ch);
}

(3)输入两个不超过整型定义的非负 10 进制整数 A 和 B(<=231-1) ,输出 A+B
的 m (1 < m <10) 进制数。
int a,b;
int i,m;
while(scanf("%d",&m)!=EOF){
if(m==0) break;
scanf("%d%d",&a,&b);
a = a + b; //计算a+b
int ans[50] , size = 0; //ans用来保存依次转换得到的各个数位数字的值, size表其个数
do { //依次求的各个数位上的数字值
ans[size++] = a % m; //对m求模
a/=m; //除以m
} while(a!=0); //当a不为0时重复该过程
for(i=size-1;i>=0;i–) printf("%d",ans[i]);
}

25.递归
(1)递归将整数转为字符串
void convert(int n){
int i;
if((i=n/10)!=0) convert(i);
putchar(n%10+‘0’);
putchar(32);
}

int main()
{
int number;
printf(“please input a number:”);
scanf("%d",&number);
printf("output: ");
if(number<0){
putchar(’-’);
putchar(’ '); /* 先输出一个‘-’号和空格 */
number=-number;
}
convert(number);
}

(2)递归五个字符逆序
int verse(int n){
char text;
if(n<=1){
text=getchar();
printf("\n\0:");
putchar(text);
}
else{
text=getchar();
verse(n-1);
putchar(text);
}
}

int main()
{
int i=5;
printf("\40");
verse(i);
printf("\n");
}

(3)递归逆序
int fchange(char *s,char *t){
char k;
k=*s;
*s=*t;
*t=k;
s++;
t–;
if(*s) fchange(s,t);
}

int main()
{
char str[10]=“abcdefg”,*p;
p=str+strlen(str)/2+1;
fchange(p,p-2);
printf("%s\n",str);
}

26.结构体
(1)
int main()
{

struct Student{
int num;
char name[20];
float score;
}stu1,stu2;
scanf("%d%s%f",&stu1.num,stu1.name,&stu1.score);
scanf("%d%s%f",&stu2.num,stu2.name,&stu2.score);
printf(“the higher score is: \n”);
if(stu1.score>stu2.score) printf("%d %s %f\n",stu1.num,stu1.name,stu1.score);
if(stu1.score<stu2.score) printf("%d %s %f\n",stu2.num,stu2.name,stu2.score);

}

(2)统计投票
struct Person{
char name[20];
int count;
}leader[3]={“li”,0,“ux”,0,“sad”,0}; //定义的顺序必须一致
int main()
{
int i,j;
char leader_name[20];
for(i=1;i<=10;i++){
scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;//输入的名字和候选人相等就执行
}
printf("\n result is:\n");
for(i=0;i<3;i++) printf("%s %d\n",leader[i].name,leader[i].count);
}

(3)利用选择排序进行输出排序
#include<stdio.h>
#include<math.h>
#include<string.h>

#define N 10
#define M 5

struct Student{
int num;
char name[20];
float score;;
};
int main()
{
struct Student stu[5]={{12,“yx”,64},{5,“y”,74},{2,“yxx”,44},{1,“yc”,4},{182,“x”,24}};
struct Student temp;
int n=5;
int i,j,k;
printf(“the order is:”);
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(stu[j].score>stu[k].score) k=j;
temp=stu[k];
stu[k]=stu[i];
stu[i]=temp;
}
for(i=0;i<n;i++) printf("%d %s %f\n",stu[i].num,stu[i].name,stu[i].score);
}

(4)结构体函数
(4.1)
#define N 3
#define M 5

struct Student{
int num;
char name[20];
float score[3];
float ave;
};

void input(struct Student stu[]){
int i;
printf(“input info: “);
for(i=0;i<N;i++){
scanf(”%d %s %f %f %f\n:”,&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
}
}

struct Student max(struct Student stu[]){ //结构体函数
int i,m;
for(i=0;i<N;i++)
if(stu[i].ave>stu[m].ave) m=i;
return stu[m];
}

void print(struct Student s){
printf(“max grade: “);
printf(”%d %s %f %f %f\n:”,s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave);
}

int main()
{
struct Student stu[N];
struct Student *p;
p=stu;
input§;
print(max§);
}
(4.2)
struct stu{
int num;
char name[20];
float score;
};

struct stu findmax(struct stu s[],int n){
int i,k=0;
float max=s[0].score;
for(i=1;i<n;i++)
if(s[i].score>max){
max=s[i].score;
k=i;
}
return s[k];
}

int main()
{
struct stu s[5];
struct stu s;
s=findmax(s,5);
}

(5)链表
(5.1)静态
(5.2)动态
#include<stdio.h>
#include<math.h>
#include<string.h>

#define N 3
#define M 5

struct Student{
int num;
float score;
struct Student *next;
};

int n;
struct Student *creat(void){
struct Student *head;
struct Student *p1,*p2;
n=0;
p1=p2=(struct Student *)malloc(sizeof(struct Student));
scanf("%d%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0){
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct Student *)malloc(sizeof(struct Student));
scanf("%d%f",&p1->num,&p1->score);
}
p2->next=NULL;
return head;
}

void print(struct Student head){
struct Student *p;
printf("%d records are:\n",n);
p=head;
if(head!=NULL)
do{
printf("%d %f",p->num,p->score);
p=p->next;
}while(p!=NULL);
}

int main()
{
struct Student *pt;
pt=creat();
print(pt);
}
(5.3)带头节点建立单链表
struct list{
int data;
struct list *next;
};

struct list *creat(){
struct list *p,*q,*ph;
int a;
ph=(struct list *)malloc(sizeof(struct list));
p=q=ph;
printf(“input an num:”);
scanf("%d",&a);
while(a!=-1){
p=(struct list *)malloc(sizeof(struct list));
p->data=a;
q->next=p;
q=p;
scanf("%d",&a);
}
p->next=’\0’;
return ph;
}

int main()
{
struct list *head;
head=creat();
}
(5.4)插入

(6)计算该日在本年中第几天
struct Day{
int year;
int month;
int day;
}d;

int date(struct Day d){
int smonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义的十二个月的天数
int i,sum=0;
for(i=0;i<d.month;i++) sum+=smonth[i];
sum+=d.day;
if(d.month>2&&((d.year%40&&d.year%100!=0)||d.year%4000)) sum++;
return sum;
}

int main()
{
int n;
printf(“年 月 日\n”);
scanf("%d%d%d",&d.year,&d.month,&d.day);
n=date(d);
printf("%d %d %d %d",d.year,d.month,d.day,n);
}

(7)输入输出学生成绩
struct Student{
int num;
char name[20];
int score[3];
}stu[5];

int print(struct Student s[]){
int i,j;
for(i=0;i<5;i++){
printf("%d %s\n",s[i].num,s[i].name);
for(j=0;j<3;j++) printf("%d\n",s[i].score[j]);
printf("\n");
}
}

int main()
{
printf(“num name score \n”);
int i,j;
for(i=0;i<5;i++){
printf(“no. %d\n”,i+1);
scanf("%d",&stu[i].num);
printf(“name. %d\n”,i+1);
scanf("%d",&stu[i].name);
printf(“score. %d\n”,i+1);
for(j=0;j<3;j++) scanf("%d",&stu[i].score[j]);
}
print(stu);
}

(8)平均分练习+统计高分
struct Student{
int num;
char name[20];
int score[3];
}stu[5];

int input(struct Student s[]){
int i,j;
for(i=0;i<5;i++){
printf(“no is %d\n”,i+1);
scanf("%d",&s[i].num);
printf(“name is %d\n”,i+1);
scanf("%d",&s[i].name);
printf(“three score is %d\n”,i+1);
for(j=0;j<3;j++) scanf("%d",&s[i].score[j]);
}
}

int print(struct Student s[]){
int i,j;
float sum[3]={0};
printf(“three course ave:\n”);
for(j=0;i<3;j++){
for(i=0;i<5;i++) sum[j]+=s[i].score[j];
printf("%f\n",sum[j]/4);
}
float max=s[0].score[0];
int m,n;
for(i=0;i<5;i++){
for(j=0;j<3;j++)
if(max<s[i].score[j]){
max=s[i].score[j];
m=i;
n=j;
}
}
float aver=0;
for(j=0;j<3;j++) aver+=s[m].score[j];
printf(“最高分为:%2.2f\n”,max);
printf(“最高分的学生的数据为:\n”);
printf("%4d %4s %4.2d %4.2d %4.2d %4.2f\n",s[m].num,s[m].name,s[m].score[0],s[m].score[1],s[m].score[2],aver/3);
}

int main()
{
printf(“num name score \n”);
input(stu);
print(stu);
}

27文件
(1)输入输出字符
(1.1)输入
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

#define N 3
#define M 5

int main()
{
FILE *fp;
char ch;
if((fp=fopen(“file1.txt”,“w”))==NULL){
printf(“cant open file\n”);
exit(0);
}
ch=getchar();
while(ch!=’#’){
fputc(ch,fp);
ch=getchar();
}
fclose(fp);
}
(1.2)输出
FILE *fp;
char ch;
if((fp=fopen(“file1.txt”,“r”))==NULL){
printf(“cant open file\n”);
exit(0);
}
ch=fgetc(fp);//先执行一次读操作,判断文件是否结束
while(ch!=EOF){
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);

(2)字符串读写
(2.1)写入字符
int main()
{
FILE *fp;
char str[20];
if((fp=fopen(“file1.txt”,“w”))==NULL){
printf(“cant open file\n”);
exit(0);
}
printf(“input one string: “);
scanf(”%s”,str);
fputs(str,fp);
fputc(’\n’,fp);//将换行符存入文件
printf(“input two string: “);
scanf(”%s”,str);
fputs(str,fp);
fputc(’\n’,fp);
fclose(fp);
}
(2.2)读出字符
int main()
{
FILE *fp;
char str1[20],str2[20];
if((fp=fopen(“file1.txt”,“r”))==NULL){
printf(“cant open file\n”);
exit(0);
}
fgets(str1,21,fp);
fgets(str2,21,fp);
printf("%s",str1);
printf("%s",str2);
fclose(fp);
}
(2.3)读回字符串
int main()
{
FILE *fp;
char str[3][10];
int i=0;
if((fp=fopen(“file1.dat”,“w”)==NULL)){
printf(“cant open file \n”);
exit(0);
}
while(fgets(str[i],10,fp)!=NULL){
printf("%s",str[i]);
i++;
}
fclose(fp);
}

(3)数据块读写
(3.1)读入读出
struct stu{
int num;
char name[10];
char addr[15];
}s1[2],s2[2];

int main()
{
FILE *fp;
int i;
if((fp=fopen(“file3.txt”,“wb+”)==NULL)){
printf(“cant open file \n”);
exit(0);
}
printf(“input two stu’s info:”);
for(i=0;i<2;i++) scanf("%d%s%s",&s1[i].num,s1[i].name,s1[i].addr);
fwrite(s1,sizeof(struct stu),2,fp);//读入
rewind(fp);//使fp重新指向文件首
fread(s2,sizeof(struct stu),2,fp);//读出
for(i=0;i<2;i++) printf("%d %s %s、",s2[i].num,s2[i].name,s2[i].addr);
fclose(fp);
}
(3.2)函数读入
struct Student{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];

void save(){
FILE *fp;
int i;
if((fp=fopen(“stu.dat”,“w”)==NULL)){
printf(“cant open file \n”);
exit(0);
}
for(i=0;i<SIZE;i++){
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1) printf(“file error!”);
fclose(fp);
}
}

int main()
{
int i;
printf(“input data:\n”);
for(i=0;i<SIZE;i++) scanf("%s%d%d%s",&stu[i].name,&stu[i].num,&stu[i].age,&stu[i].addr);
save();
}
(3.3)输入1 3 5 7学生的数据并显示
struct Student{
char name[10];
int num;
int age;
char addr[15];
}stu[10];

int main()
{
int i;
FILE fp;
if((fp=fopen(“stu.dat”,“rb”)==NULL)){
printf(“cant open file \n”);
exit(0);
}
for(i=0;i<10;i+=2){
fseek(fp,i
sizeof(struct Student),0);
fread(&stu[i],sizeof(struct Student),1,fp);
printf("%s %d %d %s\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr);
}
fclose(fp);
}
(3.4)建立写入文本文件内容
int main()
{
FILE *fp;
char msg[]=“this is a text”;
char buf[20];
if((fp=fopen(“abc”,“w+”))==NULL){
printf(“cant open the file:”);
exit(1);
}
fwrite(msg,strlen(msg)+1,1,fp);
fseek(fp,SEEK_SET,0);
fread(buf,strlen(msg)+1,1,fp);
printf("%s\n",buf);
fclose(fp);
}

(4)复制
(4.1)复制到另一磁盘
int main()
{
FILE *in,*out;//*fp1,*fp2;
char ch,infile[10],outfile[10];
printf(“input file1’s name: “);
scanf(”%s”,infile);
printf(“input file2’s name: “);
scanf(”%s”,outfile);
if((in=fopen(infile,“r”))==NULL){
printf(“cant open file\n”);
exit(0);
}
if((out=fopen(outfile,“w”))==NULL){
printf(“cant open file\n”);
exit(0);
}
ch=fgetc(in);
while(!feof(in)){
fputc(ch,out);
//putchar(ch);
ch=fgetc(in);
}
fclose(in);
fclose(out);
}
(4.2)先输出 后复制到另一文件
int main()
{
char ch;
FILE *fp1,fp2;
fp1=fopen(“file1.dat”,“r”);
fp2=fopen(“file2.dat”,“w”);
ch=getc(fp1);
while(!feof(fp1)){
putchar(ch);
ch=getc(fp1);
}
putchar(10);
rewind(fp1);
ch=getc(fp1);
while(!feof(fp1)){
fputc(ch,fp2);
ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
}

(5)输入n个字符排序输出
int main()
{
FILE *fp;
char str[3][10],temp[10];
int i,j,k,n=3;
printf(“input strings:\n “);
for(i=0;i<n;i++) gets(str[i]);
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0) k=j;
if(k!=i){strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);}
}
if((fp=fopen(“file1.dat”,“w”)==NULL)){
printf(“cant open file \n”);
exit(0);
}
printf(“now order:\n”);
for(i=0;i<n;i++){
fputs(str[i],fp);
fputs(”\n”,fp);
printf("%s\n",str[i]);
}
}

(6)大小写转换
(6.1)大小写转换+输出到指定文件
int main()
{
FILE *fp;
char str[100];
int i=0;
if((fp=fopen(“a1”,“w”))NULL) {
printf(“cant open the file!\n”);
exit(0);
}
printf(“input a string”);
gets(str);
while(str[i]!=’!’){
if(str[i]>=‘a’&&str[i]<=‘z’) str[i]=str[i]-32;
fputc(str[i],fp);
i++;
}
fclose(fp);
fp=fopen(“a1”,“r”);
fgets(str,strlen(str)+1,fp);
printf("%s\n",str);
fclose(fp);
}
(6.2)存入数据转换输出大小写
int main()
{
int i,flag;
char str[80],c;
FILE *fp;
fp=fopen(“text”,“w”);
flag=1;
while(flag
0){
printf(“input string:\n”);
gets(str);
fprintf(fp,"%s",str);
printf(“continue “);
c=getchar();
if((c==‘N’)||(c==‘n’)) flag=0;
getchar();
}
fclose(fp);
fp=fopen(“text”,“r”);
while(fscanf(fp,”%s”,str)!=EOF){
for(i=0;str[i]!=’\0’;i++)
if((str[i]>=‘a’)&&(str[i]<=‘z’)) str[i]-=32;
puts(str);
}
fclose(fp);
}

(9)学生结构体
(9.1)输出平均分文件
struct Student{
char num[5];
char name[10];
int score[3];
float ave;
}stu[5];

int main()
{
int i,j,sum;
FILE *fp;
for(i=0;i<5;i++){
printf("\ninput score of stu %d:\n",i+1);
printf(“no.:”);
scanf("%s",&stu[i].num);
printf(“name.:”);
scanf("%s",&stu[i].name);
sum=0;
for(j=0;j<3;j++){
printf(“score %d”,j+1);
scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].ave=sum/3;
}
fp=fopen(“stud”,“w”);
for(i=0;i<5;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1) printf(“fille error\n”);
fclose(fp);
fp=fopen(“stud”,“w”);
for(i=0;i<5;i++) {
fread(&stu[i],sizeof(struct Student),1,fp);
printf("%s %s %d %d %d %f",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
}
(9.2)输出平均分排序
struct Student{
char num[5];
char name[10];
int score[3];
float ave;
}stu[M],temp;

int main()
{
int i,j,n;
FILE *fp;
//读文件
if((fp=fopen(“stud”,“r”))==NULL) {
printf(“cant open the file!\n”);
exit(0);
}
printf(“file stud:”);
for(i=0;fread(&stu[i],sizeof(struct Student),1,fp);i++){
printf("%s %s",stu[i].num,stu[i].name);
for(j=0;j<3;j++) printf("%d",stu[i].score[j]);
printf("%f",stu[i].ave);
}
printf("\n");
fclose(fp);
n=i;
//排序
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(stu[i].ave<stu[j].ave){
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
//输出
printf("\n now:");
fp=fopen(“stu_sort”,“w”);
for(i=0;i<n;i++){
fwrite(&stu[i],sizeof(struct Student),1,fp);
printf("%s %s",stu[i].num,stu[i].name);
for(j=0;j<3;j++) printf("%d",stu[i].score[j]);
printf("%f",stu[i].ave);
}
printf("\n");
fclose(fp);
}
(9.3)对排好的进行插入
struct Student{
char num[5];
char name[10];
int score[3];
float ave;
}stu[10],s;

int main()
{
int i,j,t,n;
FILE *fp,*fp1;
printf("\n no.😊;
scanf("%s",s.num);
printf("\n name.😊;
scanf("%s",s.name);
printf("\n sco1 sco2 sco3:");
scanf("%d%d%d",&s.score[0],&s.score[1],&s.score[2]);
s.ave=(s.score[0]+s.score[1]+s.score[2])/3;
//读文件
if((fp=fopen(“stu_sort”,“r”))==NULL) {
printf(“cant open the file!\n”);
exit(0);
}
printf(“original data:”);
for(i=0;fread(&stu[i],sizeof(struct Student),1,fp);i++){
printf("%s %s",stu[i].num,stu[i].name);
for(j=0;j<3;j++) printf("%d",stu[i].score[j]);
printf("%f",stu[i].ave);
}
n=i;
for(t=0;stu[t].ave>s.ave&&t<n;t++)
//写数据
printf("\n now \n") ;
fp1=fopen(“sort1.dat”,“w”);
for(i=0;i<t;i++){
fwrite(&stu[i],sizeof(struct Student),1,fp1);
printf("%s %s",stu[i].num,stu[i].name);
for(j=0;j<3;j++) printf("%d",stu[i].score[j]);
printf("%f",stu[i].ave);
}
fwrite(&s,sizeof(struct Student),1,fp1);
printf("%s %s %d %d %d %f",s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave);
for(i=t;i<n;i++){
fwrite(&stu[i],sizeof(struct Student),1,fp1);
printf("%s %s",stu[i].num,stu[i].name);
for(j=0;j<3;j++) printf("%d",stu[i].score[j]);
printf("%f",stu[i].ave);
}
printf("\n");
fclose(fp);
fclose(fp1);
}

28.常用算法
(1)二分法判断零点
int main()
{
float a=-10,b=10,c,exp=1e-5;
while((b-a)>exp){
c=(a+b)/2;
if(f©==0) break;
else if(f(a)*f©<0) b=c;
else a=c;
}
printf(“root=%f\n”,c);
}

(2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值