int *a[10]是数组指针,int(*a)[10]是指针数组,int*a是指针变量,int a[10]是数组。
65.3请编写一个函数int fun(int A[ ],int m, int B[ ], int n, int C[ ]),使对于从小到大有序数组A和B,返回A和B的交集C,假定A与B长度均不超过100,m是A数组元素个数,n是B数组元素个数,但可能存在重复元素,因此最终生成交集C要注意去重复,并且保持从小到大有序。通过函数值返回交集C中元素个数。
例如:当A数组长度为9,元素值为:1,2,2,3,3,3,5,6,7,
B数组长度为6,元素值为:2,2,3,3,6,8时,
C数组长度为3,元素值为:2,3,6。
#include<stdio.h>
#define N 100
int fun(int A[ ], int m, int B[ ], int n, int C[ ])
{
int i,j,k=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(A[i]==B[j]&&A[i]!=C[k-1])
{
C[k]=A[i];
k++;
break;
}
}
}
return k;
}
main( )
{ int a[N]={1,2,2,3,3,3,5,6,7}, b[N]={2,2,3,3,6,8}, c[N];
int k,i;
k = fun(a,9,b,6,c);
if(k > 0)
{
printf("A和B数组交集元素个数:%d\n", k);
for (i=0; i<k;i++)
printf("%d ", c[i]);
}
else
printf("A和B数组无交集!\n");
65.1在整数数组中,如果一个数的出现次数最少,我们就称这个数为"孤独数"。给定一个整数数组,输出其中最小的孤独数。
在给定程序BLANK1.C中,函数fun的功能是求出长度为n的数组a中的孤独数并返回(n最大不会超过100)。
例如:当n为6,a数组为5,3,3,3,2,2时,函数返回值应为5。
#include <stdio.h>
#define N 100
int fun(int a[ ], int n)
{ int b[N], c[N]={0};
int cc = 0;
int i, j, min;
for(i=0; i<n; i++)
/******************found*******************/
{ for(j=0; j<cc; j++)
if (a[i] == b[j])
break;
/******************found*******************/
if (j==cc)
{ b[cc] = a[i];
c[cc] = 1;
cc++;
}
else
c[j]++;
}
min = 0;
for(i=1; i<cc; i++)
if (c[i] < c[min])
min = i;
/******************found*******************/
return b[min] ;
}
main( )
{ int a[N] ={5, 3, 3, 3, 2, 2};
int min_lone;
min_lone = fun(a, 6);
printf("min_lone=%d\n", min_lone);
}
65.2函数fun的功能是从字符串s(长度不超过100)中找出不含有重复字符的最长子串放入t中。若有多个相同长度的不含有重复字符的最长子串,则从左至右取第一个作为最后结果放入t中。
例如:s为“abcabcbb”时,t应为“abc”。
例如:s为“abbccabbccbb”时,t应为“cab”。
例如:s为“bbbbb”时,t应为“b”。
例如:s为“pwwkew”时,t应为“wke”。
#include <stdio.h>
#include <string.h>
#define N 100
void fun(char s[], char t[])
{
int max_len, len, max_pos, pos, i,j,k;
max_len = 1;
max_pos = 0;
for (i=0; i<strlen(s); i++)
{
pos = i;
/**********************found***********************/
len = 1;
for (j=pos+1; j<strlen(s); j++)
{
for(k=pos; k<j; k++)
if (s[j]==s[k])
break;
/**********************found***********************/
if (k==j)
len++;
else
break;
}
/**********************found***********************/
if (len>max_len)
{
max_len = len;
max_pos = pos;
}
}
for (i=max_pos; i<max_pos+max_len; i++)
t[i-max_pos] = s[i];
t[max_len]='\0';
}
main( )
{
char *str1="abcabcbb", *str2="abbccabbccbb", *str3="bbbbb", *str4="pwwkew",res[N];
fun(str1,res);
printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str1, res);
fun(str2,res);
printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str2, res);
fun(str3,res);
printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str3, res);
fun(str4,res);
printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str4, res);
}
64.1函数fun的功能是删除形参s所指的字符串中末尾的所有空格
#include<stdio.h>
#include <string.h>
void fun(char *s)
{
int n;
char *p;
n=strlen(s);
if(n>0)
{
/**********found**********/
p=s+n-1;
while(*p==' ')
/**********found**********/
p--;
/**********found**********/
*(p+1)= '\0';
}
}
int main()
{
char s[100];
gets(s);
fun(s);
printf("%s#\n",s);
return 0;
}
64.2函数fun的功能是将N x N的二维数组,按下面样例所示规律进行赋值,例如:当N=4时,所得二维数组的内容应为:
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
当N=5时,所得二维数组的内容应为:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
#include <stdio.h>
#define N 8
void fun(int a[N][N])
{
int i,j,k=1,t;
/**********************found***********************/
t=0;
/**********************found***********************/
while(t<=N/2)
{
for(i=t;i<N-t;i++)
for(j=t;j<N-t;j++)
/**********************found***********************/
a[i][j]=k;
k++;
t++;
}
}
main()
{
int i,j;
int a[N][N]={0};
fun(a);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
64.3函数fun,其功能是将形参s所指的字符串中的数字字符转换为一个整数并返回。形参s所指的字符串中的第一个字符可以为“+”或“-”,字符串中可以包含字母或数字,当碰到第一个字母时,转换过程结束。例:当s所指的字符串为“-123”时,返回值为-123;当s所指的字符串为“123”时,返回值为 123。
#include <stdio.h>
#include <string.h>
int fun(char *s)
{
int i=0,flag=1,n=0;
if(s[0]=='-')
{
flag=-1;
i=1;
}
if(s[0]=='+')
{
i=1;
}
for(;s[i]!='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')
{
n=n*10+(s[i]-'0');
}
else
break;
}
return flag*n;
}
main()
{
char s[100];
int n;
printf("Enter a string:\n");
gets(s);
n=fun(s);
printf("%d\n",n);
}
50.3 请编写函数fun,其功能是:验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x < *y。主程序中将打印出分解结果。例如:111=3*37, 当函数fun的参数n为111时,可以分解为2个素数(3和37) 的乘积函数返回值为1。另外,prime函 数验证参数m是否为素数,是则返回1,否则返回0。
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
int k1;
k=2;
do
{
k1=n/k;
if(k*k1==n)
{
if(prime(k)&&prime(k1)&&k<k1)
{
flag=1;
*x=k;
*y=k1;
break;
}
}
k++;
}while(k<k1);
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}
法二:
int fun(int n,int *x,int *y)
{
int k,flag=0, limit = (int)sqrt((double)n);
for (k = 2; k <= limit; k++)
{
if (n % k == 0)
{
int k1 = n / k;
if (prime(k) && prime(k1) && k < k1)
{
*x = k;
*y = k1;
flag=1;
return flag;
}
}
}
return flag;
}
50.2函数void list (MYDATA *h)的功能是:列出带头结点单链表中所有没有删除标记的数据。调用这个函数时,传给形参h的是指向单链表头结点的指针。例如:当10个结点的数据为1,2,3,4,5,6, 7,8,9, 10时,输出将是:3 4 6 7 8 9 10。其中,各个数据所对应的删除标记是由随机数产生的。
#include<stdio.h>
#include<stdlib.h>
typedef struct dat
{
char deleted; //是否删除:0-未删除,1-删除
int data;
struct dat* next;
} MYDATA;
void list(MYDATA *h)
{
/******found******/
MYDATA *p;
p=h->next;
while(p!=NULL)
{
/******found******/
if(p->deleted==0)
{
printf("%d ",p->data);
}
/******found******/
p=p->next;
}
}
void creat(MYDATA *h,int *d,int n)
{
MYDATA *p, *q;
int i=0,del;
q=h;
while(n>0)
{
p=( MYDATA *)malloc(sizeof(MYDATA));
del=rand()%2;
p->data=d[i];
p->deleted=del;
p->next=q->next;
q->next=p;
q=p;
n--;i++;
}
}
void main()
{
MYDATA *head;
int n=10,dd[]={1,2,3,4,5,6,7,8,9,10};
head=(MYDATA *)malloc(sizeof(MYDATA));
head->next=NULL;
creat(head,dd,n);
list(head);
}
49.3
请编写函数void fun(int *dp, int n, int upordown), 其功能是,找出dp所指数组中的最小或最大值,并与其第1个元素交换。形参n为元素的个数,形参upordown为查找标志:值为0时找最小值;值为1时找最大值。
#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);
void fun (int *dp,int n,int upordown)
{
int i,mom=0,t;
if(upordown==0)
{
for(i=1;i<n;i++)
{
if(dp[i]<dp[mom])
mom=i;
}
}
else
{
for(i=1;i<n;i++)
{
if(dp[i]>dp[mom])
mom=i;
}
}
t=dp[0];
dp[0]=dp[mom];
dp[mom]=t;
}
void display(int pd[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",pd[i]);
printf("\n");
}
void main()
{
int data[N],i,n=N;
FILE *out ;
out = fopen("out.dat","w") ;
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,0);
display(data,n);
NONO(out, data, n);
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,1);
display(data,n);
NONO(out, data, n);
fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
int i;
for(i=0;i<n;i++)
fprintf(fp, "%4d", pd[i]);
fprintf(fp, "\n");
}
请编写函数fun,其功能是从一行单词字符串数组a中分别提取每个单词尾部的字母组成个新的字符串数组b,并通过实参返回。单词分隔是以一个空格或几个空格进行分隔。
例如:This is a C program 输出:ssaCm
#include <stdio.h>
#include <string.h>
#include <conio.h>
void fun(char a[], char b[])
{
int i,j=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]!=' '&&a[i+1]==' ')
{
b[j++]=a[i];
}
}
b[j]=a[i-1];//或者写成b[j]=a[strlen(a)-1];
b[++j]='\0';
}
void main()
{
char a[]="This is a C program", b[100];
fun(a,b);
printf("%s\n",b);
}
程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。
#include <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
void fun(struct student a[], int n)
{
/**********found**********/
struct student t;
int i, j;
/**********found**********/
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
/**********found**********/
if (strcmp(a[i].name,a[j].name) > 0)
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
main()
{ struct student s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78},
{10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}};
int i, j;
printf("\n\nThe original data :\n\n");
for (j=0; j<4; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name);
for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]);
printf("\n");
}
fun(s, 4);
printf("\n\nThe data after sorting :\n\n");
for (j=0; j<4; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name);
for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]);
printf("\n");
}
}
给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为: 2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node {
int data;
struct node *next;
} NODE;
void fun(NODE *h)
{ NODE *p, *q, *r;
/**********found**********/
p = h->next;
/**********found**********/
if (p==NULL) return;
q = p->next;
p->next = NULL;
while (q)
{ r = q->next; q->next = p;
/**********found**********/
p = q; q = r;
}
h->next = p;
}
NODE *creatlist(int a[])
{ NODE *h,*p,*q; int i;
h = (NODE *)malloc(sizeof(NODE));
h->next = NULL;
for(i=0; i<N; i++)
{ q=(NODE *)malloc(sizeof(NODE));
q->data=a[i];
q->next = NULL;
if (h->next == NULL) h->next = p = q;
else { p->next = q; p = q; }
}
return h;
}
void outlist(NODE *h)
{ NODE *p;
p = h->next;
if (p==NULL) printf("The list is NULL!\n");
else
{ printf("\nHead ");
do
{ printf("->%d", p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
main()
{ NODE *head;
int a[N]={2,4,6,8,10};
head=creatlist(a);
printf("\nThe original list:\n");
outlist(head);
fun(head);
printf("\nThe list after inverting :\n");
outlist(head);
getchar();
}
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:A*BC*DEF*G。
#include <stdio.h>
void fun( char *a, int n,int h,int e )
{
int i,k=0;
char *q,*p,b[81];
p=a+h;
q=a+n-1-e;
while(p<=q)
{
b[i++]=*p;
p++;
}
b[i]='\0';
while(b[k]!='\0')
{
a[k]=b[k];
k++;
}
a[k]='\0';
}
main()
{ char s[81],*t,*f; int m=0, tn=0, fn=0;
printf("Enter a string:\n");gets(s);
t=f=s;
while(*t){t++;m++;}
t--;
while(*t=='*'){t--;tn++;}
while(*f=='*'){f++;fn++;}
fun( s , m,fn,tn );
printf("The string after deleted:\n");puts(s);
}
给定程序modi1.c的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里的"单词"是指由空格隔开的字符串)。
例如,若输入: I am a student to take the examination.,则应输出:工 Am A Student To Take The Examination.。
#include <ctype.h>
#include <string.h>
#include <stdio.h>
void upfst ( char *p )
{ int k=0;
for ( ; *p; p++ )
if ( k )
{ if ( *p == ' ' ) k = 0; }
else if ( *p != ' ' )
{ k = 1; *p = toupper( *p ); }
}
main( )
{ char chrstr[81];
printf( "\nPlease enter an English text line: " ); gets( chrstr );
printf( "\n\nBefore changing:\n %s", chrstr );
upfst( chrstr );
printf( "\nAfter changing:\n %s\n", chrstr );
}
请编写函数fun,函数的功能是:判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。例如,字符串LEVEL是回文,而字符串123312就不是回文。
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *str)
{
char *p=str;
while(*p)
{
p++;
}
p--;
while(str<=p)
{
if(*p==*str)
{
str++;
p--;
}
else
{
return 0;
}
}
return 1;
}
main()
{ char s[N] ;
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
}
法二:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *str)
{
int count=strlen(str),i;/*利用strlen()函数计算字符串的长度*/
for(i=0;i<=count/2;i++)
{
if(str[i]!=str[count-i-1])//判断对称点两侧字符是否存在不同
{
return 0;
break;
}
}
return 1;
}
main()
{ char s[N] ;
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
}
函数fun的功能是:在有n个元素的结构体数组std中,查找有一门或两门不及格科目的学生,找到后输出学生的学号;函数的返回值是有不及格科目的学生人数。例如,主函数中给出了4名学生的数据,则程序运行的结果为;
学号:N1002 学号:N1006
共有2位学生有不及格科目
#include <stdio.h>
typedef struct
{ char num[8]; /* 学号 */
double score[2]; /* 两门课成绩 */
} STU ;
int fun(STU std[ ], int n)
{ int i, k=0;
for(i=0; i<n; i++)
if( (std[i].score[0]<60) || (std[i].score[1]<60) )
{ k++; printf("学号:%s ",std[i].num); }
return k ;
}
main()
{ STU std[4]={ "N1001", 76.5,82.0 ,"N1002", 53.5,73.0,
"N1005", 80.5,66.0,"N1006", 81.0,56.0 };
printf( "\n共有%d位学生有不及格科目\n" , fun(std,4) );
}
根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回。
例如:114=5+109=7+107=11+103=13+101=17+97=31+83=41+73=43+71=47+67=53+61
114恰好可以分解为10组素数之和,因此114是我们要找的偶数。
而116=3+113=7+109=13+103=19+97=37+79=43+73
120=7+113=11+109=13+107=17+103=19+101=23+97=31+89=37+83=41+79=47+73=53+67=59+61
116可以分解为6组素数之和,120可以分解为12组素数之和,因此116和120都不是我们要找的偶数。函数prime用来判断一个数n是否为素数,是则返回1,否则返回0。
#include<stdio.h>
#include<math.h>
int prime(int n)
{ int k,flag=1;
for (k=2; k<=(int)sqrt((double)n); k++)
if (n%k == 0)
flag=0;
return flag;
}
int fun(int m, int a[])
{
int k, s, count, i=0;
for(k=6; k<=m; k+=2)
{ count = 0;
/* 请在此处填写代码 */
for(s=2;s<=k/2;s++)
{
if(prime(s)&&prime(k-s))
{
count++;
}
}
if (count == 10) {
printf("%d\n", k);
a[i++] = k;
}
}
return i;
}
main( )
{ int count, a[100];
count = fun(999, a);
}
主函数中,将a、b、c三个结点链成一个单向链表,并给各结点的数据域赋值,函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。
#include <stdio.h>
typedef struct list
{ int data;
struct list *next;
} LIST;
int fun(LIST *h)
{ LIST *p;
/**********found**********/
int t=0;
p=h;
/**********found**********/
while( p )
{
/**********found**********/
t=t+p->data;//或者写成t=t+(*p).data;
p=(*p).next;
}
return t;
}
main()
{ LIST a, b, c, *h;
a.data=34; b.data=51; c.data=87; c.next='\0';
h=&a; a.next=&b; b.next=&c;
printf("总和 = %d\n",fun( h ));
}
函数char *fun(char *s1, char *s2,char *r) 的功能是:将两个长
度相等的纯数字字符串当作两个加数,求其代表的数值之和并以字符串的形式存入r所指内存且返回。如: s1是”723”,s2是”567", 则返回的字符串为”1290”。要考虑进位。
#include <stdio.h>
#include <string.h>
char *fun(char * s1,char *s2,char *r)
{
int len,cy=0,md;
char *p,*q,*t;
len=strlen(s1);
p=s1+len-1;
q=s2+len-1;
t=r+len;
/**********************found***********************/
*(t+1)='\0';
while(p>=s1)
{
/**********************found***********************/
md=*p-'0'+*q-'0'+cy;
if(md>=10) cy=1;
else cy=0;
*t=md%10+'0';
p--;
q--;
t--;
}
/**********************found***********************/
if(cy==1)
*t='1';
else
{
while(*r++=*++t);
}
return r;
}
void main()
{
char s1[100],s2[100],s3[101];
strcpy(s1,"65743");
strcpy(s2,"85339");
fun(s1,s2,s3);
printf("%s+%s=%s\n",s1,s2,s3);
}
请编写函数fun,其功能是:找出用1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数,然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中,符合条件的个数由函数值返回。
#include <stdio.h>
#define max 100
int fun(int xxx[])
{
int i ,j,k,n=0;
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
if(i!=j)
{
for(k=1;k<=4;k++)
{
if(i!=k&&j!=k)
{
xxx[n++]=i*100+j*10+k;
}
}
}
}
}
return n;
}
int main()
{
int xx[max],cnt;cnt = fun(xx);
printf("符合条件的个数=%d\n", cnt);
return 0;
}
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:函数返回指定学号的学生数据,指定的学号在主函数中输入。若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。(用于字符串比较的函数是strcmp)。
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
STREC fun( STREC *a, char *b )
{
int i;
STREC t = {'\0', -1};
for(i=0;i<N;i++)
{
if(strcmp(a[i].num,b)==0)
{
strcpy(t.num,a[i].num);
t.s=a[i].s;
}
}
return t;
}
main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h;
char m[10];
int i;FILE *out ;
printf("The original data:\n");
for(i=0; i<N; i++)
{ if(i%4==0) printf("\n");
printf("%s %3d ",s[i].num,s[i].s);
}
printf("\n\nEnter the number: ");gets(m);
h=fun( s,m );
printf("The data : ");
printf("\n%s %4d\n",h.num,h.s);
printf("\n");
out = fopen("..\\..\\out.dat","w") ;
h=fun(s,"GA013");
fprintf(out,"%s %4d\n",h.num,h.s);
fclose(out);
getchar();
}
函数fun的功能是:统计形参str中所出现的大写字母的范围跨度,即按字典序最前面的大写字母与最后面的大写字母ASCII值之差,并传递回主函数输出。若没有大写字母,则函数输出0。例如: 若str的内容为”Baybye!Doom",其中大写字母为B和D,D与B之 差为2,函数返回2,程序输出2。若str的内容为"M68C9Xaa”,其中字典序最前面的大写字母为C,最后面的大写字母为X,X与C之差为21,函数返回21,程序输出21。
#include <stdio.h>
#include <string.h>
int fun(char* str) {
int k, c0, c1;
c0 = c1 = -1;
for (k=0; k<strlen(str); k++)
if ( (str[k] >= 'A') && (str[k] <= 'Z') )
{ c0 = c1 = k;
break;
}
if (c0 == -1)
return 0;
/**********************found***********************/
for (k=0; k<strlen(str); k++)
{
/**********************found***********************/
if ( (str[k] >= 'A') && (str[k] <= 'Z') )
{
if (str[k] < str[c0])
c0 = k;
if (str[k] > str[c1])
c1 = k;
}
}
/**********************found***********************/
return str[c1] - str[c0];
}
int main()
{
char str[100];
int l;
printf("input string:");
scanf("%s", str);
l = fun(str);
printf("span:%d\n", l);
return 0;
}
给定程序中,函数fun的功能是将不带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为: 2、4、6、8、10,逆置后,从头至尾结点数据域依次为: 10、8、6、4、2。
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node {
int data;
struct node *next;
} NODE;
/**********found**********/
struct node * fun(NODE *h)//或者写成NODE *fun(NODE *h)
{ NODE *p, *q, *r;
p = h;
if (p == NULL)
return NULL;
q = p->next;
p->next = NULL;
while (q)
{
/**********found**********/
r = q->next;
q->next = p;
p = q;
/**********found**********/
q = r ;
}
return p;
}
NODE *creatlist(int a[])
{ NODE *h,*p,*q; int i;
h=NULL;
for(i=0; i<N; i++)
{ q=(NODE *)malloc(sizeof(NODE));
q->data=a[i];
q->next = NULL;
if (h == NULL) h = p = q;
else { p->next = q; p = q; }
}
return h;
}
void outlist(NODE *h)
{ NODE *p;
p=h;
if (p==NULL) printf("The list is NULL!\n");
else
{ printf("\nHead ");
do
{ printf("->%d", p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
main()
{ NODE *head;
int a[N]={2,4,6,8,10};
head=creatlist(a);
printf("\nThe original list:\n");
outlist(head);
head=fun(head);
printf("\nThe list after inverting :\n");
outlist(head);
getchar();
}
请编写函数fun,其功能是:给定一个整数n(n<10000),如果n加上100后是一个完全平方数(所谓“完全平方数”,就是开方后的结果是整数的数),并且n加上268也是一个完全平方数,则函数值返回1,否则返回0。
#include <stdio.h>
#include <math.h>
int fun(long n)
{
float a,b;
a=sqrt(n+100);
b=sqrt(n+268);
if((int)a==a&&(int)b==b)
{
return 1;
}
else
return 0;
}
int main()
{
long i;
FILE *fp = fopen("out.dat", "w");
for(i=1;i<10000;i++)
{
if (fun(i))
{
printf("%ld\n", i);
fprintf(fp, "%ld\n", i);
}
}
return 0;
}
请编写函数fun,其功能是:验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x < *y。主程序中将打印出分解结果。例如:111=3*37, 当函数fun的参数n为111时,可以分解为2个素数(3和37) 的乘积函数返回值为1。另外,prime函 数验证参数m是否为素数,是则返回1,否则返回0。
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
int k1;
k=2;
do{
k1=n/k;
if(k*k1==n)
{
if((prime(k))&&(prime(k1))&&(k<k1))
{
flag=1;
*x=k;
*y=k1;
break;
}
}
k++;
}while(k<k1);
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}
函数fun的作用是:参数xx的前10个元素已经按升序排好序,将参数num按升序插入到数组xx中。
#include <stdio.h>
void func(int xx[], int num)
{
int n1,n2,pos,i,j;
pos=xx[9];
if (num > pos)
/**********found**********/
xx[10] = num;
else {
for(i=0;i<10;i++)
{
if(xx[i]>num){
n1=xx[i];
xx[i]=num;
for(j=i+1;j<11;j++){
n2=xx[j];
xx[j] = n1;
/**********found**********/
n1=n2;
}
/**********found**********/
break;
}
}
}
}
int main()
{
int xx[11] = {2,5,7,10,17,51,63,73,85,99};
int i,num;
printf("original array is:\n");
for(i=0;i<10;i++) printf("%5d",xx[i]);
printf("\n");
printf("insert a new number:");
scanf("%d", &num);
func(xx, num);
for(i=0;i<11;i++) printf("%5d", xx[i]);
printf("\n");
return 0;
}
请编写函数fun,其功能是:将a所指数组主对角线上的元素分别乘以2;次对角线上的元素
分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据。
#include <stdio.h>
#define N 3
void fun( int a[N][N],int *p)
{
int i,k=0;
for(i=0;i<N;i++)
{
p[k++]=a[i][i]*2;
}
for(i=0;i<N;i++)
{
p[k++]=a[i][N-1-i]*3;
}
}
main()
{ int a[N][N]={ 1,5,7,2,6,8,3,4,9};
int b[2*N],i;
fun(a,b);
for(i=0;i<2*N;i++)
printf("%d,",b[i]);
}
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:****A*BC*DEF*G。在编写函数时,不得使用C语言提供的字符串函数。
#include <stdio.h>
void fun( char *a )
{
char*q=a;
while(*q!='\0')
{
q++;
}
q--;
while(*q=='*')
{
q--;
}
*(q+1)='\0';
}
main()
{ char s[81];
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
getchar();
}
请编写一个函数,用来删除字符串中的所有空格。例如,输入"asd af aa z67",则输出为"asdafaaz67"。
#include <stdio.h>
#include <string.h>
void fun(char *str)
{
int i,j;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ')
{
for(j=i+1;str[j]!='\0';j++)
{
str[j-1]=str[j];
}
str[j-1]='\0';
i=0;
}
}
}
main()
{
char str[81];
printf("Input a string:") ;
gets(str);
puts(str);
fun(str);
printf("*** str: %s\n",str);
getchar();
}
法二:
#include <stdio.h>
#include <string.h>
void fun(char *str)
{
int k=0;
char *p=str;
while(*p!='\0')
{
if(*p!=' ')
{
str[k++]=*p;
}
p++;
}
str[k]='\0';
}
main()
{
char str[81];
printf("Input a string:") ;
gets(str);
puts(str);
fun(str);
printf("*** str: %s\n",str);
getchar();
}
函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。例如,有10个正数:46 30 3240 6 17 45 15 48 26,平均值为:30.500000移动后的输出为:46 32 40 45 48 30 6 17 15 26
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double *x)
{ int i, j; double s, av, y[N];
s=0;
for(i=0; i<N; i++) s=s+x[i];
/**********found**********/
av=s/N;
for(i=j=0; i<N; i++)
if( x[i]>av ){
/**********found**********/
y[j++]=x[i]; x[i]=-1;}
for(i=0; i<N; i++)
/**********found**********/
if( x[i]!= -1) y[j++]=x[i];
for(i=0; i<N; i++)x[i] = y[i];
return av;
}
main()
{ int i; double x[N]= {46,30,32,40,6,17,45,15,48,26};
for(i=0; i<N; i++) printf("%4.0f ",x[i]);
printf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
getchar();
}
函数fun的功能是:在任意给定的N个正整数中,从左到右依次逐个取三个数作为一组,按值大小找出该组数的中值,用该中值替换与该组数对应的原三个数中的中间位置的数。处理后原数列中首尾2个数不变。处理后数列在主函数中输出。例如,有10个正整数如下:初始数列为:6 5 7 23 18 5 8 21 45 38
第1组数为:6 5 7 中值为:6 替换后的数列为:6 6 7 23 18 5 8 21 45 38
第2组数为:5 7 23 中值为:7 替换后的数列为:6 6 7 23 18 5 8 21 45 38
第3组数为:7 23 18中值为:18替换后的数列为: 6 6 7 18 18 5 8 21 45 38
第4组数为:28 18 5中值为:18替换后的数列为:6 6 7 18 18 5 8 21 45 38
第5组数为: 18 5 8中值为:8 替换后的数列为:6 6 7 18 18 8 8 21 45 38
第6组数为: 5 8 21中值为:8 替换后的数列为:6 6 7 18 18 8 8 21 45 88
第7组数为:8 21 45中值为:21替换后的数列为:6 6 7 18 18 8 8 21 45 38
第8组数为:21 45 38中值为:38替换后的数列为: 6 6 7 18 18 8 8 21 38 38
最终结果为:6 6 7 18 18 8 8 21 38 38
#include <stdio.h>
#define N 10
int findmid(int a, int b, int c)
{ int t;
t = (a>b)?(b>c?b:(a>c?c:a)):((a>c)?a:((b>c)?c:b));
/**********found**********/
return t;
}
void fun(int x[])
{ int i,a,b,c,t[N];
/**********found**********/
for(i=0;i<N;i++) t[i]=x[i];
for(i=0;i<N-2;i++)
{ a=t[i];b=t[i+1];c=t[i+2];
/**********found**********/
x[i+1]=findmid(a,b,c);
}
}
main()
{ int i, x[N]={6,5,7,23,18,5,8,21,45,38};
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\n");
fun(x);
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\n");
getchar();
}
请编写函数fun,其功能是:编写函数char *fun(char * s0, char *s1, char *s2,char*s3),要求实现:将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个。例如:s0为"abcdefghij"时,分解完成后,s1、s2、s3分别为: "adgj”、 "beh”、 "cfi”。
#include <stdio.h>
#include <string.h>
void fun(char * s0,char *s1,char *s2, char *s3)
{
int i,k=0,n=0,m=0;
for(i=0;i<strlen(s0);i=i+3)
{
s1[k++]=s0[i];
if(i+1<strlen(s0))
s2[n++]=s0[i+1];
if(i+2<strlen(s0))
s3[m++]=s0[i+2];
}
s1[k]='\0';
s2[n]='\0';
s3[m]='\0';
}
void main()
{
char s0[100],s1[40],s2[40],s3[40];
printf("请输入一行字符串\n");
gets(s0);
fun(s0,s1,s2,s3);
puts(s1);
puts(s2);
puts(s3);
1.1函数fun的功能是:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小写与形参c一致,数量由形参d指定。若输出字母中有字母Z或z,则应从A或a开始接续,直到输出指定数量的字母。例如: c为'Y’,d为4,则程序输出ZABC; c为’z’,d为2,则程序输出ab。
#include <stdio.h>
#pragma warning (disable:4996)
void fun(char c, int d) {
int i;
char A[26], a[26], *ptr;
/**********found**********/
for (i=0; i<26; i++) {
A[i] = 'A' + i;
a[i] = 'a' + i;
}
/**********found**********/
if ((c >= 'a') && (c <= 'z')) ptr = a;
else ptr = A;
/**********found**********/
for (i=1; i<=d; i++) printf("%c", ptr[(c-ptr[0]+i) % 26] );
}
main( ) {
char c; int d;
printf("please input c & d:\n");
scanf("%c%d", &c, &d);
fun(c, d);
}
1.2函数fun的功能是:将字符串a中的所有字符复制到字符串b中,要求每复制三个字符之后插入一个空格。例如,在调用fun函数之前给字符串a输入:ABCDEFGHIJK,调用函数之后,字符串b中的内容则为: ABC DEF GHI JK
#include <stdio.h>
#pragma warning (disable:4996)
void fun(char *p, char *b)
{ int i, k=0;
while(*p)
{ i=1;
while( i<=3 && *p ) {
/**********found**********/
b[k]=*p;
k++; p++; i++;
}
if(*p)
{
/**********found**********/
b[k++]=' ';
}
}
b[k]='\0';
}
main()
{ char a[80],b[80];
printf("Enter a string: "); gets(a);
printf("The original string: "); puts(a);
fun(a,b);
printf("\nThe string after insert space: "); puts(b); printf("\n\n");
getchar();
}
1.3函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。例如,若输入"abc4EFG",则应输出"aBc4EFG"。
#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
int i;
for(i=0;i<strlen(ss);i++)
{
if(i%2!=0&&(ss[i]>='a'&&ss[i]<='z'))
ss[i]=ss[i]-'a'+'A';
}
}
void main( void )
{
char tt[51];
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
getchar();
}
5.2
函数int my_ isalpha (char c) 的功能是返回字符的种类:大写字母返回1,小写字母返回-1,其他字符返回0。函数void a()调用my_ isalpha(), 根据其返回值决定输出:是大写字母则输出*,是小写字母输出#,是其他字符则输出问号?
#include <stdio.h>
#pragma warning (disable:4996)
int my_isalpha(char c)
{
if(c>='A'&&c<='Z') return 1;
else if(c>='a'&&c<='z') return -1;
else return 0;
}
void a( )
{
char ch;
int sort;
printf("本程序判断你从键盘上键入字符的种类,请输入字符(串):\n");
do
{
ch=getchar();
if(ch!='\n')
{
sort= my_isalpha( ch);
/**********************found***********************/
switch(sort)
{
case 1: printf("%c",'*'); break;
/**********************found***********************/
case -1: printf("%c",'#');break;
case 0: printf("%c",'?');
}
}
/**********************found***********************/
}while(ch !='\n');
printf("%c",'\n');
}
void main( )
{
a();
}
18.3函数fun,函数的功能是:统计一行字符串中单词的个数作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。
#include <stdio.h>
#include <string.h>
#define N 80
int fun( char *s)
{
int count=1,i=0;
while(s[i]!='\0')
{
if(s[i]==' '&&(s[i+1]>='a'&&s[i+1]<='z'))
count++;
i++;
}
return count;
}
main()
{ char line[N]; int num=0;
printf("Enter a string :\n"); gets(line);
num=fun( line );
printf("The number of word is : %d\n\n",num);
getchar();
}