C语言程序设计个人笔记——编程题

2020/11/16

  • 题目一:判断一个整数是否是回文数
  • 题目二:交换两个变量的值
  • 题目三:去掉字符串前面的*号
  • 题目四:求两个整数的最大公因子
  • 题目五:小写字母转大写
  • 题目六:判断一个数是否为素数
  • 题目七:验证哥德巴赫猜想
  • 题目八:计算pai的近似值
  • 题目八:计算1!+2!+3!+....+10!
  • 题目九:编程计算x的每位数字相加之和
  • 题目十:判断数是否为回文数
  • 题目十一:换零钱问题
  • 题目十二:猜做好事的人是谁
  • 题目十三:输入一行字符并统计各大写字母出现的次数
  • 题目十四:统计单词的个数
  • 题目十五:求两正整数之间所有整数包含的数字0-9出现的次数
  • 题目十六:将数组中奇数放在数组前半部分,偶数放在后半部分
  • 题目十七:对数组A中的N个整数从小到大进行连续编号
  • 题目十八:使用数组完成两个超长(长度大于100)正整数的乘法
  • 题目十九:从5个不同颜色的球中,每次取出3个,编程打印出得到3种不同颜色的球的所有可能
  • 题目二十:求所有不超过200的N值,N的平方回文数
  • 题目二十一:用新子串替换旧子串内容
  • 题目二十三:两肩素数
  • 题目二十四:文件的相关操作
  • 题目二十五:字符串s所有字符左移n个位置,串中前n个字符移动到最后
  • 题目二十六:输入一整数判断它是否能被3、5、7整除
  • 题目二十七:彩票选号
  • 题目二十八:将英语规则名词由单词变为复数
  • 题目二十九:求10000以内数字的乘积根
  • 题目三十:对文本文件以行为单位读取并对字符从小到大的顺序进行排序
  • 题目三十一:从键盘中输出5个学生数据将其输出文件再读取出来
  • 题目三十二:计算字符串中最长的单词的长度,并将其输出
  • 题目三十三:判断鞍点(所在行最大,同时在所在列最大)
  • 题目三十四:两线性表的并、交、差

题目一:判断一个整数是否是回文数

/*
题目来源:https://leetcode-cn.com/problems/palindrome-number/
*/
bool isPalindrome(int x){
    int s, n = x;               
    long int sum = 0;           //!sum初始值设为0       
    while(n > 0){
        s = n%10;               //弹出个位
        n /= 10;                //弹出个位后剩余的值
        sum = sum*10 + s;       
    }
    if(sum == x) return true;
    return false;
}

题目二:交换两个变量的值

/*
不借助其他变量
*/
void main()
{ 
	int a,b;
	scanf("%d%d", &a, &b);
	printf("before swap: a=%d, b=%d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("after swap: a=%d, b=%d\n", a, b);
}

题目三:去掉字符串前面的*号

void fun(char a[]){
	//先找到不为*的第一个字符的位置
	int i,j;
	i = j = 0;
	while(a[i]=='*') ++i;
	
	//依次向前部分赋值
	while(a[i]!='\0'){
		a[j] = a[i];
		i++;
		j++;
	}
	a[j] = '\0';				//!别忘记写这步了。
}

void main()
{ 
	char s[81];
	printf("input a string:");
	gets(s);
	fun(s);
	printf("the string after deleted!");
	printf("\n");
	puts(s);
}

题目四:求两个整数的最大公因子

/*
思路:首先输入两个整数m和n;
用m取余于n,将余数赋给r,如果r等于0,则n是最大公因子,算法结束,否则执行下一步;
把n赋值给m,把r赋值给n,转到上一步。
!若题目让求最小公倍数,则最小公倍数为(m*n)/最大公因子
*/
//1:非递归写法
void main()
{ 	//m为较大数,n为较小数
	int m, n, r;
	printf("please input two positive integer:");
	scanf("%d%d", &m, &n);
	while(n != 0){
		r = m % n;
		m = n;
		n = r;
	}
	printf("Their greatest common divisor is %d\n", m);
}

//2:递归写法
int f(int m, int n){
	if(n==0) return m;
	else return f(n,m%n);
}

题目五:小写字母转大写

void main(){
	char c;
	while(1){
		c = getchar();			//获取一个字符
		if(c>='a' && c<='z')
			putchar(c-'a'+'A');
		else break;					//不是小写字母
	}
}

题目六:判断一个数是否为素数

/*
素数:除了能被1和它本身整除以外不能被任意整数整数的数。
*/
bool isPrimeNumber(int n){
	int i, k;
	k = sqrt(n);
	for(i=2; i<=k; ++i){
		if(n%i==0) return false;
	}
	return true;
}

题目七:验证哥德巴赫猜想

/*
方法:暴力循环
*/
bool isPrimeNumber(int n){
	int i, k;
	k = (int)sqrt(n);
	for(i=2; i<=k; ++i){
		if(n%i==0) return false;
	}
	return true;
}

void main()
{ 
	int n, p, q, pFlag, qFlag;
	p = 1;
	pFlag = qFlag = 0;

	printf("Please input n:");
	scanf("%d", &n);
	if(n<4 || n%2!=0){						//如果该数不是偶数
		printf("Input data error!\n");
		exit(-1);
	}
	
	while(pFlag*qFlag==0){					//当其中一个不为素数时
		p++;								
		q = n-p;
		pFlag = isPrimeNumber(p);
		qFlag = isPrimeNumber(q);
	}
	printf("%d=%d+%d\n", n, p, q);
}

题目八:计算pai的近似值

/*
pai/4 ≈1-1/3+1/5-1/7.....
要求累加到最后一项小于10^-6次方
*/
void main()
{ 
	int s = 1;						//控制正负
	float n=1.0, t=1, pi=0;			//n为对应的分母, t本次循环待加上的值
	while(fabs(t) >= 1e-6){
		pi += t;					//本轮加上
		//计算下轮待加上的值
		n += 2;
		s = -s;
		t = s/n;
	}
	pi *= 4;
	printf("pi = %.6f\n", pi);		//保留小数点后6位
}

题目八:计算1!+2!+3!+…+10!

void main()
{ 
	int i,n=1,sum=0;			//n:当前阶层值
	for(i=1; i<=10; ++i){		
		n *= i;
		sum += n;
	}
	printf("%d", sum);
}

题目九:编程计算x的每位数字相加之和

void main()
{ 
	int x ,n ,sum=0;
	scanf("%d", &x);
	n = x;						//n:临时变量
	while(n!=0){
		sum += n%10;
		n /= 10;
	}
	printf("%d", sum);
}

题目十:判断数是否为回文数

void main()
{ 
	int x ,n, r, sum=0;				//!sum初始值为0
	scanf("%d", &x);
	n = x;
	while(n!=0){
		r = n%10;					//弹出最后一位
		sum = sum*10+r;
		n /= 10;
	}
	if(sum==x) printf("该数为回文数");
	else printf("该数不为回文数");
}

题目十一:换零钱问题

/*
用一元五角人民币兑换5分、2分和1分的硬币(每一种都要)共一百枚,问共有集中兑换方法。
*/
void main()
{ 
	int x, y, z, count=0;				//x、y、z分别为三种钱的个数
	for(x=1; x<=29; ++x){				//5分的最多兑29枚
		for(y=1; y<=72; ++y){			//2分最多兑72枚
			z = 100-x-y;
			if(5*x+2*y+z == 150){
				++count;
				printf("%02d,%02d,%02d ",x,y,z);
				if(count%6 == 0){
					printf("\n");
				}
			}
				
		}
	}
	printf("count=%d\n", count);
}

题目十二:猜做好事的人是谁

/*
题目:4个同学做好事不留名,校长问是谁做的好事:
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
已知3个人说的是实话,一个人说的是假话。

思路:依次假设做好事的人是A、B、C、D
然后根据判定条件判断,若满足其中三个,则该人就是说实话的人
*/
void main()
{ 
	int k, sum=0, g=0;
	char thisman;						//做好事的人
	for(k=0; k<=3; ++k){
		thisman  = 'A'+k;
		sum = (thisman!='A')+(thisman=='C')+(thisman=='D')+(thisman!='D');
		if(sum==3){						//因为其中有三个人说的是实话,所以判断条件是sum为3
			printf("This man is %c\n", thisman);
			g = 1;
		}
	}
	if(g!=1) printf("这个人未找到!");
}

题目十三:输入一行字符并统计各大写字母出现的次数

/*
思想:用26数组存储各字符个数
*/
void main()
{	
	char ch;
	int i,num[26] = {0};					//初始化每个字母的个数为0,索引0对应的字符A,依次类推
	while((ch=getchar())!='\n'){
		if(ch>='A' && ch<='Z'){
			num[ch-'A']++;
		}
	}
	
	for(i=0; i<26; ++i){
		printf("%c(%d) ",'A'+i,num[i]);
	}
}

题目十四:统计单词的个数

/*
题目描述:输入一行字符,统计其中单词的个数,单词之间用空格隔开
*/
void main()
{	
	char string[80], c;
	int i, num=0, flag=0;		
	gets(string);
	
	for(i=0; (c=string[i])!='\0'; ++i){
		if(c==' ') flag=0;				//关键
		else{
			if(flag==0){
				++num;
				flag=1;
			}
		}
	}
	printf("There are %d words in the line\n", num);
}

C语言程序设计个人笔记——编程题_第1张图片

题目十五:求两正整数之间所有整数包含的数字0-9出现的次数

/*
题目描述:比如100到105之间有100,101,102,103,104,105六个数,则0出现的个数为7次,
1出现的个数为7次,2、3、4、5出现的次数各为1次。
思想:因为输入两个整数均不超过8位数,因此用两个长整型存储它们,然后通过循环将每次得到
的整数使用sprintf函数将其转换成8个字符的字符串存储在字符数组str中,字符串不足8位的
部分补空格字符,再对str中每个字符进行统计。数字出现的次数可以定义一个长整型数组count
来表示,其大小位10,count[0]存储0出现的次数,count[1]存储1出现的次数......
*/
void main()
{	
	long k, min, max ,count[10]={0};
	char str[9];
	int i;

	//输入最大最小值
	printf("input the first number:");
	scanf("%ld", &min);
	printf("input the lat number:");
	scanf("%ld", &max);
	if(min>max){
		printf("input error!");
		return;
	}

	//统计各数字出现的次数
	for(k=min; k<=max; ++k){
		sprintf(str, "%8d", k);					//将数字转化为字符串,存入str中
		for(i=7; i>=0 && str[i]!=' '; --i){		//!是倒着遍历,因为字符串不足八位前面补空格符,如果直接遍历,可能出现for循环不执行的情况,因为表达式2要求str[i]!=' '
			count[str[i]-'0']++;
		}
	}

	//显示输出结果
	for(i=0; i<10; ++i){
		printf("%d--(%ld) ",i,count[i]);
		if(i==4) printf("\n");
	}
}

题目十六:将数组中奇数放在数组前半部分,偶数放在后半部分

void main(){
	int i,j,temp,arr[5]={4,2,5,4,11};
	i=j=0;										//i为慢指针,j为快指针
	for(j=0;j<5;++j){	
		if(arr[i]%2==0){						//当i指向的元素是奇数时
			if(arr[j]%2!=0){
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
				++i;
				continue;
			}
		}else{									
			++i;
		}
	}
}

题目十七:对数组A中的N个整数从小到大进行连续编号

/*
A:存储值
B:B的索引对应A存储的值
*/
#include 
#define N 100

void main(){
	int A[N],B[N] = {0};
	int i=0,j,len=0,No,temp;
	
	//输入元素并将B置为特定值
	while(1){
		scanf("%d", &A[i]);
		B[A[i]]=1;
		len++;
		i++;
		if(getchar()=='\n') break;
	}

	//遍历A,并输出对应编号
	for(i=0; i<len; i++){	
		No=1;
		printf("%d-",A[i]);
		for(j=1; j!=A[i]; ++j){			//A[i]为B中对应的索引
			if(B[j]!=0) No++;
		}
		printf("%d ",No);
	}
}

C语言程序设计个人笔记——编程题_第2张图片

题目十八:使用数组完成两个超长(长度大于100)正整数的乘法

/*
详情:https://blog.csdn.net/l_liangkk/article/details/51980763
*/
#include 
#include 
#define N 200

void main(){
	int i,j,n,m,k;
	char s1[N], s2[N];								//字符串作为输入
	int a[N] = {0}, b[N] = {0}, c[2*N] = {0};		//用于将字符串输入的数据存储到int数组中
	//1:输入数据并实际输入长度
	scanf("%s%s",s1,s2);
	n=strlen(s1);
	m=strlen(s2);
	k=n+m;											//保证相乘以后的位数不会大于k
	//2:将字符串逆序用数字排列存储在数组中
	for(i=0; i<n; i++)
		a[i]=s1[n-i-1]-'0';
	for(j=0; j<m; j++)
		b[j]=s2[m-j-1]-'0';
	//3:两数相乘	
	for(i=0; i<n; i++)								//模拟乘法
        for(j=0; j<m; j++)
           c[i+j]+=a[i]*b[j];
    for(i=0; i<=k; i++){							//进位
        if(c[i]>=10){
           c[i+1]+=c[i]/10;
           c[i]%=10;
        }
    }
	//4:去除前导0
	i=k;
	while(c[i]==0) i--;
	printf("%d\n",i);
	//5:判断两个非负数之
	if(i<0) printf("0");
	else{
		for(; i>=0; i--)
			printf("%d",c[i]);
	}
}

题目十九:从5个不同颜色的球中,每次取出3个,编程打印出得到3种不同颜色的球的所有可能

/*
思想:利用三重循环分别模拟取球过程,每次取球需要与前面的球比较颜色,
颜色相同则抛弃。
*/
void main(){
	char *ballcolor[] = {"RED","YELLOW","BLUE","WHITE","BALCK"};
	int i,j,k,m=0;
	for(i=0; i<5; i++){
		for(j=i+1; j<5; j++){		
			for(k=j+1; k<5; k++){
				m++;
				printf("%d:%s,%s,%s\n",m,ballcolor[i],ballcolor[j],ballcolor[k]);
			}
		}
	}
}

题目二十:求所有不超过200的N值,N的平方回文数

/*
思想:将N的平方这个数用sprintf函数转为字符串,然后设置头尾指针往中间走
check:判断是否是回文数
*/
bool check(char arr[]){
	char *q = arr+strlen(arr)-1;					//尾指针
	while(arr<q){
		if(*arr != *q) return 0;
		arr++;
		q--;
	}
	return 1;
}

void main(){
	int i;
	char str[100];
	for(i=1; i<200; i++){
		sprintf(str,"%d",i*i);			//将i*i转为字符串并放在str字符数组中
		if(check(str)) printf("%d-%s\n",i,str);
	}
}

C语言程序设计个人笔记——编程题_第3张图片

题目二十一:用新子串替换旧子串内容

/*题目:将str字符串中所包含所有子串substr用新串newstr替换,并返回替换后的字符串。
(假设新子串与旧子串长度一样)
*/
char* replace(char str[], char* substr, char* newstr){
	char* p = str;								//工作指针
	int strLen = strlen(str);					//主串长度
	int subLen = strlen(substr);				//子串长度
	while(p<=str+(strLen-subLen)){				//遍历长度
		if(strncmp(p,substr,subLen)==0)			//如果是要替换的子串
			strncpy(p,newstr,subLen);			
		p++;
	}
	return str;
}
void main(){
	char s[15]="qweabcdefabcgh";
	printf("替换前:%s\n",s);
	printf("替换后:%s\n",replace(s,"abc","123"));//!使用strcpy、strncpy第1个参数是字符数组或指向字符数组的指针变量		
}

C语言程序设计个人笔记——编程题_第4张图片

题目二十三:两肩素数

/*
题目:将不超过2000以内所有素数从小到大排成一行,第二行上的每个数都等于它右肩膀的数减去它左肩膀的数。编程求出:第二行中是否存在这样的若干连续整数,它们的和恰好是1898?
思想:用一数组存放2000以内的所有素数,再用一数组存放相邻素数的差值,然后对该数组
从第一个到最后一个元素分别计算连续和并判断是否成立。
check:判断是否为质数
*/
bool check(int n){
	int i;
	for(i=2;i<sqrt(n);i++)
		if(n%i==0) return false;
	return true;
}

void main(){
	int i,j,count=0,sum=0,k=0,A[N],B[N];							//count为素数个数,同时作为遍历索引
	//将第一行数据写入到数组A中
	for(i=2; i<2000; ++i){
		if(check(i)) A[count++]=i;
	}
	//计算两肩之差写入到数组B中
	for(i=1; i<count-1; ++i){									//遍历第二行数据,从第2个开始遍历,到倒数第2个结束
		B[i] = A[i+1]-A[i-1];
		printf("%d\n",B[i]);
	}
	//遍历求出连续整数和为1898的情况
	for(i=1; i<count-1; ++i){
		sum = 0;
		j = i;
		while(sum<1898){
			sum+=B[j];
			j++;
		}
		if(sum=1898) k++;
	}
	printf("符合要求的个数%d个。",k);
}

题目二十四:文件的相关操作

字符读写函数fgetc和fputc——利用字符读写函数fgetc()、fputc()实现文件拷贝

void main(){
	FILE *input,*output;
	//1:先打开文件
	if((input=fopen("D://word.txt","r"))==NULL){
		printf("打开输入文件失败!");
		exit(-1);
	}
	//2:创建输出文件
	if((output=fopen("D://word-cpy.txt","w"))==NULL){
		printf("创建输出文件失败!");
		exit(-1);
	}
	//3:将输入文件中的数据输出到输出文件当中去
	for(;!feof(input);){					//关键
		fputc(fgetc(input),output);			//每执行依次fgetc函数,指针input就会向后移动一次,fputc同理。
	}
	fclose(input);
	fclose(output);
}

——————————————————————————————————————
字符读写函数fgetc和fputc——从文件word.txt中写入两行文本,然后三次读出其内容

void main(){
	FILE *fp1, *fp2;
	char str[]="123456789";

	//1:创建文件
	if((fp1=fopen("D://word.txt","w"))==NULL){
		printf("创建文件失败!");
		exit(-1);
	}
	//2:向文件中写内容,并关闭文件指针
	fputs(str, fp1);				//将字符串"123456"写入文件
	fputs("\nabcd",fp1);			//写入第一行文本的换行符和下一行文本
	fclose(fp1);					//关闭文件
	//3:读取文件中的内容,并关闭文件指针
	fp2=fopen("D://word.txt","rt");		//以只读方式打开
	
	fgets(str,8,fp2);				//读取字符串,最大长度是7,将是"1234567"
	printf("%s\n",str);
	
	fgets(str,8,fp2);				//读取字符串,最大长度为7,实际上将是"89\n"
	printf("%s\n",str);

	fgets(str,8,fp2);				//读取字符串,最大长度是7,实际上是"abcd"
	printf("%s\n",str);
	fclose(fp2);
}

C语言程序设计个人笔记——编程题_第5张图片
C语言程序设计个人笔记——编程题_第6张图片

字符读写函数fgetc和fputc——利用字符串读写函数fgets()、fputs()实现文件拷贝

void main(){
	FILE *input, *output;					//input:源文件指针,output:目标文件指针
	char str[81];

	//1:打开目标文件
	if((input=fopen("D://word.txt","r"))==NULL){
		printf("打开目标文件失败!");
		exit(-1);
	}
	//2:创建目标文件
	if((output=fopen("D://word-cpy.txt","w"))==NULL){
		printf("创建目标文件失败!");
		exit(-1);
	}
	//3:复制源文件到目标文件当中
	while(fgets(str,81,input)!=NULL){
		fputs(str,output);
	}
	//4:关闭源文件
	fclose(input);
	fclose(output);
}

——————————————————————————————————————
数据块读写函数fread和fwrite——将一整型数据存放到文件中,然后从文件中读取到数组中

void main(){
	FILE* fp;
	short i, a[10]={0,1,2,3,4,5,6,7,8,9};
	
	//1:创建文件
	fp=fopen("D://word.dat", "wb");				//!创建二进制文件
	if(fp==NULL){
		printf("创建文件失败!");
		exit(-1);
	}
	//2:向文件内写数据
	fwrite(a,sizeof(short),10,fp);				//将数组a的10个整型数据写入文件中
	fclose(fp);
	//3:打开创建的文件
	fp=fopen("D://word.dat","rb");
	if(fp==NULL){
		printf("打开文件失败!");
		exit(-1);
	}
	//4:读取文件中的内容
	memset(a,0,10*sizeof(short));
	fread(a,sizeof(short),10,fp);
	fclose(fp);

	for(i=0;i<10;++i){
		printf("%d ",a[i]);
	}
}

数据块读写函数fread和fwrite——将一整型数据存放到文件中,然后从文件中读取到数组中

void main(){
	int i=3;
	float f=(float)9.8;
	FILE* fp;
	//1:创建文件
	fp=fopen("D://word.txt","w");		//创建文本文件
	if(fp==NULL){
		printf("创建文件失败!");
		exit(-1);
	}
	//2:向文件中写内容并关闭文件
	fprintf(fp,"%2d,%6.2f",i,f);		//将变量i和f的值格式化输出到文件中去,注意:,号也被写入文件中去了
	fclose(fp);
	//3:打开文件
	fp=fopen("D://word.txt","r");
	if(fp==NULL){
		printf("打开文件失败!");
		exit(-1);
	}
	//4:读取文件中的内容
	i=0;								//i和j清0
	f=0;
	fscanf(fp,"%d,%f",&i,&f);			//从文件中读取数值到变量i和f
	fclose(fp);
	//5:显示从文件中读取的变量i和f的值
	printf("i=%2d,f=%6.2f\n",i,f);
}

C语言程序设计个人笔记——编程题_第7张图片

题目二十五:字符串s所有字符左移n个位置,串中前n个字符移动到最后

void main(){
	char str[]="0123456789";
	strlshift(str, 3);
	printf("%s\n", str);
}

void strlshift(char *s, int n){
	int i, len;
	char ch;
	len=strlen(s);
	for(i=0; i<n; i++){							//每次从第二个元素依次向前移动1次,一共n轮
		ch=s[0];
		strncpy(s,s+1,len-1);					//将第二个字符开始的len-1个字符左移
		s[len-1]=ch;
	}
}

题目二十六:输入一整数判断它是否能被3、5、7整除

/*
思想:利用标记
*/
void main(){
	int n,i,j=0,flags[3]={0};
	scanf("%d", &n);
	if(n%3==0) flags[0]=3;
	if(n%5==0) flags[1]=5;
	if(n%7==0) flags[2]=7;
	
	for(i=0;i<3;i++){
		if(flags[i]){
			printf("%d可以被%d整除 ",n,flags[i]);
			j++;
		}
	}
	if(j==0) printf("%d不能被3、5、7整除\n",n);
}

题目二十七:彩票选号

void main(){
	int i,j,k,sum;
	sum=0;
	for(i=0; j<=36; i++){
		k=i;										//起始彩票
		sum=i;
		for(j=1; i<=6; j++){
			k=k+j;									//第j+1张彩票
			if(k>36) break;							//彩票好超过36退出循环
			sum+=k;
		}
		if(sum!=105) continue;						//和数不够105继续下一轮
		//将这几张彩票输出
		k=i;
		for(j=0; j<=6; j++) printf("%d", k=k+j);	//显示彩票号码
		printf("\n");
	}
}

题目二十八:将英语规则名词由单词变为复数

void main(){
	int i,len;
	char s[100];
	scanf("%s",s);
	len = strlen(s);
	switch(s[len-1]){
		case 'y':
			s[len-1] = 'i';
			s[len] = 'e';
			s[len+1] = 's';
			s[len+2] = '\0';
			break;
		case 'x':
		case 's':
		case 'o':
			s[len] = 'e';
			s[len+1] = 's';
			s[len+2] = '\0';
			break;
		case 'h':
			if(s[len-1]=='i' || s[len-1]=='s'){
				s[len] = 'e';
				s[len+1] = 's';
				s[len+2] = '\0';
			}
			break;
		default:
			s[len] = 's';
			s[len+1] = '\0';
			break;
	}
	printf("%s", s);
}

题目二十九:求10000以内数字的乘积根

/*
思路:使用sprintf让数字转字符串
*/
int calu(char s[]){
	int i=0,temp,result=1;
	while(s[i]!='\0'){
		temp = s[i]-'0';
		if(temp!=0){
			result*=temp;
		}
		i++;
	}
	return result;
}

void main(){
	char str[10];
	int i,count=0,value;
	for(i=1; i<10000; i++){
		sprintf(str,"%s",i);				//转为字符串,并放入str中
		value = calu(str);
		if(value>0 && value<10) count++;
	}
	printf("个数为%d", count);
}
}

题目三十:对文本文件以行为单位读取并对字符从小到大的顺序进行排序

/*
例如:
原文:dAE, BfC
	 CCbbAA
结果:, ABCdef
	 AACCbb
	  
思路:用一个二维数组存储每一行元素,每读取一行将其放置数组,然后对该行元素排序,排序后读取下一行。最后将数组中的内容输出到文件中。
*/
void main(){
	char strs[100][100],t;				//strs存储文件读取的内容
	int i=0,j,k,len;
	FILE* fp = fopen("D://words.txt", "r");
	//1:读取并排序过程
	//每读一行,对该行排序并存在数组对应位置,然后再读取下一行
	while(!feof(fp)){
		printf("dda");
		fgets(strs[i],100,fp);
		len = strlen(strs[i]);
		//冒泡排序
		for(j=0;j<len;i++){
			for(k=1;k<len-j;k++){
				if(strs[j][k-1]>strs[j][k]){
					t = strs[j][k-1];
					strs[j][k-1] = strs[j][k];
					strs[j][k] = t;
				}
			}
		}
		//并将字符串尾设置为指定格式,然后i+1
		strs[i][len]='\n';
		strs[i][len+1]='\0';
		i++;
	}
	fclose(fp);
	//2:将排序后字符串写入文件中,并关闭文件
	fp = fopen("D://words.txt","w");
	for(j=0; j<i; j++)
		fputs(strs[j],fp);
	fclose(fp);
}
*/

题目三十一:从键盘中输出5个学生数据将其输出文件再读取出来

/*
结构体数组输入那有坑
*/
typedef struct Student{
	char no[9];
	char name[10];
	char sex;
	int age;
}Student;

void main(){
	int i;
	Student stus[3],temp[3];
	//1:输入五个学生数据
	for(i=0; i<3; i++){
		scanf("%s%s %c%d",stus[i].no,stus[i].name,&stus[i].sex,&stus[i].age);
	}
	printf("\n");
	//1:打开并写入文件
	FILE* fp = fopen("D://student.dat","wb+");
	fwrite(stus, sizeof(Student),3,fp);
	//3:读取文件中的内容
	for(i=0; i<3; i++){
		fseek(fp, i*sizeof(Student), SEEK_SET);
		fread(&temp[i], sizeof(Student),1,fp);
		printf("%s %s %c %d\n",temp[i].no,temp[i].name,temp[i].sex,temp[i].age);
	}
	fclose(fp);				
}

C语言程序设计个人笔记——编程题_第8张图片

题目三十二:计算字符串中最长的单词的长度,并将其输出

/*
maxLoc:最长单词的起始位置
maxLen:最长单词的长度

wordLoc:当前单词的起始位置
wordLen:当前单词的长度
*/
void main(){
	char str[80];
	int i, maxLoc, maxLen, wordLoc, wordLen;
	//1:键入字符串
	get(str);
	//2:核心代码
	i=0;
	maxLoc=0;
	maxLen=0;
	while(str[i]!='\0'){		
		//找到单词的起始位置,并初始化wordLoc、wordLen
		while(str[i]!=' ') i++;					
		wordLoc=i;
		wordLen=0;
		//计算该单词长度
		while(str[i]!='\0' && str[i]!=' '){				//两个判断一个都不能少
			wordLen++;
			i++;
		}
		//判断当前这个单词长度是否比之前最大的大
		if(wordLen>maxLen){
			maxLoc=wordLoc;
			maxLen=wordLen;
		}
	}
	//3:输出最长单词
	for(i=0; i<maxLen; i++)
		printf("%c",str[maxLoc+i]);
}

题目三十三:判断鞍点(所在行最大,同时在所在列最大)

void main(){
	int i,j,max,maxIndex,arr[2][3]={1,2,3,4,5,6};
	for(i=0; i<2; i++){				//行遍历
		max=0;
		for(j=0; j<3; j++){			//列遍历
			if(arr[i][j]>max)
				max=arr[i][j];
				maxIndex=j;			
		}
		//再次行遍历,找所在列是否存在比他大的元素
		for(j=0; j<2; j++){
			if(arr[j][maxIndex]>max) break;
		}
		//输出鞍点
		if(j>=2) printf("Andian is %d\n",arr[i][maxIndex]);			
	}
}

题目三十四:两线性表的并、交、差

C语言程序设计个人笔记——编程题_第9张图片

你可能感兴趣的:(C语言)