1.学习C语言如何运用指针函数求解一个英语句子中的单词个数。
#include<stdio.h>
#include<ctype.h>
int Number(char *s)
{
int count=0;
while(*s!='\0'){
while(*s==' ')
++s;
if(*s!='\0'){
++count;
while(*s != ' '&& *s != '\0'){
++s;
}
}
}
return count;
}
int main(){
char s[100];
fgets(s,100,stdin);
printf("该字符串的单词个数为:%d",Number(s));
return(0);
}
2.建立信息表
建立10种钢筋的信息表,每种钢筋包括钢筋编号、品种、公称直径、单根长度(mm)、数量、单根重量(Kg)。要求从键盘输入这10种钢筋的信息,并按照每一行显示一种钢筋信息的形式将10种钢筋的信息显示出来,最后汇总总重量。 注:
1、每米的重量(Kg)=0.00617×钢筋的直径(mm)×钢筋的直径(mm),即钢筋重量与直径的平方成正比;
2、品种:HPB235、HPB300、HRB335、HRBF335、HRB400、HRBF400、RRB400、HRB500、HRBF500、HRB600。 输入示例:(重量不输入,需要由其他输入计算)。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 20
// 钢筋结构体
struct Steel {
char id[MAX_LEN]; // 钢筋编号
char type[MAX_LEN]; // 品种
int diameter; // 公称直径
int length; // 单根长度
int num; // 数量
double weight; // 单根重量
};
int main() {
struct Steel steels[3]; // 钢筋数组
double total_weight = 0; // 总重量
// 输入10种钢筋的信息
for (int i = 0; i < 3; i++) {
printf("请输入第%d种钢筋的信息:\n", i + 1);
printf("钢筋编号:");
scanf("%s", steels[i].id);
printf("品种:");
scanf("%s", steels[i].type);
printf("公称直径(mm):");
scanf("%d", &steels[i].diameter);
printf("单根长度(mm):");
scanf("%d", &steels[i].length);
printf("数量:");
scanf("%d", &steels[i].num);
steels[i].weight = 0.00617 * steels[i].diameter * steels[i].diameter * steels[i].length / 1000; // 计算单根重量
total_weight += steels[i].weight * steels[i].num; // 累加总重量
}
// 按照每一行显示一种钢筋信息的形式将10种钢筋的信息显示出来
printf("钢筋编号\t品种\t公称直径(mm)\t单根长度(mm)\t数量\t单根重量(Kg)\n");
for (int i = 0; i < 3; i++) {
printf("%4s\t%10s\t%8d\t%8d\t%d\t%.2f\n", steels[i].id, steels[i].type, steels[i].diameter, steels[i].length, steels[i].num, steels[i].weight); }
// 汇总总重量
printf("总重量为:%.2fKg\n", total_weight);
return 0;
}
3.用c语言怎么解答以下这个问题 已知r(r>=1)属于自然数集S,S的其它元素由以下规则产生:若e属于S那么2e和3e-1也属于S。输入r,按从小到大的顺序输出S中的前20个元素。
#include <stdio.h>
int main()
{
int r, i, j, k, count = 0; //定义变量
int s[20] = {0}; //定义数组,用于存储S中的前20个元素
scanf("%d", &r); //输入r
s[count++] = r; //将r加入数组中
for(i = 0; i < 20; i++) //循环20次,每次找到一个新的元素加入数组中
{
for(j = 0; j <= i; j++) //在已有的元素中查找
{
for(k = 0; k <= i; k++)
{
if(s[j] * 2 == s[i+1] || s[k] * 3 - 1 == s[i+1]) //判断是否符合规则
{
s[count++] = s[i+1]; //将新的元素加入数组中
break;
}
}
if(s[count-1] == s[i+1]) //如果找到了新的元素,跳出循环
{
break;
}
}
}
for(i = 0; i < 20; i++) //输出S中的前20个元素
{
printf("%d ", s[i]);
}
return 0;
}
4.怎么利用指针进行二维数组的上下循环移位呢?
比如数组:
1 2 3
4 5 6
7 8 9
向上循环移位一次变成:
4 5 6
7 8 9
1 2 3
具体步骤如下:
1.定义一个指向二维数组的指针,指向数组的第一行。
2.将第一行的元素保存到一个临时数组中。
3.将数组中的每一行向上移动一行,即将第i行的元素复制到第i-1行。
4.将保存在临时数组中的第一行元素复制到数组的最后一行。
5.重复上述步骤n次,即可实现n次上移。
#include <stdio.h>
#define ROW 3
#define COL 3
void shift_up(int arr[][COL], int n) {
int temp[COL];
int *p = arr[0];
for (int i = 0; i < COL; i++) {
temp[i] = *(p + i);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < ROW - 1; j++) {
for (int k = 0; k < COL; k++) {
arr[j][k] = arr[j + 1][k];
}
}
for (int j = 0; j < COL; j++) {
arr[ROW - 1][j] = temp[j];
temp[j] = arr[0][j];
}
}
}
int main() {
int arr[ROW][COL] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int n = 1;
shift_up(arr, n);
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
5.通用算法设计(上)
3.1 枚举法
枚举法适合于解的候选者是有限、可枚举的场合。
例一:有这样一个算式:ABCD×E=DCBA,其中,A B C D E代表不同的数字。编写一个程序找出A B C D E分别代表的是什么数字。
#include <stdio.h>
int main()
{
int num1,num2,A,B,C,D,E;
for(A=1;A<=9;A++)
for(B=0;B<=9;B++){
if(A==B) continue;
for(C=0;C<=9;C++){
if(C==A || C==B) continue;
for(D=1;D<=9;C++){
if(D==A ||D==B || D==C) continue;
for(E=2;E<=9;E++){
if(E==A || E==B || E==C || E==D) continue;
num1=A*1000+B*100+C*10+D;
num2=D*1000+C*100+B*10+A;
if(num1*E==num2)
printf("%d * %d = %d\n",num1,E,num2);
}
}
}
}
return(0);
}
程序的输出为:2178*4=8712。
这个题目该可以采用求“水仙花”数的方法解题。
例二: 阶梯问题:有一个长阶梯,若每步上两个台阶,最后剩1阶;若每步上三个 台阶,最后剩2阶;若每步上五个台阶,最后剩4阶;若每步上六个台阶,最后剩5阶;若每步上七个台阶,最后正好一阶不剩。编写一个程序,计算该楼梯至少有多少阶。
#include <stdio.h>
int main()
{
int n;
for(n=7; ;n+=7)
if(n%2==1 && n%3==2 && n%5==4 && n%6==5) break;
printf("满足条件的最短的阶梯长度是:%d\n",n);
return(0);
}
在设计一个算法时,要时刻记住提高它的效率。
例三:最长连续子序列和的问题。
#include <stdio.h>
int maxSubsequenceSum(int a[],int size,int *start,int *end);
int main()
{
int a[]={-2,11,-4,13,-5,2};
int b[]={1,-3,4,-2,-1,6};
int sum,start,end;
sum=maxSubsequenceSum(a,6,&start,&end);
printf("{-2,11,-4,13,-5,2}中的最大和值从%d开始到%d结束,和值是%d\n",start,end,sum);
sum=maxSubsequenceSum(b,6,&start,&end);
printf("{1,-3,4,-2,-1,6}中的最大和值从%d开始到%d结束,和值是%d\n",start,end,sum);
return(0);
}
int maxSubsequenceSum(int a[],int size,int *start,int *end)
{
int maxSum=0;
int i,j;
for(i=0;i<size;i++){
int thisSum=0;
for(j=i;j<size;j++){
thisSum+=a[j];
if(thisSum>maxSum){
maxSum=thisSum;
*start=i;
*end=j;
}
}
}
return maxSum;
}
11-4+13=20;
4-2-1+6=7;
3.2 贪婪法
贪婪法也称贪心算法,用于求问题的最优解。
例一:用贪婪法解硬币找零问题。
#include <stdio.h>
#define ONEFEN 1 //壹分
#define TWOFEN 2 //贰分
#define FIVEFEN 5 //伍分
#define ONEJIAO 10 //壹角->拾分
int main()
{
int money;
int onefen=0,twofen=0,fivefen=0,onejiao=0;
printf("输入要找零的钱?(以分为单位)");
scanf("%d",&money);
if(money>=ONEJIAO){
onejiao=money/ONEJIAO;
money%=ONEJIAO;
}
if(money>=FIVEFEN){
fivefen=1;
money -= FIVEFEN;
}
if(money>=TWOFEN){
twofen=money/TWOFEN;
money%=TWOFEN;
}
if(money>=ONEFEN){
onefen=1;
}
printf("1角硬币数:%d\n",onejiao);
printf("5分硬币数:%d\n",fivefen);
printf("2分硬币数:%d\n",twofen);
printf("1分硬币数:%d\n",onefen);
return(0);
}
运行结果如下所示:
该题解法思路:按照贪婪法的思想,需要不断地使用面值最大的硬币。如果找零的值小于最大的硬币值,则尝试第二大的硬币,以此类推。
标签:include,int,必备,++,C语言,案例,printf,steels,钢筋 From: https://blog.51cto.com/u_16174658/8556624