小白学C语言(二)

小白学C语言的记录博,课程已经结束了,不会再更新了。
题目都是实验课老师布置的,代码有参考其他大佬,特此致谢!
使用教材:C语言程序设计(第3版) 何钦铭、颜晖主编 高等教育出版社

六、数组
1
以等腰三角形输出n行杨辉三角形。n的值从键盘输入且小于10,每个数字输出占4列。

#include 
int main (void)
{
	int a[14][14],n=0,i,j,k;
	while (n<=0 || n>=13)
		scanf("%d",&n);
	for (i=1;i<=n;i++)
		a[i][1]=a[i][i]=1;
	for (i=3;i<=n;i++)
		for(j=2;j<=i-1;j++)
			a[i][j]=a[i-1][j-1]+a[i-1][j];
	for (i=1;i<=n;i++){
		for (k=1;k<=n-i;k++)
			printf ("  ");
		for (j=1;j<=i;j++)
			printf("%4d",a[i][j]);

		printf("\n");
		}

	return 0;	
}

样例
小白学C语言(二)_第1张图片
2
教材P177:第7章课后习题题三(2)-数字个数统计。

#include 
int main (void)
{
	int n,a[1001],s[10]={0},i,j,max;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	{	while(a[i]!=0)
		{	j=a[i]%10;
			s[j]++;
			a[i]=a[i]/10;
		}
	}
		max=0;
		for(j=1;j<10;j++)
		{	if(s[j]>s[max])
				max=j;
		}
		printf("%d:%d\n",max,s[max]);
			
	return 0;
}

样例
小白学C语言(二)_第2张图片
3
从键盘接收一个字符串,判定输入的字符串是否为回文。

#include 
int main (void)
{
	int i,k;
	char line[50];
	printf("input a string\n");
	k=0;
	while ((line[k]=getchar())!='\n')
		k++;
	line[k]='\0';
	i=0;
	k=k-1;
	while (i<k)
	{
		if(line[i]!=line[k]) break;
		i++;
		k--;
	}
	if(i>=k)
		printf("yes");
	else
		printf("no");
	
	return 0;
}

样例
小白学C语言(二)_第3张图片
4
从键盘输入由小写英文字母构成的字符串,统计字符串中各个字母出现的次数,并输出其中至少出现过一次的字母及其出现的次数。

#include
int main()
{
	int a[100]={0},i,j; 
	char c;
	while((c=getchar())!='\n')
		for (i=65;i<=90;i++)
			if(c==i+32)
				a[i]++;
	for (j=65;j<=90;j++)
		if (a[j]>0)
			printf("%c:%d\n",j+32,a[j]);
	return 0;
}

样例
小白学C语言(二)_第4张图片
5
从键盘输入三行文字(每行不超过80个字符),统计出其中大写字母、小写字母、数字字符、空格、其它字符的个数。

#include 
int main (void)
{
	int i,j;
	int up=0,low=0,dig=0,spa=0,oth=0;
	char a[3][80];
	for (i=0;i<3;i++)
		gets(a[i]);
	for (i=0;i<3;i++)
		for (j=0;j<80 && a[i][j]!='\0';j++)
			if (a[i][j]>='A' && a[i][j]<='Z')
				up++;
			else if (a[i][j]>='a' && a[i][j]<='z')
				low++;
			else if (a[i][j]>='0' && a[i][j]<='9')
				dig++;
			else if (a[i][j]==' ')
				spa++;
			else
				oth++;

	printf("upper: %d\nlower: %d\ndigit: %d\nspace: %d\nother: %d",up,low,dig,spa,oth);
	return 0;
}

样例
小白学C语言(二)_第5张图片
6
从键盘输入两个整数m和n(1

#include 
int main(void)
{
	int m,n,i,j,temp;
	int a[20];
	scanf("n=%d,m=%d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<m;i++)
	{	temp=a[0];
		for(j=0;j<n-1;j++)
			a[j]=a[j+1];
		a[n-1]=temp;
	}
	for(i=0;i<n;i++)
		printf("%3d",a[i]);

	return 0;

}

样例
小白学C语言(二)_第6张图片
7
已知一个二维整型数组已初始化a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}},请删除此数组中所有等于输入值的元素,删除后,各元素依次前移。
请注意,C语言二维数组的行优先方式存储。例如:a[3][2]的数组,在内存中依次存储a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1],也就是说,先存储第“0”行的元素,再存储第“1”行的元素。

#include 
int main()
{   int i,j,count=0,num;
    int a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}};
	scanf("%d",&num);
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(a[i][j]!=num)
			{	a[count/5][count%5]=a[i][j]; //利用count获得保留下来的元素的下标 
                count++;		
            }          
    for(i=0;i<5;i++)  
	{  	for(j=0;j<5;j++)
		{	count--;
			if(count<0)  //如果count原本为0,即一个都没有 
           		break;
			printf("%3d",a[i][j]);//如果至少还有一个,输出 
		}
        printf("\n");
    }
    return 0;
}

样例
小白学C语言(二)_第7张图片
8
从键盘输入一串仅由英文字母和空格构成的字符串,统计其中单词的个数,并将每个单词的第一个字母改成小写,输出统计结果以及修改后的字符串。这里“单词”是指由空格隔开的英文字符串。

#include 
int main()
{
    char x[100];
    int i,cnt=1;
    gets(x);
    x[0]=x[0]+32;
    for (i=0;x[i]!='\0';i++)
    {	if (x[i]==' ')
    		cnt++;
        if (x[i]==' '&&(x[i+1]>='A'&&x[i+1]<='Z'))
            x[i+1]=x[i+1]+32;
    }
    
    printf("count:%d\n",cnt);
    for (i=0;x[i]!='\0';i++)
        printf("%c",x[i]);
    
    return 0;
}

样例
小白学C语言(二)_第8张图片
七、指针
1
通过调用自定义函数void find(int *p,int n,int *max,int *min),在数组a中同时查找最大元素和最小元素的下标,分别存放在main()函数中的max和min变量中。

#include 
void find(int *p,int n,int *max,int *min)
{	int i;
    *max=*min=0;
	for(i=1;i<n;i++)
	{   if(p[i]>p[*max])
			*max=i;
		if(p[i]<p[*min])
			*min=i;
    }

}

int main()
{   int a[5],i,max,min;
	for(i=0;i<5;i++)
		scanf("%d",&a[i]);
	find(a,5,&max,&min);
	printf("%d,%d",max,min);
	return 0;
}

样例
小白学C语言(二)_第9张图片
2
从键盘输入一个正整数n(n的值不超过10),然后输入n个互不相同的整数,通过调用一个排序函数void sort(int *x,int n)对这n个整数按从大到小的顺序排序,然后依次输出。(冒泡排序)

#include
#define N 10
void sort(int *x,int n)
{   int i,j,t;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-1;j++)
			if(x[j]<x[j+1])
				t=x[j],x[j]=x[j+1],x[j+1]=t;

}

void 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("%3d",*p);

}

样例
小白学C语言(二)_第10张图片
3
在主函数中输入一个字符串,然后再输入任意一个字符,通过调用一个自定义函数void chardel(char *p,char c),将字符串中存在的该指定字符删除掉,在主函数中输出删除指定字符后的字符串。

#include 
void chardel(char *p,char c)
{	char *q;
	for(q=p;*p!='\0';p++)
		if(*p!= c)
			*q++=*p;
	*q='\0';
 }
void main()
{	char a[100],c;
	gets(a);
	c=getchar();
	chardel(a,c);
	printf("After delete:\n");
	puts(a);
} 

样例
小白学C语言(二)_第11张图片
4
对任意输入的一串字符,判断其是否为回文字符串。

#include 
#include  
int ishw(char *p)
{
	char *q;
	q=p;
	while(*q)
		q++;
	q--;
	while(p<q)
	{	if(*p!=*q)	return 0;
		p++;
		q--;
	}
	return 1;
}

main (void)
{
	char str[20],*p=str;
	gets(p);
	if(ishw(p))
		printf("yes");
	else
		printf("no");
}

样例
小白学C语言(二)_第12张图片
5
实数拆分:输入一个小数,输出整数部分和小数部分。

#include  
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-*intpart;
}

样例
小白学C语言(二)_第13张图片
八、结构
1
定义一个有5条记录的图书类型数组,输入待查找的书名,通过调用函数void search(struct book *p,int n,char *c)在图书数组中查找该书名是否存在,如果存在,显示出该书的价格,否则显示“No found”。

#include
#include
struct book
{   char name[20];
    int price;
};

void search(struct book *p,int n,char *c)
{   int i,index=-1;
    for(i=0;i<n;i++,p++)
        if(strcmp(p->name,c)==0)
        {   index=i;
			printf ("price:%d",p->price);
            break;
        }
    if(index==-1)
		printf("No found");
}

void main()
{   char c[20];
    struct book bk[5]={{"c++",35},{"python",60},{"jsp",40},{"html",20},{"java",36}};
    gets(c);
	search(bk,5,c);
}

样例
小白学C语言(二)_第14张图片
2
教材第9章P233课后习题题三(1):时间换算问题。

#include 
struct time
{	int hour, minute, second;
};
int main(void)
{	struct time t;
	int n;
 	scanf("%d:%d:%d", &t.hour, &t.minute, &t.second);//输入时注意用英文标点
 	scanf("%d",&n);
 	t.second += n;
 	if(t.second >= 60)
	{	t.minute += t.second / 60;
 		t.second %= 60;
 		if(t.minute >= 60)
		{	t.hour += t.minute / 60;
 			t.minute %= 60;
 			if(t.hour >= 24)
 				t.hour %= 24;
 		}
 	}
 	printf("After %d seconds is %d:%d:%d", n, t.hour, t.minute, t.second);
	return 0;
}

样例
小白学C语言(二)_第15张图片
3
教材P233第9章课后习题题三(2):复数的乘积运算。

#include 
struct complex
{
	double sb;
    double xb;
};

struct complex complexproduct(struct complex s1,struct complex s2);
int main()
{
	struct complex c1,c2,c3;
    scanf("%lf+%lfi",&c1.sb,&c1.xb);
    scanf("%lf+%lfi",&c2.sb,&c2.xb);
    c3=complexproduct(c1,c2);
    printf("c1*c2=%f+%fi\n",c3.sb,c3.xb);
    return 0;
}
struct complex complexproduct(struct complex s1,struct complex s2)
{
	struct complex w;
	w.sb=s1.sb*s2.sb-s1.xb*s2.xb;
	w.xb=s1.sb*s2.xb+s1.xb*s2.sb;
	return w; 
}

样例
小白学C语言(二)_第16张图片

九、递归
1
通过调用一个用递归方式实现的求整数n的阶乘函数double fac(int n),计算并输出从1到n的阶乘之和,即s=1!+2!+…+n!,n的值从键盘输入(n<11)。

#include 
double fac(int n)
{   
	double f;
	if(n==1||n==0)
		f=1;
    else
		f=n*fac(n-1);
    
	return f;
}
int main(void)
{
	double s=0;
    int i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        s+=fac(i);
    
	printf("s=%.2lf",s);
}

样例
小白学C语言(二)_第17张图片
2
从键盘输入一个十进制正整数n,通过调用一个递归函数int order(int n)实现对整数n按位顺序输出。

#include  
void order(int n)
{
	if(n<10)
    	printf("%d",n);          
    else
	{	order(n/10);             
        printf("%d",n%10);    
    }
}

void main()
{
	int n;
    scanf("%d",&n);
	printf("out:");
	order(n);
}

样例
小白学C语言(二)_第18张图片
3
按以下所给的公式计算并输出组合数:
在这里插入图片描述
要求:
①分别编写一个求阶乘n!的函数int fac(int n)、一个求组合数函数int cnm(int n,int m);
②编写主函数,由键盘输入n和m(n不得小于m,否则显示“input error”),通过嵌套调用①中的函数完成计算。

#include
int fac(int n);
int cnm(int n,int m);
int main(void)
{
	int n,m;
	scanf("n=%d,m=%d",&n,&m);
	if(n<m)
	{	printf("input error");
		return 0;
	}
	printf("cnm=%d",cnm(n,m));
	return 0;
}

int fac(int n)
{	int i,fact=1;
	for(i=1;i<=n;i++)
		fact=fact*i;
	
	return fact;
}

int cnm(int n,int m)
{
	int c,nm=n-m;
	n=fac(n),m=fac(m),nm=fac(nm);
	c=n/(nm*m);
	
	return c;
}

样例
小白学C语言(二)_第19张图片
4
教材P262第10章课后习题题三(6):递归方法求Fibonacci数列第n项。

#include
int fib(int n)
{
	if(n==1||n==2)
		return 1;
	else
		return fib(n-1)+fib(n-2);
}

int main()
{
	int n;
    scanf("%d",&n);
    printf("NO.%d=%d",n,fib(n));
    return 0;
}

样例
小白学C语言(二)_第20张图片
5
教材P262第10章课后习题题三(7):递归方法实现十进制显示为二进制形式。

#include
void dec2bin(int n)
{
	int i=n%2;
	if(n>0)
	{	dec2bin(n/2);
		printf("%d",i);
	}
}

int main()
{
	int n;
    scanf("%d",&n);
    dec2bin(n);
    return 0;
}

样例
小白学C语言(二)_第21张图片

十、指针进阶
1
输入两个字符串,通过调用自定义函数char *strcat(char *s,char *t)将两个字符串连接,输出连接后的字符串。

#include
char *strcat(char *s,char *t)
{
	char *p;
	for(p=s;*p;p++);
		while(*p++=*t++);
	return s;
}

void main()
{
	char s1[50],s2[50];
	gets(s1);
	gets(s2);
	printf("%s",strcat(s1,s2));
}

样例
小白学C语言(二)_第22张图片
2
从键盘输入n个字符串(n的值由键盘输入,n<11),用选择排序法对这些字符串按其值的升序进行排序,输出排序后的各个字符串。

#include 
#include 
char a[50][50];
int i,j,n=10;
void sort()
{
	char temp[50];
	for(j=0;j<n;j++)
		for(i=0;i<n-j-1;i++)
			if(strcmp(a[i],a[i+1])>0)
			{	strcpy(temp,a[i]);
				strcpy(a[i],a[i+1]);
				strcpy(a[i+1],temp);
			}
}

void main()
{
	scanf("%d\n",&n);
	for(i=0;i<n;i++)
		gets(a[i]);
	printf("\n");
	sort();
	for(i=0;i<n;i++)
		puts(a[i]);
}

样例
小白学C语言(二)_第23张图片
3
用一个指针数组将表示星期的7个英文单词组织起来;任意输入一个字符串,在表中查找,若存在,则输出该字符串在表中的序号,否则输出-1。

#include 
#include 
int getindex(char *w[],char *s);
int main()
{   int n;
    char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thurday","Friday","Saturday"},str[20];
    gets(str);
    n=getindex(week,str);
    if(n==-1)
		printf("wrong input!");
    else
		printf("%d",n);
    return 0;
}
int getindex(char *w[],char *s )
{
	int i,result=-1;
	for(i=0;i<7;i++)
		if(strcmp(w[i],s)==0)
		{	result=i;
			break;
		}
	return result;
}

样例
小白学C语言(二)_第24张图片
4
输入整数n及n个字符串,试将这些字符串按照长度的升序排列并显示出来。

#include 
#include 
char a[50][50];
int i,j,n=10;
void sort()
{
	char temp[50];
	for(j=0;j<n;j++)
		for(i=0;i<n-j-1;i++)
			if(strlen(a[i])>strlen(a[i+1]))
			{	strcpy(temp,a[i]);
				strcpy(a[i],a[i+1]);
				strcpy(a[i+1],temp);
			}
}

void main()
{
	scanf("%d\n",&n);
	for(i=0;i<n;i++)
		gets(a[i]);
	printf("Sorted result:\n");
	sort();
	for(i=0;i<n;i++)
		puts(a[i]);
}

样例
小白学C语言(二)_第25张图片
5
输入一个字符串后再输入两个字符,输出此字符串中从与第1 个字符匹配的位置开始到与第2 个字符匹配的位置结束的所有字符。例如,输入字符串“program”与2 个字符’r’和’g’后,输出”rog”。

#include 
char *match(char *s,char c1,char c2);//获取字符串s中从c1到c2之间的所有字符,并且返回c1的地址 
int main()
{   char str[100],ch_start,ch_end,*p;
    scanf("%s\n",str);
    scanf("%c %c",&ch_start,&ch_end);
    p=match(str,ch_start,ch_end);
    printf("%s",p);
    return 0;
}

char *match(char *s, char c1, char c2)
{
	int i,length,start=0,end;
	length=strlen(s);
	end=length-1;
	for(i=0;i<length;i++)
		if(s[i]==c1)
		{	start=i;
			break;
		}
	for(i=(start+1);i<length;++i)
		if(s[i]==c2)
		{	end=i;
			break;
		}
	for(i=0;i<=end-start;i++)
		s[i]=s[start+i];
	s[i]='\0';
	return s;
}

样例
小白学C语言(二)_第26张图片

你可能感兴趣的:(程序设计,C语言,程序设计,Dev-C)