To convert the given natural language description into a functional Gurobi code that solves the optimization problem, we first need to break down the objective function and constraints.

The objective function is:
\[7.18 \times (\text{ham sandwiches} \times \text{bowls of cereal}) + 6.24 \times (\text{bowls of cereal})^2 + 6.71 \times (\text{bowls of cereal} \times \text{black beans})\]

The constraints can be summarized as follows:
1. Protein from ham sandwiches, bowls of cereal, and black beans: 
   - \(8 \times \text{ham sandwiches} + 10 \times \text{bowls of cereal} \geq 26\)
   - \(8 \times \text{ham sandwiches} + 13 \times \text{black beans} \geq 26\)
   - \(10 \times \text{bowls of cereal} + 13 \times \text{black beans} \geq 34\)
   - \(8 \times \text{ham sandwiches} + 10 \times \text{bowls of cereal} + 13 \times \text{black beans} \geq 34\)
2. Other constraints:
   - \(4 \times \text{ham sandwiches} - 3 \times \text{black beans} \geq 0\)
   - \(10 \times \text{bowls of cereal} + 13 \times \text{black beans} \leq 97\)
   - \(8 \times \text{ham sandwiches} + 10 \times \text{bowls of cereal} \leq 78\)
3. Integer constraints:
   - The amount of ham sandwiches, bowls of cereal, and black beans must be whole numbers.

Now, let's write the Gurobi code to represent this optimization problem:

```python
from gurobipy import *

# Create a model
m = Model("Optimization_Problem")

# Define variables
ham_sandwiches = m.addVar(vtype=GRB.INTEGER, name="ham_sandwiches")
bowls_of_cereal = m.addVar(vtype=GRB.INTEGER, name="bowls_of_cereal")
black_beans = m.addVar(vtype=GRB.INTEGER, name="black_beans")

# Objective function
m.setObjective(7.18 * ham_sandwiches * bowls_of_cereal + 6.24 * bowls_of_cereal**2 + 6.71 * bowls_of_cereal * black_beans, GRB.MINIMIZE)

# Constraints
m.addConstr(8 * ham_sandwiches + 10 * bowls_of_cereal >= 26, name="protein_min_1")
m.addConstr(8 * ham_sandwiches + 13 * black_beans >= 26, name="protein_min_2")
m.addConstr(10 * bowls_of_cereal + 13 * black_beans >= 34, name="protein_min_3")
m.addConstr(8 * ham_sandwiches + 10 * bowls_of_cereal + 13 * black_beans >= 34, name="total_protein_min")

m.addConstr(4 * ham_sandwiches - 3 * black_beans >= 0, name="other_constraint_1")
m.addConstr(10 * bowls_of_cereal + 13 * black_beans <= 97, name="protein_max_1")
m.addConstr(8 * ham_sandwiches + 10 * bowls_of_cereal <= 78, name="protein_max_2")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Ham Sandwiches: {ham_sandwiches.x}")
    print(f"Bowls of Cereal: {bowls_of_cereal.x}")
    print(f"Black Beans: {black_beans.x}")
else:
    print("No optimal solution found")
```